Anchor Hello World 开发
Anchor 是 Solana 的合约的开发框架, 开发语言是 rust, 不熟悉的同学可以查阅Rust 基础.
现在让我们通过构建和部署 Hello World! 程序来进行练习。
我们将在本地完成所有操作,包括部署到本地测试验证器。在开始之前,请确保你已经安装了 Rust 和 Solana CLI。如果你还没有安装,请参考概述中的说明进行设置。
1. Anchor 安装
这里是Anchor
的安装官方指南.
按照步骤安装好 Anchor
。安装完成后执行anchor --version
检测时候完成.
anchor --version
anchor-cli 0.29.0
执行命令anchor --help
学习常用命令
anchor --help
2. 创建 Anchor 项目
执行anchor init anchor-solana-hello
anchor init anchor-solana-hello
3. 开始 coding
修改programs/anchor-solana-hello/src/lib.rs
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
命令。
solana config set --url localhost
接下来,使用solana config get
命令检查Solana CLI
配置是否已更新。
solana config get
最后,运行本地测试验证器。在一个单独的终端窗口中运行solana-test-validator
命令。只有当我们的RPC URL
设置为localhost
时才需要这样做。
solana-test-validator
TIP
这里一定要注意 ⚠️,solana-test-validator
这个命令启动的是 solana 的本地测试验证器。
5. 构建和部署
我们现在准备好构建和部署我们的程序了。通过运行 cargo build-sbf
命令来构建程序。
anchor build
现在让我们部署我们的程序。执行anchor deploy
,如果需要指定合约时,使用-p
参数指定。
anchor deploy -p anchor-solana-hello
6. 启动日志监控
在我们调用程序之前,打开一个单独的终端并运行solana logs
命令。这将允许我们在终端中查看程序日志。
solana logs <PROGRAM_ID>
6. 调用合约
在项目的根目录创建test
目录,然后在test
目录中执行npm init
,并且安装@solana/web3.js
mkdir test
cd test
npm init
npm install @solana/web3.js
编写调用代码
新建文件 test/index.js
, 其中PROGRAM_ID
替换为部署合约的地址
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();