部署您的第一个 Solana 程序
使用 Anchor 框架将您的第一个 程序 构建、部署并测试到 Solana 区块链。本指南将帮助您熟悉 Solana Playground,并为您使用程序派生地址 (PDA) 和跨程序调用 (CPI) 做好准备。
创建 Anchor 项目
- 在您的网页浏览器中打开 Solana Playground
- 在左侧面板中,点击 + 创建新项目
- 输入一个 项目名称
- 选择 Anchor (Rust) 作为框架
- 点击 创建
新项目
src/lib.rs
源文件将打开。它包含一个名为 Initialize
的结构体,该结构体执行以下操作:
- 接收一个名为
data: u64
的必需参数 - 创建一个新账户
- 将
data: 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 logsOk(())}}#[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}
构建并部署程序
- 编译程序代码
$build
您的 程序 ID,定义在
declare_id!()
中,现在将被更新。
- 向您的钱包添加 SOL(可选)
部署程序需要在程序的链上账户中有 SOL。如果需要,在继续第 3 步之前,向您的钱包添加 SOL。
- 将程序部署到网络
$deploy
部署后,程序的字节码将存储在一个可执行的程序账户中。
注意: 如果您愿意,可以使用左侧面板中的 Build 和 Deploy 按钮,如下图所示。
构建和部署
测试程序
- 打开名为
tests/anchor.test.ts
的测试文件。此文件演示了如何从客户端调用程序的initialize
结构体。
// No imports needed: web3, anchor, pg and more are globally availabledescribe("Test", () => {it("initialize", async () => {// Generate keypair for the new accountconst newAccountKp = new web3.Keypair();// Send transactionconst 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 transactionawait pg.connection.confirmTransaction(txHash);// Fetch the created accountconst 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
- 存储输出中包含的交易哈希 (
TxHash
)
(在上面的示例中,交易哈希为
3TewJtiUz1EgtT88pLJHvKFzqrzDNuHVi8CfD2mWmHEBAaMfC5NAaHdmr19qQYfTiBace6XUmADvR4Qrhe8gH5uc
。)
注意: 如果需要,可以使用左侧面板上的 Test
按钮。
运行测试
- 运行
solana confirm -v [TxHash]
查看交易日志
$solana confirm -v 3TewJtiUz1EgtT88pLJHvKFzqrzDNuHVi8CfD2mWmHEBAaMfC5NAaHdmr19qQYfTiBace6XUmADvR4Qrhe8gH5uc
- 查看交易详情
打开 SolanaFM 或 Solana Explorer,并搜索交易哈希。
Solana Explorer: 将网络集群设置为 devnet
,以匹配 Solana Playground
的网络。
关闭程序
关闭程序以回收分配给链上程序的 SOL。为此,请运行
solana program close [ProgramID]
,使用存储在 declare_id!()
宏中的程序地址。
$solana program close 2VvQ11q8xrn5tkPNyeraRsPaATdiPx8weLAD8aD4dn2r
程序 只能 由具有升级权限的账户关闭或更新。当程序部署时,您的 Playground 钱包会自动成为每个程序的升级权限账户。如果升级权限被撤销,程序将变为不可更改。
恭喜!您已使用 Anchor 构建并部署了您的第一个 Solana 程序。
下一步
Is this page helpful?