部署您的第一个 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 参数的值保存到账户数据中
  • 将消息记录到交易的程序日志中
lib.rs
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
}

构建和部署程序

要构建程序,只需在终端中运行 build。该命令会编译程序。程序的字节码在部署时会存储在一个可执行的程序账户中。

Terminal
$
build

Solana Playground 会更新 declare_id!() 中的地址。此地址表示程序的链上地址(程序 ID)。

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

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

Terminal
$
deploy

您还可以使用左侧面板上的 BuildDeploy 按钮。

构建和部署构建和部署

部署程序后,您可以调用其指令。

测试程序

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

anchor.test.ts
// 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

Terminal
$
test

查看输出以确认测试成功通过。

您还可以使用左侧面板上的 Test 按钮。

运行测试运行测试

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

Terminal
$
solana confirm -v [TxHash]

例如:

Terminal
$
solana confirm -v 3TewJtiUz1EgtT88pLJHvKFzqrzDNuHVi8CfD2mWmHEBAaMfC5NAaHdmr19qQYfTiBace6XUmADvR4Qrhe8gH5uc

您还可以通过在 SolanaFMSolana Explorer 上搜索交易签名(哈希)来查看交易详情。

请记得更新您使用的 Explorer 上的集群(网络)连接,以匹配 Solana Playground。Solana Playground 默认使用 devnet 集群。

关闭程序

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

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

Terminal
$
solana program close [ProgramID]

例如:

Terminal
$
solana program close 2VvQ11q8xrn5tkPNyeraRsPaATdiPx8weLAD8aD4dn2r

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

Is this page helpful?

Table of Contents

Edit Page