LogoAnchor 中文文档
Anchor 中文文档Anchor 更新Release Notes

0.30.0

Anchor - 发布说明 0.30.0

期待已久的 v0.30.0 版本终于发布了!

我们将介绍主要的变化,但如果你想查看所有重要的更改, 请查看 CHANGELOG


如何升级

  1. 更新 avm:

    cargo install --git https://github.com/coral-xyz/anchor --tag v0.30.0 avm --locked
  2. 更新 anchor-cli:

    avm install latest
  3. 将 Anchor crate(s) 更新到 0.30.0。可选地,运行 cargo update 以将 其他依赖项更新到最新的兼容版本。

  4. 将 TS 包(s) 更新到 0.30.0

推荐的 Solana 版本

虽然此版本支持 1.16 以上的所有版本,但推荐的 Solana 版本是 1.18.8。你可以通过运行以下命令升级 Solana 工具:

solana-install init 1.18.8

IDL

IDL 类型规范和生成已被重写。为了保持发布说明的简短,我们不会在这里详细介绍更改,但如果你希望了解更多,请参阅 此链接

idl-build 特性

现在需要在你程序的 Cargo.toml 定义中添加 idl-build 特性,以便 IDL 生成正常工作。

如果没有此特性,anchor build 会输出:

Error: `idl-build` feature is missing. To solve, add

[features]
idl-build = ["anchor-lang/idl-build"]

in `<PATH_TO_CARGO_TOML>`.

请注意,所有用于生成 IDL 类型定义的 crate 都需要在 idl-build 列表中指定,例如 anchor-spl/idl-buildsome-program/idl-build...

Lang

无依赖的程序声明

依赖于使用不同版本 Anchor 的其他 crate 并不是一个很好的体验。为了解决这个问题,现在可以通过新的 declare_program! 宏从 IDL 生成程序客户端:

declare_program!(program_name);

program_name 基于 IDL 文件在 idls 目录中的文件名,例如 idls/program_name.json 必须存在,才能使上述示例正常工作。

这既适用于链上(CPI)也适用于链下(RPC)使用,允许程序交互而不会造成 依赖地狱。查看 此示例 了解链上 CPI 的用法。

更多信息请参见宏的文档

Token extensions

约束

现在有了针对 Token Extensions (Token 2022) 的新账户约束:

  • group_pointer:
    • authority
    • group_address
  • group_member_pointer:
    • authority
    • member_address
  • metadata_pointer:
    • authority
    • metadata_address
  • close_authority
    • authority
  • permanent_delegate:
    • delegate
  • transfer_hook:
    • authority
    • program_id

注意: 上述值与 :: 连接(类似于其他 Anchor 约束)并带有 extensions 前缀,例如 extensions::group_pointer::authority = <EXPR>

这些约束可以在有或没有 init 约束的情况下使用。

这里 是一个使用这些约束的示例程序。

CPI 包装器

anchor-spl 现在包含 Token Extensions 的 CPI 包装器,可以从 anchor_spl::token_2022_extensions 访问。

#[interface] 属性

现在可以使用新的 #[interface] 宏来使用转移钩子。此参数会覆盖 Anchor 的默认指令鉴别器,使用接口指令的鉴别器。

当前支持的值有:

  • spl_transfer_hook_interface::initialize_extra_account_meta_list
  • spl_transfer_hook_interface::execute
mod my_hook_program {
    #[interface(spl_transfer_hook_interface::initialize_extra_account_meta_list)]
    pub fn initialize(ctx: Context<Initialize>, metas: Vec<AnchorExtraAccountMeta>) -> Result<()> {
        /* ... */
    }
 
    #[interface(spl_transfer_hook_interface::execute)]
    pub fn execute(ctx: Context<Execute>, amount: u64) -> Result<()> {
        /* ... */
    }
}

可选的 bump

当一个可选账户未指定时,此版本将可选的 bump 类型更改为 Option<u8>,并将 bump 字段设置为 None,而不是将其默认为 u8::MAX

减少堆分配

BorshSerialize::try_to_vec 实现,在事件、CPI 和返回数据中使用时,每次都会堆分配 1024 字节,即使你的数据要小得多。在此版本中,默认分配设置为 256 字节。

此外,还新增了一个方法 InstructionData::write_to(),可以将数据写入现有分配,而不是使用 InstructionData::data() 创建新的分配。

CLI

CLI 中的优先费用

IDL 命令现在接受 --priority-fee 参数。由于在主网-beta 上不使用优先费用越来越难提交交易,此版本支持为 IDL 命令设置 --priority-fee 参数。例如:

anchor idl erase-authority --program-id <PROGRAM_ID> --priority-fee 9000

当未指定 --priortiy-fee 参数时,将使用最后 150 个确认插槽的中位数费用。

构建时的 --no-idl 标志

IDL 生成需要构建程序,但如果你的程序 API 没有变化,这是不必要的。在这种情况下,你可以使用 --no-idl 标志来构建程序但跳过 IDL 生成:

anchor build --no-idl

