本文档记录了 Anchor 项目的所有显著更改,从最早版本到最新版本,详细列出了每个版本的新增功能、修复的错误以及重大更改,方便开发者了解 Anchor 框架的演变和升级过程。
此项目的所有重要更改都将记录在此文件中。
格式基于 Keep a Changelog, 并且此项目遵循 Semantic Versioning。
注意: 语义化版本 0 的处理方式与 1 及以上版本不同。 次版本将在出现重大更改时递增,补丁版本将在新增功能时递增。
Provider
在账户解析器中需要 publicKey 而不是 wallet (#3613)backpackapp/build
Docker 镜像替换为 solanafoundation/anchor
(#3619).solana_account_decoder
依赖在 anchor client 中公开 (#3455).Provider.sendAndConfirm
添加可选的 options.blockhash
(#3070).Program.addEventListener
添加可选的 commitment
参数 (#3052).cargo
参数传递给 IDL 生成 (#3059).idl-build
功能不正确用法的检查 (#3061).prelude
导出 Discriminator
trait (#3075).Account
实用工具类型,用于从字节获取账户 (#3091).declare_program!
中添加非 8 字节 discriminator 支持 (#3103).ThreadSafeSigner
trait 公开 (#3107).dispatch
函数以支持动态 discriminators (#3104).try_entry
函数中的 fallback 函数快捷方式 (#3109).withdraw_withheld_tokens_from_accounts
指令 (#3128).Provider
接口添加可选的 wallet
属性 (#3130).anchor-spl/idl-build
,则发出警告 (#3133).mock
功能添加 internal_rpc
方法 (#3135).#[instruction]
属性 proc-macro 以覆盖默认的指令 discriminators (#3137).#[account]
中硬编码 (#3144).#[account]
属性添加 discriminator
参数 (#3149).#[event]
属性添加 discriminator
参数 (#3152).test
命令添加 --no-idl
选项 (#3175).burn_checked
、mint_to_checked
和 approve_checked
指令 (#3186).solana_version
>= 1.18.19
时,迁移到 agave-install
(#3185).IdlBuilder
(#3188).clean
命令也删除 .anchor
目录 (#3192).#[interface]
属性 (#3195).LazyAccount
(#3194).use
命令未安装的版本 (#3230).solana-program
依赖项,则发出警告 (#3250).idl build
命令时是否存在 idl-build
功能 (#3273).idl build
命令时,如果只有一个程序,则构建 IDL (#3275).idl build
命令添加短别名 (#3283).idl convert
命令添加 --program-id
选项 (#3309).declare_program!
中常量的文档 (#3311).install
和 list
命令添加短别名 (#3326).init
命令中添加可选的 package-manager
标志,以在 Anchor.toml 中设置包管理器字段 (#3328).zero
约束冲突的账户 discriminators (#3365).deploy
命令添加新的 --max-retries
选项 (#3354).anchor-debug
功能 (#3511).declare-program!
中的 align
repr 支持 (#3056).getrandom
依赖 (#3072).InitSpace
支持未命名和单元结构体 (#3084).owner
约束与 Box
ed 账户一起使用的问题 (#3087).--no-idl
选项,则跳过 IDL 检查 (#3093).time
crate 问题,使用 Rust v1.80 的 --locked
参数进行安装的问题 (#3143).crypto-hash
依赖 (#3171).view
方法的错误消息 (#3177).arrayref
依赖 (#3201).address
约束与非常量表达式一起使用的问题 (#3216).Program
一起使用的问题 (#3228).init
约束使用闭包,以减少 try_accounts
的堆栈使用量 (#2939).cfg
属性 (#2339).ANCHOR_LOG
记录输出,并改进构建错误消息 (#3284).declare_program!
时的常量字节声明 (#3287).declare_program!
一起使用的问题 (#3290).engines.node
到 >= 17
(#3301).rustc 1.79.0
(#3315).shell
命令失败的问题 (#3351).cpi
功能指令未考虑 discriminator 覆盖的问题 (#3376).verify
期间进行额外的 IDL 生成 (#3398).zero
账户是唯一的 (#3409).init
账户删除重复的 zero
账户 (#3422).provider.cluster
的问题 (#3428).workspace
加载名称中带有数字的程序的问题 (#3450).declare_program!
中获取 IDL 时可能发生的 panic (#3458).program::seed
解析 (#3474).declare_program!
中向类型别名定义添加 derive
和 repr
的问题 (#3504).std::process::exit
的用法 (#3544).Pubkey
常量与 seeds::program
一起使用的问题 (#3559).declare_program!
时,没有账户的指令导致编译错误的问题 (#3567).seeds::program
的问题 (#3570).declare_program!
中使用 data
作为指令参数名称的问题 (#3574).anchor.workspace
模板中使用 camelCase 作为程序名称 (#3581).hash
功能中的 bpf
目标支持 (#3078).async
功能向 RequestBuilder
添加 tokio
支持 (#3057).EventData
trait (#3083).async_rpc
方法 (#3053).zero
约束时,需要 Discriminator
trait 实现 (#3118).DISCRIMINATOR_SIZE
常量 (#3120).#[account]
属性参数不再将标识符解析为命名空间 (#3140).token_program_id
重命名为 program_id
(#3076).Discriminator
trait 中移除 discriminator
方法 (#3163).node
升级到 20.16.0 LTS (#3179).Program
构造函数的 idl
参数类型更改为 any
(#3181).borsh 0.9
支持 (#3199).typescript
升级到 5.5.4
并移除 SimulateResponse
的泛型参数 (#3221).StateCoder
(#3224).warp_slot
的整数 (#3235).EventIndex
(#3244).dex
功能 (#3257).typescript
版本升级到 v5 (#3480).snake-case
依赖 (#3507).RUSTUP_TOOLCHAIN
环境变量覆盖 idl 构建工具链 (#2941).AVM_HOME
环境变量自定义安装位置 (#2917).avm list
当达到 GitHub API 速率限制时 (#2962)init
命令添加 --no-install
选项 (#2945).Error
实现 TryFromIntError
以便能够传播整数转换错误 (#2950).upgrade
命令添加额外的 solana 参数 (#2998).spl-associated-token-account
crate (#2999).declare_program!
的 legacy IDL (#2997).idl convert
命令 (#3009).idl type
命令 (#3017).anchor_lang::pubkey
宏,用于声明 Pubkey
const 值 (#3021).anchor-syn
依赖 (#3030).declare_id!
和 declare_program!
添加程序 ID 的 const
(#3019).AnchorProvider.send*()
方法中不正确的 maxSupportedTransactionVersion
(#2922).anchor init
创建的新项目使用 npm 配置的默认许可证 (#2929).Cargo.lock
的路径解析 (#2946).declare_program!
的指令参数中使用定义的类型 (#2959).declare_program!
一起使用的问题 (#2965).Vec<u8>
类型与 declare_program!
一起使用的问题 (#2966).ProgramError::ArithmeticOverflow
错误 (#2975).declare_program!
一起使用的问题 (#2967).declare_program!
的指令返回类型生成 (#2977).unexpected_cfgs
构建警告 (#2992).declare_program!
中公开 (#2994).rust-version
(#3000).address
约束与字段表达式一起使用的问题 (#3034).bytemuckunsafe
账户序列化与 declare_program!
一起使用的问题 (#3037).有关如何更新的高级概述,请参阅 Anchor 0.30 发行说明。
init
和 new
(#2698).deploy
时添加可验证选项 (#2705).anchor deploy
将参数传递给底层 solana program deploy
命令的支持 (#2709).InstructionData::write_to
实现 (#2733).#[interface(..)]
属性 (#2728)..interface(..)
方法 (#2728).anchor-lang
和 CLI 版本的兼容性 (#2753).idl close
接受可选的 --idl-address
参数 (#2760).workspace.members
和 workspace.exclude
中简单通配符模式的支持。(#2785).init
命令添加 --test-template
选项 (#2805).anchor test
能够运行多个命令 (#2799).@coral-xyz/anchor
包和 CLI 版本的兼容性 (#2813).repr
的支持 (#2824).accountsPartial
方法以保持旧的 accounts
方法行为 (#2824).AnchorProvider
构造函数的 opts
参数变为可选 (#2843).build
命令添加 --no-idl
标志 (#2847).preInstructions
方法添加 prepend
选项 (#2863).declare_program!
宏 (#2857).solana-test-validator
配置添加 deactivate_feature
标志 (#2872).docs
字段 (#2887).Event
实用程序类型以从字节获取事件 (#2897).Lamports
特征操作返回溢出错误 (#2907).Hash
添加缺失的 new_from_array
方法 (#2682).resolver = "2"
) (#2676).Anchor.toml
中使用用户特定路径作为 provider.wallet
的问题 (#2696).anchor_version
覆盖 (#2704).shmem
特性时的编译问题 (#2722).localhost
更改为 127.0.0.1
,NodeJS 17 IP 解析更改为 IPv6 (#2725).try_to_vec
的情况,以减少堆内存的使用 (#2744)ts-node
安装的情况下 migrate
命令无法工作的问题 (#2767).parse_logs_response
以防止在日志中存在超过 1 个外部指令时发生 panic (#2856).ahash
导致的 stdsimd
特性编译错误 (#2867).solana-program
依赖项 (#2900).TokenAccount
和 Mint
Copy
(#2904).cargo build-sbf
成为默认的构建命令 (#2694).overflow-checks
标志 (#2716).anchor-deprecated-state
特性 (#2717).CLOSED_ACCOUNT_DISCRIMINATOR
(#2726).Option<u8>
而不是 u8
(#2730).shared-memory
程序 (#2747).associated
、account.associated
和 account.associatedAddress
方法 (#2749).idl upgrade
命令关闭 IDL 缓冲区帐户 (#2760).init
命令中删除 --jest
选项 (#2805).Cargo.toml
中需要 idl-build
特性 (#2824).seeds
特性重命名为 resolution
并使其默认启用 (#2824).idl parse
命令 (#2824).idl-parse
和 seeds
特性 (#2824).accounts
方法以不再接受可解析的帐户 (#2824).Program
实例对所有内容使用 camelCase (#2824).Program
构造函数的 programId
参数 (#2864).anchor-syn
crate 移动到新的 IDL crate (#2882).#[non_exhaustive]
(#2890).有关如何更新的高级概述,请参阅 Anchor 0.29 发布说明。
AccountInfo
(#2656).get_lamports
、add_lamports
和 sub_lamports
方法 (#2552).DynSigner
,以简化 Client<C> where <C: Clone + Deref<Target = impl Signer>>
与 Solana clap CLI 工具的使用,该工具将 Signer
加载为 Box<dyn Signer>
(#2550).anchor build
仍然使用解析方法来生成 IDL,使用 anchor idl build
通过构建方法生成 IDL (#2011)..anchorversion
文件的支持,以方便在不同版本的 anchor-cli
之间切换 (#2553).anchor.workspace.myProgram
、anchor.workspace.MyProgram
... (#2579).mpl-token-metadata
crate (#2583).TokenRecordAccount
(#2597).Box
anchor_lang::error::Error
的内部枚举以优化 anchor_lang::Result
(#2600).Program.addEventListener
方法添加强类型支持 (#2627).IdlBuild
特性以实现对自定义类型的 IDL 支持 (#2629).idl-build
特性。使用 anchor-spl
时,如果不启用此特性,IDL 构建方法将不起作用 (#2629).Anchor.toml
添加 test.upgradeable
、test.genesis.upgradeable
设置以支持测试可升级程序 (#2642).1.17.0
,1.16
仍然受支持 (#2645).anchor-cli
安装 (#2659).Anchor.toml
中添加 toolchain
属性以覆盖 Anchor 和 Solana 版本 (#2649).assert
(#2535).InitSpace
宏中的 const
(#2555).1.14
编译 (#2572).anchor build --no-docs
向 IDL 添加文档的问题 (#2575).associated_token::token_program
约束 (#2603).anchor account
命令 (#2620).idl
特性已替换为 idl-build
、idl-parse
和 idl-types
特性 (#2011).parse
方法现在返回 Result<Idl>
而不是 Result<Option<Idl>>
(#2582).mpl-token-metadata
依赖项以使用客户端 SDK 而不是程序 crate (#2632).base64-js
依赖项 (#2635).IdlTypeDefinitionTy
枚举有一个新的变体 Alias
(#2637).1.14
,最低要求的 Solana 版本为 1.16.0
(#2645).Anchor.toml
中的 anchor_version
和 solana_version
属性已移至 toolchain
内部。它们现在用于工作区中的所有命令,而不仅仅是可验证的构建 (#2649).async
特性标志以使用异步 anchor-client (#2488).approve_collection_authority
、bubblegum_set_collection_size
、burn_edition_nft
、burn_nft
、revoke_collection_authority
、set_token_standard
、utilize
、unverify_sized_collection_item
、unverify_collection
(#2430)token_program
约束添加到 Token
、Mint
和 AssociatedToken
帐户,以便覆盖所需的 token_program
字段并在同一指令中使用不同的 token 接口实现 (#2460)anchor init
和 anchor new
接受一个选项 --solidity
,该选项创建 solidity 代码而不是 rust 代码。anchor build
和 anchor test
相应地工作 (#2421)idl set-buffer
、idl set-authority
和 idl close
接受一个选项 --print-only
。它以 base64 Borsh 兼容格式打印交易,但不发送到集群。这在多重签名下管理权限时很有用,例如,用户可以在 SPL Governance 中为“自定义指令”创建提案 (#2486).emit_cpi!
和 #[event_cpi]
宏(位于 event-cpi
特性标志之后) 以将事件日志存储在交易元数据中 (#2438).keys sync
命令以同步程序 id 声明 (#2505).1.16.0
并指定最大版本 <1.17.0
(#2512).anchor deploy
命令的 --program-name
参数接受程序库名称 (#2519).AccountClient
类型缩小到其相应的帐户类型 (#2440)program_id
、accounts
、ix_data
、remaining_accounts
的问题 (#2464)metadata.address
生成 (#2485)anchor new
不更新 Anchor.toml
的问题 (#2516).program_id
、accounts
、ix_data
、remaining_accounts
)已使用 __
前缀重命名 (#2464)metadata::create_metadata_account_v2
包装器,因为它已从 token metadata 程序中删除 (#2480)MasterEditionAccount
帐户反序列化添加到 spl 元数据 (#2393).InitSpace
派生宏以自动计算帐户初始化时的空间 (#2346).env
选项 (#2325).idl close
命令以关闭程序的 IDL 帐户 (#2329).idl init
现在支持非常大的 IDL 文件 (#2329).transfer_checked
函数 (#2353).approve_checked
函数 (#2401).--skip-build
选项 (#2387).--multithreaded
(#2321).async_rpc
方法,该方法返回一个非阻塞的 solana rpc 客户端 (#2322).reqwest
的 rustls-tls
特性,以便用户不需要安装 OpenSSL (#2385).VersionedTransaction
支持。Provider
类和 Wallet
接口中的方法现在使用参数 tx: Transaction | VersionedTransaction
(#2427).--arch sbf
选项以使用 cargo build-sbf
编译程序 (#2398).Interface
和 InterfaceAccount
类型支持具有相同接口的多个程序,与 token-2022 相关 (#2386).AccountClient.fetchMultiple
的返回类型与正在提取的帐户类型匹配 (#2390)signers
,provider.simulate
将发送带有 sigVerify: false
的交易 (#2331).CpiAccount
、Loader
和 ProgramAccount
(#2375).state
和 interface
属性 (#2285).#[account(constraint = {})]
替换的已弃用文字约束 (#2379).account(zero_copy)
和 zero_copy
属性现在派生 bytemuck::Pod
和 bytemuck::Zeroable
特性,而不是使用 unsafe impl
(#2330). 这对类型施加了有用的限制,例如没有填充字节并且所有字段本身都是 Pod
。有关详细信息,请参阅 bytemuck::Pod。此更改需要将 bytemuck = { version = "1.4.0", features = ["derive", "min_const_generics"]}
添加到你的 cargo.toml
。传统应用程序仍然可以将 #[account(zero_copy(unsafe))]
和 #[zero_copy(unsafe)]
用于旧的行为。createProgramAddressSync
、findProgramAddressSync
(现在在 @solana/web3.js
中可用) 并更新 associatedAddress
以使其同步 (#2357).anchor test
添加 --run
,用于运行测试套件的子集 (#1828)。transaction
函数 (#1958)。create_metadata_accounts_v3
和 set_collection_size
包装器 (#2119)。MetadataAccount
账户反序列化。(#2014)。update_primary_sale_happened_via_token
包装器 (#2173)。sign_metadata
和 remove_creator_verification
包装器 (#2175)。initialize_account3
和 initialize_mint2
(#2265)。serum-dex
更改为 openbook-dex
(#2308)。has_one
关系推断,因此不再需要提供通过 has_one 关系映射的账户 (#2160)。.prepare()
(#2160)。freeze_delegated_account
和 thaw_delegated_account
包装器 (#2164)。AnchorProvider
方法添加 feePayer
检查,以便在未设置 fee payer 时,anchor 将 provider 的钱包写入为 fee payer (#2186)。AccountsClose
,使其可以安全地手动调用 (#2209)。test.validator.geyser_plugin_config
支持 (#2016)。account
子命令 (#1923)ticks_per_slot
选项 (#1875)。seed
生成 (#2125)。.fetchNullable()
,使其对仅持有余额的账户具有鲁棒性 (#2301)。rent
(#2265)。associated_token::Create
中删除 rent
(#2265)。Discriminator
和 Owner
特性实现 (#1997)。yarn build
时自动发生,请参阅 #2299 和 #2306。Optional<Account<'info, T>>
可选地传入账户。不应影响现有程序,但可能会对使用 anchor 生成的 IDL 的工具造成重大更改。 #2101。@project-serum/anchor
切换到 @coral-xyz/anchor
包 #2318。realloc
、realloc::payer
和 realloc::zero
作为程序账户的新约束组 (#1986)。anchor_lang::Error
添加 PartialEq
和 Eq
(#1544)。anchor publish
添加 --skip-build
(#1786)。anchor deploy
添加 --program-keypair
(#1786)。build
现在将文档添加到 idl。可以使用 --no-docs
关闭此功能 (#1561)。build
和 test
添加 b
和 t
别名 (#1823)。TokenAccount
到 Mint
添加更多派生特性 (#1818)。sync_native
token 程序 CPI 包装函数 (#1833)。anchor run
将参数传递给底层脚本 (#1914)。program.coder.types
用于编码/解码用户定义的类型 (#1931)。send_with_spinner_and_config
函数 (#1926)。NodeWallet.local()
时,缺少 ANCHOR_WALLET
变量的详细错误 (#1958)。MethodsBuilder#accountsStrict
(#2019)。anchor keys list
读取错误路径中的 target
文件夹 (#2063)。overflow-checks
移动到 workspace Cargo.toml
中,使其不会被编译器忽略 (#1806)。init
或 zero
时,反序列化失败时缺少账户名称信息的问题 (#1800)。BROWSER
环境变量更改为 ANCHOR_BROWSER
(#1233)。EventCallback
参数 (#1851)。EventParser#parseLogs
实现,使其成为生成器而不是回调函数 (#2018)。Accounts::try_accounts
添加一个新的 &mut reallocs: BTreeSet<Pubkey>
参数 (#1986)。returns
在 IDL 中序列化为 null
而不是 undefined
的问题 (#1782)。Test.toml
包含一个尚不存在的相对路径,因为它是通过 anchor build
创建的,则 anchor build
失败的问题 (#1772)。AnchorProvider
类 (#1770)。avm update
命令,用于将 Anchor CLI 更新到最新版本 (#1670)。program.methods
语法 (#1732)。anchor init
创建的工作区现在附带 prettier
格式化程序和包含的脚本 (#1741)。pubkeys
函数,以获取所有指令账户地址 (#1733)。error.ts
导出 LangErrorCode
和 LangErrorMessage
(#1756)。avm install
将不再下载该版本 (#1670)。--skip-deploy
选项一起使用且没有 --skip-local-validator
选项但已经有一个正在运行的验证器时,anchor test
失败的问题 (#1675)。(Account)Loader
的函数中账户长度小于鉴别器,则返回正确的错误而不是 panic (#1678)。@types/bn.js
添加到 devDependencies
(#1712)。avm install
在安装完成后切换到新安装的版本 (#1670)。spl_token
crate (#1665)。Program
类型现在仅在需要时反序列化 programdata_address
(#1723)。Provider
设为接口,并调整其签名并添加 AnchorProvider
实现类 (#1707)。token::burn
中将“to”更改为“from” (#1080)。anchor clean
命令,该命令与 cargo clean
相同,但保留 target/deploy
中的 keypair (#1470)。anchor init
现在为工作区初始化一个新的 git 存储库。可以使用 --no-git
标志禁用此功能 (#1605)。anchor idl fetch
的支持,使其可以在 anchor 工作区外部工作 (#1509)。AccountSysvarMismatch
错误代码和 sysvar 的测试用例 (#1535)。std::io::Cursor
替换为使用 Solana mem 系统调用的自定义 Write
impl (#1589)。require_neq
、require_keys_neq
、require_gt
和 require_gte
比较宏 (#1622)。Spl.token
工厂方法 (#1597)。methods
命名空间丢失严格类型的问题 (#1539)。spl/governance
以使用新错误 (#1582)。Cluster
的 FromStr
实现 (#1362)。Pubkey
实现 Key
,以便 associated_token::*
约束可以再次使用 pubkey 目标 (#1601)。#[error_code]
仅通过导入 anchor_lang::error_code
即可工作 (#1610)。spl-token
编码器账户解析 (#1604)。yarn
安装不起作用,则 npm install
回退 (#1643)。owner = <target>
无法编译的错误 (#1648)。provider.ts
中的 send
和 simulate
函数,以便它们使用 Wallet.signTransaction
的返回值 (#1527)。transaction
、instruction
、simulate
和 rpc
程序命名空间标记为已弃用,改为使用 methods
(#1539)。methods#accounts()
中手动设置全局可解析程序公钥。([#1548][https://github.com/coral-xyz/anchor/pull/1548])sol_log_data
系统调用发出事件 (#1608)。#[derive(Default)]
的空间计算 (#1519)。require_eq
和 require_keys_eq
宏。将默认错误代码添加到 require
宏 (#1572)。system_program
CPI 包装函数。使 system_program
模块公开,而不是重新导出 system_program::System
(#1629)。avm use
不再提示 [y/n] - 它只是告诉用户 avm install
(#1565)AnchorError
,以及非 AnchorError
错误的程序堆栈 (#1640)。对于将 skipPreflight
设置为 true
的 processed
tx,不返回 AnchorError
(它会回退到 ProgramError
或原始 solana 库错误)。--skip-lint
选项以禁用 (#1452) 中引入的检查 linting,用于快速原型设计 (#1482)。Option<T>
映射类型的可空类型 (#1428)。mut
(#1271)。error!
和 err!
宏和 Result
类型 (#1462)。
此更改将破坏大多数程序。请执行以下操作进行升级:
将所有 ProgramResult
更改为 Result<()>
将 #[error]
更改为 #[error_code]
将所有 Err(MyError::SomeError.into())
更改为 Err(error!(MyError::SomeError))
,并将所有 Err(ProgramError::SomeProgramError)
更改为 Err(ProgramError::SomeProgramError.into())
或 Err(Error::from(ProgramError::SomeProgramError).with_source(source!()))
以提供错误的文件和行源代码(with_source
在使用 ProgramError
时最有用。error!
已经为自定义和 anchor 内部错误添加了源信息)。
将所有 solana_program::program::invoke()
更改为 solana_program::program::invoke().map_err(Into::into)
,并将 solana_program::program::invoke_signed()
更改为 solana_program::program::invoke_signed().map_err(Into::into)
Wallet
/ NodeWallet
类的根类型声明 (#1363)。Option<T>
和 Vec<String>
类型 (#1393)。seeds::program
约束,用于指定在派生 PDA 时要使用的 program_id (#1197)。Context
现在有一个新的 bumps: BTree<String, u8>
参数,将账户名称映射到账户上下文“找到”的 bump seed。这允许人们访问 bump seed,而无需从客户端传入或在处理程序中重新计算它们 (#1367)。methods
命名空间,引入更符合人体工程学的构建器 API (#1324)。init_if_needed
放在功能标志后面,以减少错误使用 (#1258)。loader_account
模块重命名为 account_loader
模块 (#1279)Accounts
特性的 try_accounts
方法现在有一个额外的 bumps: &mut BTreeMap<String, u8>
参数,用于累积 bump seed (#1367)。init
提供 bump = <target>
目标现在将出错。在 init
上,仅需要在没有目标的情况下使用 bump
,并通过 ctx.bumps.get("<pda-account-name")
在函数处理程序中访问 seed。对于后续的 seed 约束(没有 init),建议将 bump 存储在你的账户上,并将其用作 bump = <target>
目标,以最大限度地减少使用的计算单元 (#1380)。Coder
现在是一个接口,现有的类已重命名为 BorshCoder
。此更改允许为非 anchor 程序生成 Anchor 客户端 (#1259)。init
约束时,缺少所需程序时出现的错误消息 (#1257)init_if_needed
现在在不需要 init 时检查租金豁免 (#1250)。associated_token::authority
时添加缺少的 owner 检查 (#1240)。workspace
和 Wallet
导出添加类型声明 (#1137)。recent
更改为 processed
,将 max
更改为 finalized
(#1128)translateAddress
,它目前导致浏览器代码失败。现在使用 PublicKey
构造函数,而不是原型链构造函数名称检查,这在代码缩小/混淆的情况下不起作用 (#1138)init_if_needed
且不需要 init 时,账户是否为 ATA (#1221)programdata_address: Option<Pubkey>
字段添加到 Program
账户。如果账户是由可升级的 bpf loader 所拥有的程序,则会被填充 (#1125)serialize
函数,因为它现在有一个默认的 impl。类似地,它们不再需要实现 try_deserialize
,它现在默认委托给 try_deserialize_unchecked
(#1156)。set_inner
方法添加到 Account<'a, T>
以启用轻松更新 (#1177)。fetch
和 fetchMultiple
(#1171)。Account<'a, T>
实现 AsRef<T>
(#1173)anchor expand
命令,该命令包装 cargo expand
(#1160)Rc<dyn Signer>
而不是 Keypair
(#975)。#[repr(packed)]
更改为 #[repr(C)]
(#1106)。prelude
模块或 accounts
模块中找到,但不再直接在根目录下。不推荐使用的账户类型不再由 prelude 导入 (#1208)。deprecated
属性添加到 ProgramAccount
(#1014)。Cargo.toml
中的版本号添加到提取的 IDL 中 (#1061)。deprecated
属性添加到 Loader
(#1078)。init_if_needed
属性现在检查给定的属性(例如 space、owner、token::authority 等)是否经过验证,即使不需要 init (#1096)。ErrorCode::AccountNotInitialized
错误,以区分账户具有错误的所有者与账户不存在的情况 (#1024)。no-log-ix-name
标志关闭此功能 (#1057)。
ProgramData` 和 `UpgradableLoaderState` 现在可以作为泛型传递到 `Account` 中。请参阅 [UpgradeableLoaderState](https://docs.rs/solana-program/latest/solana_program/bpf_loader_upgradeable/enum.UpgradeableLoaderState.html)。`UpgradableLoaderState` 也可以匹配以获取 `ProgramData`,但是当使用 `ProgramData` 时,anchor 会为你进行序列化和检查它是否实际上是程序数据 ([#1095](https://github.com/coral-xyz/anchor/pull/1095))。
postInstructions
和 preInstructions
作为(现在已弃用的)instructions
的替代品 (#1007)。getAccountInfo
辅助方法添加到账户命名空间/客户端 (#1084)。SystemAccount<'info>
账户类型 (#954)idl parse
子命令中输出 TypeScript IDL (#941)。os
和 cpu
添加到 npm 包 @project-serum/anchor-cli
(#976)。solana-test-validator
的配置选项的支持 (#834)。target/types
目录,以存储每个程序的 IDL 的 TypeScript 类型文件 (#795)。Program<T>
现在可以使用 IDL 类型进行类型化 (#795)。#[derive(Accounts)]
中的 mint 初始化添加 mint::freeze_authority
关键字 (#835)。zero_copy
账户添加 AccountLoader
类型 (#792)。#[account(init_if_needed)]
关键字,允许用户调用相同的指令,即使账户已经创建 (#906)。signer
、mut
、has_one
、owner
、原始约束和 address
添加自定义错误支持 (#905, #913)。"cpi"
功能时,使用 #[account(signer)]
约束标记的账户现在强制执行 signer (#849)。localnet
命令,用于启动本地 solana-test-validator
并部署工作区 (#820)。CpiContext
账户现在必须与 crate::cpi::accounts::*
模块中生成的账户结构一起使用。这些结构对应于每个指令的账户上下文,但每个字段的类型都是 AccountInfo
(#824)。anchor test
添加 --detach
标志 (#770)。associated_token
关键字,用于初始化 #[derive(Accounts)]
中的关联 token 账户 (#790)。AccountMeta
现在正确设置 isSigner
字段 (#762)。Signer
类型现在在 IDL 中将 isSigner 设置为 true (#750)。Program
类型 (#705)。Signer
类型 (#705)。UncheckedAccount
类型,作为 AccountInfo
的首选别名 (#745)。#[account(owner = <pubkey>)]
现在需要 Pubkey
而不是账户 (#691)。Account
类型来替换 ProgramAccount
和 CpiAccount
,两者都已弃用 (#686)。Box
可以与 Account
类型一起使用,以减少堆栈使用量 (#686)。Owner
trait,它由所有 #[account]
结构自动实现 (#686)。anchor-debug
) (#681)。declare_id!
在源代码中定义它们的程序 id (#686)。Unnamed
结构而不是 panic (#605)。#[account(init, seeds = [...], mint::decimals = <expr>, mint::authority = <expr>)]
(#562)。AccountInfo
包装器添加 AsRef<AccountInfo>
(#652)。AccountInfo
克隆来优化 trait Key
(#652)。#[account(init, seeds = [...], token = <expr>, authority = <expr>)]
更改为 #[account(init, token::mint = <expr> token::authority = <expr>)]
(#562)。#[associated]
和 #[account(associated = <target>, with = <target>)]
都被删除 (#612)。anchor launch
命令 (#634)。#[account(init)]
现在在同一指令中创建账户,以与初始化 PDA 保持一致。要保持 init
的旧行为,请将其替换为 #[account(zero)]
(#641)。seeds
约束时必须提供 bump
。添加此项作为额外的安全约束,以确保每当通过约束初始化 PDA 时,使用的 bump 都是由 Pubkey::find_program_address
创建的 (#641)。try_from_init
已从 Loader
、ProgramAccount
和 CpiAccount
中删除,并替换为 try_from_unchecked
(#641)。AccountsInit
trait (#641)。ProgramAccount
、Loader
和 ProgramState
的 try_from
方法现在接受一个额外的 program_id: &Pubkey
参数 (#660)。anchor init
命令“未找到工作区”回归 (#598)。[registry]
部分 (#570)。anchor login <api-token>
命令 (#570)。anchor publish <package>
命令 (#570)。anchor_version
字段,用于指定用于可验证构建的 anchor docker 镜像 (#570)。solana_version
字段,用于指定用于可验证构建的 solana toolchain (#570)。init
时动态获取租金 sysvar (#587)。[clusters.<network>]
Anchor.toml 部分已重命名为 [programs.<network>]
(#570)。[workspace]
成员和排除数组现在必须是相对于工作区根目录的文件路径 (#570)。programs
部分添加键 members
/ exclude
(#546)。clusters.localnet
为 test 命令配置程序地址 (#554)。hex
解码指令 (#547)。CpiAccount::reload
改变现有结构,而不是返回新结构 (#526)。[scripts]
测试命令 (#550)。require
宏,用于指定失败时返回错误代码的 assertion (#483)。bump
关键字,用于向 seeds
数组的末尾添加可选的 bump seed。当与 init
和 seeds
一起使用时,程序将执行 find_program_address
以 assertion 给定的 bump 是 canonical bump (#483)。#[account(address = <expr>)]
约束以 assertion 账户的地址 (#400)。#[account(init, token = <mint-target>, authority = <token-owner-target>...)]
约束以将 SPL token 账户初始化为程序的程序派生地址。可以在通过 seeds
或 associated
初始化时使用 (#400)。associated_seeds!
宏,用于为由 #[account(associated = <target>)]
账户签名的 CPI 生成 signer seed (#400)。[scripts]
部分,用于指定可以通过 anchor run <script>
运行的工作区脚本 (#400)。[clusters.<network>]
表条目现在也可以使用 { address = <base58-str>, idl = <filepath-str> }
来指定工作区程序 (#400)。--yarn
标志,转而使用 npx
(#432)。--program-name
选项,用于构建命令以一次构建单个程序 (#362)。#[account(close = <destination>)]
约束以关闭账户并将租金豁免 lamport 发送到指定的 destination 账户 (#371)。CpiContext
上实现 ToAccountMetas
trait,允许用户将 remaining_accounts
与 CpiContext
一起使用 (#351)。SetAuthority
指令 (#307)。constraint = <expression>
作为(现在已弃用的)字符串字面量约束的替代品 (#341)。anchor.workspace
客户端是可选的 (#310)。<program>.account.<my-account>
和 <program>.state
命名空间检索反序列化账户现在需要显式调用 fetch
API。例如,program.account.myAccount(<address>)
和 program.state()
现在是 program.account.myAccount.fetch(<address>)
和 program.state.fetch()
(#322)。#[account(associated)]
现在需要提供 init
来创建关联账户。如果未提供,则假定地址存在,并将添加约束以确保地址的正确性 (#318)。#[state]
账户鉴别器的账户鉴别器 pre-image 更改为由 "state:" 命名空间 (#320)。:
,以与账户保持一致 (#321)。mut
(#341)。space
约束现在必须是字面整数,而不是字面字符串 (#341)。program.simulate
命名空间 (#266)。Address
类型,允许用户在公共 API 中使用 Base 58 编码的字符串 (#304)。web3.Account
替换为 web3.Signer
(#296)。[cluster.<slug>]
为每个网络自定义生成的 anchor.workspace
客户端 (#308)。--skip-build
标志 (301)。anchor shell
命令以生成一个填充了基于 Anchor.toml 的环境的节点 shell (#303)。wallet
和 cluster
设置现在必须位于 [provider]
表下 (#305)。decode
API 更改为直接解码字符串而不是缓冲区 (#292)。encode
API (#292)。RequestBuilder::new
重命名为 RequestBuilder::from
(#248)。instruction::state::Ctor
结构重命名为 instruction::state::New
(#248)。with
目标 (#197)。#[account(owner = <program>)]
约束 (#178)。#[account(associated = <target>)]
和 #[associated]
属性,用于在程序中创建关联的程序帐户。TypeScript 包可以使用新的 <program>.account.<account-name>.associated
(和 associatedAddress
)方法获取这些帐户 (#186)。#[account]
现在已正确解析到 IDL 中 ([#177](https://github.- cli:指定要运行的测试文件 (#118)。#[state]
账户的大小 (#121)。#[account(executable)]
属性 (#140)。Cluster
结构替换 url 字符串来构造客户端 (#89)。IdlAccount
的账户鉴别器,使其由 "internal"
命名空间 (#128)。-#![feature(proc_macro_hygiene)]
。 (#139)。IdlInstruction::Clear
(#107)。.anchor/program-logs
目录 (ce5ca7)。首次发布。
anchor-lang
crate,为 Solana 提供 Rust eDSL。anchor-spl
crate,为 Anchor 程序提供 CPI 客户端。anchor-client
crate,为 Anchor 程序提供 Rust 客户端。@project-serum/anchor
包,用于生成 TypeScript 客户端。
- 原文链接: github.com/solana-founda...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!