Skip to content

Anchor Hello World 开发

Anchor 是 Solana 的合约的开发框架, 开发语言是 rust, 不熟悉的同学可以查阅Rust 基础.

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

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

1. Anchor 安装

这里是Anchor安装官方指南.

按照步骤安装好 Anchor。安装完成后执行anchor --version检测时候完成.

sh
anchor --version
anchor-cli 0.29.0

执行命令anchor --help学习常用命令

sh
anchor --help

2. 创建 Anchor 项目

执行anchor init anchor-solana-hello

sh
anchor init anchor-solana-hello

3. 开始 coding

修改programs/anchor-solana-hello/src/lib.rs

rust
use anchor_lang::prelude::*;

declare_id!("2vVfyxWYozJE5ePd7rnq9Wjd2gqiufzq6oh84WckKipE");

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

    pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
        msg!("Hello, world!");
        Ok(())
    }
}

#[derive(Accounts)]
pub struct Initialize {}

4. 运行本地测试验证器

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

bash
solana config set --url localhost

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

bash
solana config get

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

bash
solana-test-validator

TIP

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

5. 构建和部署

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

bash
anchor build

现在让我们部署我们的程序。执行anchor deploy,如果需要指定合约时,使用-p参数指定。

bash
anchor deploy -p anchor-solana-hello

6. 启动日志监控

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

bash
solana logs <PROGRAM_ID>

6. 调用合约

在项目的根目录创建test目录,然后在test目录中执行npm init,并且安装@solana/web3.js

bash
mkdir test
cd test
npm init
npm install @solana/web3.js

编写调用代码

新建文件 test/index.js, 其中PROGRAM_ID替换为部署合约的地址

javascript
const Web3 = require("@solana/web3.js");

const PROGRAM_ID = new Web3.PublicKey(
  "2vVfyxWYozJE5ePd7rnq9Wjd2gqiufzq6oh84WckKipE" // 这里替换为部署合约的地址
);
const connection = new Web3.Connection("http://localhost:8899", "confirmed");

async function initializeKeypair() {
  const signer = Web3.Keypair.generate();
  const airdropSignature = await connection.requestAirdrop(
    signer.publicKey,
    Web3.LAMPORTS_PER_SOL
  );

  const latestBlockhash = await connection.getLatestBlockhash();

  await connection.confirmTransaction({
    blockhash: latestBlockhash.blockhash,
    lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
    signature: airdropSignature,
  });

  const newBalance = await connection.getBalance(signer.publicKey);
  console.log("New balance is", newBalance / Web3.LAMPORTS_PER_SOL, "SOL");
  return signer;
}

async function callHelloworld() {
  const signer = await initializeKeypair();
  const transaction = new Web3.Transaction();
  const instruction = new Web3.TransactionInstruction({
    keys: [],
    programId: PROGRAM_ID,
  });
  transaction.add(instruction);
  const signature = await Web3.sendAndConfirmTransaction(
    connection,
    transaction,
    [signer]
  );
  console.log(`Transaction: ${signature}`);
}

callHelloworld();