IDL 缓冲区在 idl upgrade 后关闭

在 IDL 升级后,缓冲区账户现在会关闭,并将 lamports 退回给 IDL 授权者。

将部署参数传递给 solana-cli

你现在可以通过 anchor deploy 将参数传递给 solana program deploy

anchor deploy -- --final

可验证的部署

类似于可验证的构建,你现在可以部署验证构建而不是默认构建:

anchor deploy --verifiable

接受包名作为程序名

各种命令的 --program-name (-p) 参数现在也适用于程序的包名,而不仅仅是 lib 名(snake_case)。例如:

anchor build -p my-program

停用测试验证器特性

你现在可以从 Anchor.toml 停用测试验证器特性:

[test.validator]
deactivate_feature = ["GDH5TVdbTPUpRnXaRyQqiKUa7uZAbZ28Q2N9bhbKoMLm", "zkiTNuzBKxrCLMKehzuQeKZyLtX2yvFcEKMML8nExU8"]

Crate 和包兼容性

使用不匹配的 anchor-clianchor-lang@coral-xyz/anchor 版本可能会导致意外行为。在此版本中,如果任何版本不匹配,你会收到警告。

显式的 overflow-checks 标志

overflow-checks 标志默认隐式禁用。通过 anchor init 创建的 Anchor 工作区会启用此标志,但是,在初始工作区创建后,Anchor 不会对其进行检查。

在此版本中,需要在工作区 Cargo.toml 中指定 overflow-checks。请注意,“指定”并不意味着启用,你也可以禁用它,但你需要显式地这样做。

Anchor.toml 中的通配符模式

workspace.membersworkspace.exclude 现在支持简单的通配符模式:

[workspace]
members = ["programs/*"]

请注意,支持仅限于这种简单的通配符模式,目前不支持更复杂的 glob 模式。

cargo build-sbf 现在是默认的

在此版本之前,anchor build 使用 cargo build-bpf 来构建程序,但由于它已被弃用,anchor build 现在默认为 cargo build-sbf

要保留旧的行为,你可以使用:

anchor build --arch bpf

在脚本中运行多个命令

Anchor.toml 中的脚本现在支持运行多个命令:

[scripts]
test-all = "cargo test && yarn run ts-mocha tests/**/*.ts"

此脚本将同时运行 cargoyarn 命令:

anchor run test-all

仅测试指定的程序

在多个程序的工作区中,可以使用 --program-name (-p) 参数测试单个程序:

anchor test --program-name example

这将仅构建和测试指定的程序。

Rust 测试模板

如果你使用新的 Rust 测试模板初始化工作区,不会出现 TypeScript 测试:

anchor init --test-template rust

TypeScript

账户解析

账户解析指的是客户端在发送交易时无需手动指定账户即可解析账户的能力。

TypeScript 库中的账户解析逻辑发生了太多变化,然而,我们可以跳过其中的大部分,因为它们大多是内部的。

影响每个人的一个变化是 accounts 方法的更改。尽管 TypeScript 库对账户解析有一定的支持,但它没有类型级别的支持——所有账户本质上都被类型化为部分账户,并且无法知道哪些账户是可解析的,哪些不是。

现在交易构建器有三种方法来指定账户:

  • accounts:此方法现在基于 IDL 中的解析字段完全类型安全,使得只需指定实际需要的账户变得更加容易。
  • accountsPartial:此方法保留旧的行为,并允许你指定所有账户,包括可解析的账户。
  • accountsStrict:如果你不想使用账户解析并手动指定所有账户(保持不变)。

此更改可能会导致你现有的 .accounts() 调用出现错误。要修复,请将 accounts 更改为 accountsPartial,或者从 IDL 中删除所有可解析的账户。例如:

- await program.methods
-   .init()
-   .accounts({
-     pda: ...,
-     signer: ...,
-     systemProgram: ...,
-   })
-   .rpc();
+ await program.methods.init().rpc();

魔法账户名称

另一个影响大多数项目的更改是移除了“魔法”账户名称。TypeScript 库过去会根据名称自动填充常见程序和系统变量账户,例如 systemProgram,但随着 IDL 中引入的 address 字段(用于解析所有程序和系统变量),这已经不再必要。

大小写转换

在 TypeScript 库的内部充满了大小写转换逻辑,然后再进行字符串比较,这也迫使其他构建在 Anchor 之上的库也这样做。

在本版本中,IDL 具有一致的大小写,TypeScript 库还具有一致的大小写(camelCase)。

不再需要 Program ID

programId 参数已从 Program 中移除,因为新的 IDL 需要将程序 id 存储在其 address 字段中:

- new Program(idl, programId);
+ new Program(idl);

可选的 provider 选项

AnchorProvideropts 参数现在是可选的:

- new AnchorProvider(connection, wallet, {});
+ new AnchorProvider(connection, wallet);

类型更改

此版本中有太多类型更改无法一一列出,特别是与 IDL 相关的类型。新的 IDL 类型可以在这里 找到。


查看 CHANGELOG 中的完整更改列表。