部署您的第一个 Solana 程序
在本节中,您将使用 Anchor 框架构建、部署和测试一个简单的 Solana 程序(智能合约)。完成后,您将成功将第一个程序部署到 Solana 区块链。
本节的目的是让您熟悉 Solana Playground。本指南在“程序派生地址 (PDA)”和“跨程序调用 (CPI)”部分中提供了更详细的示例。有关更多详细信息,请参阅 Solana 上的程序 页面。
创建 Anchor 项目
首先,在新浏览器标签页中打开 https://beta.solpg.io。
-
点击左侧面板中的“Create a new project”按钮。
-
输入项目名称,选择 Anchor 作为框架,然后点击“Create”按钮。
新项目
您将看到一个新项目已创建,其中包含程序代码,位于 src/lib.rs
文件中。
这个基本的 Solana 程序会创建一个新账户并在其中存储一个数字。该程序包含一个指令 (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
。该命令会编译程序。程序的字节码在部署时会存储在一个可执行的程序账户中。
$build
Solana Playground 会更新 declare_id!()
中的地址。此地址表示程序的链上地址(程序 ID)。
构建程序后,在终端中运行
deploy
,将程序部署到网络(默认为 devnet)。程序部署需要为存储程序的链上账户分配 SOL。
在部署之前,请确保您有足够的 SOL。您可以通过在 Playground 终端中运行
solana airdrop 5
或使用 Web Faucet
获取 devnet 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
。
$test
查看输出以确认测试成功通过。
您还可以使用左侧面板上的 Test
按钮。
运行测试
然后,您可以通过运行 solana confirm -v
命令并指定测试输出中的交易哈希(签名)来查看交易日志:
$solana confirm -v [TxHash]
例如:
$solana confirm -v 3TewJtiUz1EgtT88pLJHvKFzqrzDNuHVi8CfD2mWmHEBAaMfC5NAaHdmr19qQYfTiBace6XUmADvR4Qrhe8gH5uc
您还可以通过在 SolanaFM 或 Solana Explorer 上搜索交易签名(哈希)来查看交易详情。
请记得更新您使用的 Explorer 上的集群(网络)连接,以匹配 Solana Playground。Solana Playground 默认使用 devnet 集群。
关闭程序
最后,关闭程序可以完全回收分配给链上程序的 SOL。
您可以通过运行以下命令并指定在 declare_id!()
中找到的程序地址来关闭程序:
$solana program close [ProgramID]
例如:
$solana program close 2VvQ11q8xrn5tkPNyeraRsPaATdiPx8weLAD8aD4dn2r
恭喜您!您刚刚使用 Anchor 框架构建并部署了您的第一个 Solana 程序。
Is this page helpful?