AccountInfo
solana_program::account_info::AccountInfo
账户信息(AccountInfo),合约中对于账户基本信息的引用(余额和数据可变)。
1 | /// Account information |
Account
anchor_lang::accounts::account::Account
账户(Account),对 AccountInfo
的包装,并能够自动反序列化 T
。
1 |
|
基本功能
- 检查
T::owner()
是否等于info.owner
,这就要求T: Owner
。通常使用#[account]
宏来自动为T
实现Owner
,并使用crate::ID()
也就是合约地址作为它的 owner。 - 此外,它还会保证
!(Account.info.owner == SystemProgram && Account.info.lamports() == 0)
,即账户所有者不是系统程序(必须是非系统合约),并且账户的 SOL 余额不能为 0。
AccountLoader
anchor_lang::accounts::account_loader::AccountLoader
账户加载器,用于按需零拷贝反序列化的提取器,类型 T
需要实现 ZeroCopy
。
1 |
|
基本功能
load_init
: 在初始化时(只能)运行一次,得到一个 RefMut<T>
,可读写。load
: 加载只读引用 Ref<T>
。load_mut
: 加载读写引用 RefMut<T>
。
InterfaceAccount
anchor_lang::accounts::interface_account::InterfaceAccount
接口账户,用来支持 T: Owners
的情况。即有多个程序拥有这种类型的账户数据,引入时是为了支持 token-2022 #2386。
1 |
|
基本功能
- 检查所有者,即
T::owners().contains(InterfaceAccount.info.owner)
。 - 同
Account
的第二项。
Interface
anchor_lang::accounts::interface::Interface
接口,用来表示实现了某种接口的程序中的某一个。
1 |
|
TODO: 例子。
Program
anchor_lang::accounts::program::Program
程序,表示一个程序/合约。
1 |
|
Signer
anchor_lang::accounts::signer::Signer
签名者,检查 Signer.info.is_signer == true
。
1 |
|
SystemAccount
anchor_lang::accounts::system_account::SystemAccount
系统账户,检查账户的拥有者是不是系统程序(即 SystemAccount.info.owner == SystemProgram
)。
1 |
|
Sysvar
anchor_lang::accounts::sysvar::Sysvar
系统变量,检查账户是否是系统变量。
1 |
|
TODO: 写一篇 post 单独介绍实现了 solana_program::sysvar::Sysvar
的类型。
UncheckedAccount
强调不做任何检查的账户,需要手动在合约指令中做检查。
1 |
|