当前位置: 首页 > news >正文

区块链日记5 - Solana入门 - 部署第一个Solana程序

在本节中,您将使用 Anchor 框架构建、部署和测试一个简单的 Solana 程序(智能合约)。一步一步跟着我来,将完成第一个程序部署到 Solana 区块链上。

目录

1.创建 Anchor 项目

2.构建和部署程序

3.测试程序

4.关闭程序


本节的目的是让您熟悉 Solana Playground。本指南介绍了程序派生地址 (PDA) 和跨程序调用 (CPI) 部分中的更详细示例。有关更多详细信息,请参阅 Solana 上的程序页面。

1.创建 Anchor 项目

首先,在新的浏览器选项卡中打开 https://beta.solpg.io。

单击左侧面板上的 “Create a new project” 按钮。

输入项目名称,选择 Anchor 作为框架,然后单击 “Create” 按钮。

您将在 src/lib.rs 文件中看到一个使用程序代码创建的新项目。

这个基本的 Solana 程序会创建一个新帐户并在其中存储一个数字。该程序包含一个指令 (initialize),该指令将 u64 数字作为输入,创建一个新帐户,并将该数字保存在该帐户的数据中。当您调用该指令时,它还会将一条消息记录到事务的程序日志中。

(我把它的内容贴下来:)

use anchor_lang::prelude::*;

// This is your program's public key and it will update
// automatically when you build the project.
declare_id!("11111111111111111111111111111111");

#[program]
mod hello_anchor {
    use super::*;
    pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {
        ctx.accounts.new_account.data = data;
        msg!("Changed data to: {}!", data); // Message will show up in the tx logs
        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize<'info> {
    // We must specify the space in order to initialize an account.
    // First 8 bytes are default account discriminator,
    // next 8 bytes come from NewAccount.data being type u64.
    // (u64 = 64 bits unsigned integer = 8 bytes)
    #[account(init, payer = signer, space = 8 + 8)]
    pub new_account: Account<'info, NewAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
}

#[account]
pub struct NewAccount {
    data: u64
}

 解释:

declare_id!macro 指定程序的链上地址。Solana Playground 会在您下一步构建程序时自动更新此地址。

declare_id!("11111111111111111111111111111111");

 

#[program] 属性对包含表示程序指令的函数的模块进行注释。

#[program]
mod hello_anchor {
    use super::*;
    pub fn initialize(ctx: Context<Initialize>, data: u64) -> Result<()> {
        ctx.accounts.new_account.data = data;
        msg!("Changed data to: {}!", data); // Message will show up in the tx logs
        Ok(())
    }
}

在此示例中,initialize 指令采用两个参数:

1.ctx: Context<Initialize> - 将此指令所需的帐户传递给函数,如 Initialize 结构中所指定。

2.data: u64 - 调用指令时必须提供的自定义参数。

函数体将 new_account 的 data 字段设置为提供的 data 参数,然后将消息打印到程序日志中。

#[derive(Accounts)]
pub struct Initialize<'info> {
    #[account(init, payer = signer, space = 8 + 8)]
    pub new_account: Account<'info, NewAccount>,
    #[account(mut)]
    pub signer: Signer<'info>,
    pub system_program: Program<'info, System>,
}

该 #[derive(Accounts)] 属性定义了一个结构体,该结构体指定特定指令所需的账户,其中每个字段代表一个单独的账户。

