本地开发Anchor智能合约:效率翻倍的秘密
前言 本地 anchor 开发环境能解决那些问题:
已经有在线 编辑 anchor 智能合约了,为什么还需要 本地开发环境? 这个也是我刚开始想知道的。后来我试用了一下 发现是真的香! 下面我们来对比下:
✪:我们使用本地开发环境的时候 可以借助 IDE 功能,能在编写状态 看到报错信息。 不用非要 build 才能看到报错信息
✪:可以跳转到 函数的定义,查看函数的方法定义,比如我们想看下
initialize_poll(ctx: Context<InitializePoll>
Content 是个什么东西。在线的是看不了的。本地使用 IDE 很容易就能看到,这对我们代码的编写 学习 和 错误的查找 很是便利。
✪ 打包速度很快,测试 调用不用 sol
- 本地基本上 5秒钟
- 在线 13 秒
✿ 其实我最看重的是 IDE 提供的实时错误提示功能,这对提升代码开发效率大有帮助。接下来我将详细介绍本地开发环境的搭建步骤。
1. solana 本地环境的搭建,主要区分 mac 和 linux;官网文档已经介绍很详细了:
https://solana.com/zh/docs/intro/installation
http://solana 本地环境的搭建因为我这边是 windos 环境,所以走的是 WSL 路线;
我的 windos 打不开应用商店,所以直接 下载的 Ubuntu2204-221101.AppxBundle ,离线安装
走到这里我假定已经安装上 ubuntu 并且所有 依赖了也都安装了:可以查看下面的 安装依赖版本:
- Rust
- Solana
- Anchor
- Node
- Yarn
2. 开发前期的配置
2.1 开发网络 钱包 配置
solana config getConfig File: /home/solana/.config/solana/cli/config.yml RPC URL: https://api.devnet.solana.com WebSocket URL: wss://api.devnet.solana.com/ (computed) Keypair Path: /home/solana/.config/solana/id.json Commitment: confirmed#配置 开发网络 solana config set --url mainnet-beta solana config set --url devnet solana config set --url localhost solana config set --url testnet#配置 开发网络 简写 solana config set -um # For mainnet-beta solana config set -ud # For devnet solana config set -ul # For localhost solana config set -ut # For testnet
2.2 钱包管理
#查看当前钱包的 地址 solana address#创建钱包 solana-keygen new#空投 本地一般 2个, 但是 在线编辑器 一般 5个 solana airdrop 2#钱包查询余额 solana balance
3. solana anchor 项目创建
3.1 anchor 项目的创建
环境安装好了之后, 我们就能创建 anchor 项目了, cd 到我们喜欢的项目 路径
solana@DESKTOP-B2Q44I9:~$ ls anchor-counter enu-project-name learning myproject project# 创建一个 anchor 项目 然后使用ide 打开 anchor init <project-name>
IDE: 我这里使用的是:RustRover 2025.1.3
![]()
Anchor.toml 这个文件 是 anchor 运行环境的配置文件。 这里修改 部署的网络环境 programid
![]()
3.2 编写 和 运行
我们先复制一段代码: 这是一个 计数器功能的脚本
use anchor_lang::prelude::*;// This is your program's public key and it will update // automatically when you build the project. declare_id!("HKvWCsAhzhXRfj8zNhNrofjV3dDjSmm42EguMKK3X5n");#[program] pub mod anchor_counter {use super::*;pub fn initialize(ctx: Context<Initialize>, init_data: u64) -> Result<()> {msg!("initialize from: {:?}", ctx.program_id);//直接给pad 账户复制ctx.accounts.counter.count = init_data;Ok(())}pub fn reset(ctx: Context<UpdateCount>, init_data: u64) -> Result<()> {let counter = &mut ctx.accounts.counter;msg!("increment from: {:?}", ctx.program_id);msg!("previous counter: {:?}", counter.count);counter.count = init_data;//counter.count -= 2;msg!("after counter: {:?}", counter.count);Ok(())}pub fn increment(ctx: Context<UpdateCount>) -> Result<()> {let counter = &mut ctx.accounts.counter;msg!("increment from: {:?}", ctx.program_id);msg!("previous counter: {:?}", counter.count);counter.count = counter.count.checked_add(1).unwrap();//counter.count -= 2;msg!("after counter: {:?}", counter.count);Ok(())}pub fn subtract(ctx: Context<UpdateCount>, count: u64) -> Result<()> {let counter = &mut ctx.accounts.counter;msg!("increment from: {:?}", ctx.program_id);msg!("previous counter: {:?}", counter.count);//counter.count = counter.count.checked_add(1).unwrap();counter.count -= count;msg!("after counter: {:?}", counter.count);Ok(())} }#[derive(Accounts)] pub struct Initialize<'info> {#[account(mut)]// user 调用者 签名者, 是否 mut有权限修改信息pub user: Signer<'info>,// counter 数据账户 pda 派生#[account(init,seeds = [b"counter_seed"],bump,payer = user,space = 8 + 8)]pub counter: Account<'info, Counter>,// 程序账户pub system_program: Program<'info, System>, }#[derive(Accounts)] pub struct UpdateCount<'info> {// user 调用者 签名者pub user: Signer<'info>,#[account(mut)]pub counter: Account<'info, Counter>, }#[account] pub struct Counter {count: u64, }
我们直接 anchor build, 我这边会报错 "
error[E0599]: no method named `source_file` found for struct `proc_macro2::Span` in the current scope"
看样子是生成 IDL json 文件出出错 了。 有两种方式解决:
anchor build --no-idl; 以这种方式打包 但是这种方式不能 有idl.json 文件不可取 anchor-lang = "0.31.1" 升级依赖版本,这样就可以了![]()
3.3 启动 Solana 本地 环境:
如果你要 运行 或者 写测试代码 运行 anchor 只能合约,那么你需要开启本地 solana 环境:
solana-test-validator
这样就能开启一个 本地环境的 solana 运行节点
![]()
然后我们打开 Solana 区块链浏览器。连接到本地环境:
3.4 部署 anchor 智能合约到本地 环境
anchor deploy
复制上面的 hash 在 Solana浏览器 搜索:就能查看到我们部署的智能合约了
这里我们基本上 就可以在本地 开发 和 跑起 Solana anchor 只能合约了,可以进一步提升 开发 Solana智能合约 的效率!