Anchor 0.31.0 版本发布:v1 前的重要更新
anchor ⚓ Solana Sealevel Framework 项目地址: https://gitcode.com/gh_mirrors/an/anchor
概述
Anchor 0.31.0 版本作为 v1 正式版前的最后一个重要更新,带来了多项关键改进和功能增强。本文将详细介绍这个版本的核心变化,帮助开发者更好地理解和升级到新版本。
升级指南
升级步骤
-
首先更新
avm
工具:cargo install avm --force
-
安装新版本 CLI:
avm install 0.31.0
-
更新项目依赖:
- Anchor 相关 crate 更新至 0.31.0
- TypeScript 包更新至 0.31.0
推荐的区块链版本
建议使用区块链2.1.0 版本,这是区块链向 Agave 过渡的特殊版本。可以通过以下命令安装:
sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.0/install)"
核心改进
1. 内存栈优化
Anchor 程序中最容易出现栈违规错误的地方是 try_accounts
函数。0.31.0 版本通过以下方式显著改善了这个问题:
- 将
init
约束代码移动到闭包中,减少栈空间占用 - 使用区块链 v2 后,栈警告变得更加可靠
- 解决了之前版本中可能出现的未定义行为问题
对于开发者而言,这意味着:
- 使用多个
init
约束时更不容易遇到栈问题 - 构建时的栈警告更加准确
- 运行时行为更加可预测
2. 自定义鉴别器
新版本引入了自定义鉴别器功能,解决了以下问题:
- 8字节鉴别器在某些场景下占用过多交易空间
- 无法为非 Anchor 程序实现
Discriminator
trait - 鉴别器不可自定义
- 数据类型名称变更导致鉴别器变化
使用示例:
#[account(discriminator = 1)] // 使用1字节鉴别器
#[event(discriminator = [1, 2])] // 使用数组作为鉴别器
#[instruction(discriminator = MY_CONST)] // 使用常量表达式
3. 实验性 LazyAccount
新增了 LazyAccount
类型,可用于替代 Account
以解决性能问题。需要启用 anchor-lang
的 lazy-account
特性才能使用。
开发工具改进
1. 自动 Agave 过渡
当在配置中指定区块链版本大于 1.18.19 时,会自动切换到 agave-install
:
[toolchain]
blockchain_version = "2.1.0"
2. 包管理器支持
现在可以自由选择包管理器,在 Anchor.toml
中配置:
[toolchain]
package_manager = "npm" # 可选 npm/yarn/pnpm
3. 测试优化
新增了 --no-idl
标志,当程序变更但不影响 API 时可以跳过 IDL 构建:
anchor test --no-idl
4. 新增测试模板
可以使用新的 mollusk 测试模板初始化项目:
anchor init my-program --test-template mollusk
开发者体验提升
1. 指令条件编译
现在可以在指令上使用 cfg
属性:
#[program]
mod my_program {
#[cfg(feature = "my-feature")]
pub fn my_feature(ctx: Context<MyFeature>) -> Result<()> {}
}
2. 账户解析改进
使用 declare_program!
可以方便地解析任何程序账户:
declare_program!(my_program);
// 然后使用
my_program::utils::Account::try_from_bytes
3. TypeScript 改进
- 简化了
Program
构造方式 - 改进了错误信息,包含更多上下文
- 增强了类型推断,减少
@ts-ignore
使用 - 改进了交易确认机制
总结
Anchor 0.31.0 版本为即将到来的 v1 版本奠定了坚实基础,主要改进包括:
- 显著的内存栈优化,提高程序稳定性
- 灵活的自定义鉴别器功能
- 开发工具链的多项增强
- 开发者体验的全面提升
建议所有 Anchor 开发者尽快升级到这个版本,为未来的 v1 升级做好准备。升级过程中如遇到任何问题,可以参考详细的变更日志或社区讨论。
anchor ⚓ Solana Sealevel Framework 项目地址: https://gitcode.com/gh_mirrors/an/anchor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考