Anchor通过字段类型(例如Signer<'info>)和约束(例如#[account(mut)])自动处理与帐户验证相关的常见安全检查。

(简单来说,就是有个结构体,能创建账户,并且里面能校验)

#[account] 属性定义了一个结构体,该结构体表示此程序创建和拥有的账户的数据类型。

 

#[account]
pub struct NewAccount {
  data: u64
}

2.构建和部署程序

要构建程序,只需在终端中运行 build 即可。

(构建成功)

Solana Playground 更新了 declare_id 年的地址 !().此地址代表您的程序的链上地址(程序 ID)。

(如图所示!)

 构建程序后,在终端中运行 deploy,将程序部署到网络(默认为 devnet)。程序部署需要将 SOL 分配给存储程序的链上账户。

(进度条在动!)

(部署完成,会弹出一个链接,点开后看到部署详情)

在部署之前,请确保您有足够的 SOL。您可以通过在 Playground 终端中运行 solana airdrop 5 或使用 空投。

您还可以使用左侧面板上的 Build (构建 ) 和 Deploy (部署) 按钮。

3.测试程序

起始代码包括一个位于 tests/anchor.test.ts 中的测试文件。此文件演示如何从客户端调用程序上的 initialize 指令。

 (我把它贴下来:)

// No imports needed: web3, anchor, pg and more are globally available

describe("Test", () => {
  it("initialize", async () => {
    // Generate keypair for the new account
    const newAccountKp = new web3.Keypair();

    // Send transaction
    const data = new BN(42);
    const txHash = await pg.program.methods
      .initialize(data)
      .accounts({
        newAccount: newAccountKp.publicKey,
        signer: pg.wallet.publicKey,
        systemProgram: web3.SystemProgram.programId,
      })
      .signers([newAccountKp])
      .rpc();
    console.log(`Use 'solana confirm -v ${txHash}' to see the logs`);

    // Confirm transaction
    await pg.connection.confirmTransaction(txHash);

    // Fetch the created account
    const newAccount = await pg.program.account.newAccount.fetch(
      newAccountKp.publicKey
    );

    console.log("On-chain data is:", newAccount.data.toString());

    // Check whether the data on-chain is equal to local 'data'
    assert(data.eq(newAccount.data));
  });
});

部署程序后,要运行测试文件,请在终端中运行 test

(结果如下:)

查找确认测试成功通过的输出。

还可以使用 Test (测试 ) 左侧面板上的按钮。

 然后,您可以通过运行 solana confirm -v 来查看交易日志 命令并从测试输出中指定交易哈希(签名):

solana confirm -v [TxHash]

您还可以查看交易详情 SolanaFM 或 Solana Explorer 通过搜索交易签名(哈希)进行搜索。

请记住在用于匹配 Solana Playground 的 Explorer 上更新集群(网络)连接。Solana Playground 默认使用 devnet 集群。

4.关闭程序

最后,关闭程序可以完全恢复分配给链上程序的 SOL。

您可以通过运行以下命令并指定在 declare_id 中找到的程序地址来关闭程序 !()

solana program close [ProgramID]

(余额已经恢复!)

 

Congratulations!

恭喜你!刚刚使用 Anchor 框架构建并部署了您的第一个 Solana 程序。 

参考:链接

相关文章:

  • php怎么做网站程序站长工具seo优化建议
  • 多语言外贸网站济南头条今日新闻
  • 牟长青 做网站推广的四个基本要点网络销售推广公司
  • 完善政府门户网站建设网站优化名词解释
  • wordpress添加图标广州seo网站排名
  • 网站建设技术合作合同书如何接广告赚钱
  • 23种设计模式-行为型模式-命令
  • ubuntu22使用TrinityCore搭建魔兽世界服务器
  • 【计算机网络】Linux配置SNAT/DNAT策略
  • G-Retriever: 用于文本图理解与问答的检索增强生成
  • LeetCode算法题(Go语言实现)_31
  • 基于LSTM的文本分类2——文本数据处理
  • 数据流和重定向
  • 250405-VSCode编辑launch.json实现Debug调试Open-WebUI
  • 数据库原理
  • [题解]2025HDU春季联合(五) - 小凯逛超市
  • JAX、Flax 和 PyTorch 之间的类比关系
  • 【doris】在线事务处理
  • Chapter07_图像压缩编码
  • 苍穹外卖Day2
  • 文件操作(C语言)
  • 蓝桥云客---蓝桥速算
  • 网络安全L2TP实验
  • 对状态模式的理解
  • 14.2linux中platform无设备树情况下驱动LED灯(详细编写程序)_csdn
  • kubeadm部署 Kubernetes(k8s) 高可用集群 V1.28.2