Skip to main content

Anchor 合约框架实现 - hello, World 🌍 With PDA

让我们通过构建和部署 Hello World! 程序来进行练习。

我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保你已经安装了RustSolana CLI。如果你还没有安装,请参考概述中的说明进行设置。

0. Anchor 安装

这里是Anchor安装官方指南.

需要你按照步骤安装好 Anchor

安装完成后我们可以通过执行下面的命令,检测 Anchor 是否安装完成✅。

anchor --version
anchor --version
anchor-cli 0.28.0

1. 创建一个新的Rust项目

让我们从创建一个新的Rust项目开始。运行下面的anchor init <you-project-name>命令。随意用你自己的目录名替换它。

anchor init hello_world

2. 编写你的程序

接下来,使用下面的Hello World!程序更新hello_world/program/src/lib.rs。当程序被调用时,该程序会将传入的数据保存到数据存储账户中去也就是下面的HelloWorld账户。

use anchor_lang::prelude::*;

declare_id!("22sSSi7GtQgwXFcjJmGNNKSCLEsiJxyYLFfP3CMWeMLj");

#[program]
pub mod hello_world {
use super::*;

pub fn initialize(ctx: Context<Initialize>, data: String) -> Result<()> {

msg!("{}", data);

*ctx.accounts.hello_world = HelloWorld {
authority: *ctx.accounts.authority.key,
data,
};

Ok(())
}

pub fn update(ctx: Context<UpdateHelloWorld>, data: String) -> Result<()> {
ctx.accounts.hello_world.data = data;
msg!("{}", ctx.accounts.hello_world.data);
Ok(())
}
}

#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = authority,
space = 8 + HelloWorld::INIT_SPACE,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
pub system_program: Program<'info, System>,
}

#[derive(Accounts)]
pub struct UpdateHelloWorld<'info> {
#[account(
mut,
seeds = [b"hello-world"],
bump
)]
pub hello_world: Account<'info, HelloWorld>,
#[account(mut)]
pub authority: Signer<'info>,
}

#[account]
#[derive(InitSpace)]
pub struct HelloWorld {
pub authority: Pubkey,
#[max_len(100)]
pub data: String,
}

#[error_code]
pub enum ErrorCode {
#[msg("You are not authorized to perform this action.")]
Unauthorized,
#[msg("Cannot get the bump.")]
CannotGetBump,
}

下面这是一个本地的测试脚本文件,用来调用上面的合约程序。

import * as anchor from "@coral-xyz/anchor";
import { Program } from "@coral-xyz/anchor";
import { HelloWorld } from "../target/types/hello_world";

describe("hello-world", () => {
let provider = anchor.AnchorProvider.env();
// Configure the client to use the local cluster.
anchor.setProvider(provider);

const program = anchor.workspace.HelloWorld as Program<HelloWorld>;

const authority = provider.wallet.publicKey;

let [helloWorld] = anchor.web3.PublicKey.findProgramAddressSync(
[Buffer.from("hello-world")],
program.programId
);

it("Is initialized!", async () => {
// Add your test here.
const tx = await program.methods.initialize("Hello World!").accounts({
helloWorld,
authority,
systemProgram: anchor.web3.SystemProgram.programId,
}).rpc();

console.log("tx signature: ", tx);

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);

});

it("get hello world!", async () => {

// Add your test here.
const tx = await program.methods.update("Davirain").accounts({
helloWorld,
}).rpc();

console.log("tx signature: ", tx);


// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});


it("read account name", async () => {

// Fetch the state struct from the network.
const accountState = await program.account.helloWorld.fetch(helloWorld);
console.log("account state: ", accountState);
});
});

3. 运行本地测试验证器

在编写好你的程序之后,让我们确保我们的Solana CLI配置指向本地主机,使用solana config set --url命令。

solana config set --url localhost

接下来,使用solana config get命令检查Solana CLI配置是否已更新。

solana config get

最后,运行本地测试验证器。在一个单独的终端窗口中运行solana-test-validator命令。只有当我们的RPC URL设置为localhost时才需要这样做。

solana-test-validator
caution

这里一定要注意⚠️,solana-test-validator 这个命令启动的是solana的本地测试验证器。

4. 构建和部署

我们现在准备好构建和部署我们的程序了。通过运行 anchor build 命令来构建程序。

anchor build

现在让我们部署我们的程序。

anchor deploy

Solana程序部署将输出你的程序的程序ID。你现在可以在Solana Explorer上查找已部署的程序(对于localhost,请选择“自定义RPC URL”作为集群)。

5. 查看程序日志

在我们调用程序之前,打开一个单独的终端并运行solana logs命令。这将允许我们在终端中查看程序日志。

solana logs <PROGRAM_ID>

或者也可以通过Solana Exporer,查看产生的日志📔。

在测试验证器仍在运行时,尝试使用此处的客户端脚本调用你的程序。

这将返回一个Solana Explorer的URL(Transaction https://explorer.solana.com/tx/${transactionSignature}?cluster=custom)。将URL复制到浏览器中,在Solana Explorer上查找该交易,并检查程序日志中是否打印了Hello, world!。或者,你可以在运行solana logs命令的终端中查看程序日志。

就是这样!你刚刚在本地开发环境中创建并部署了你的第一个程序。