anchor提供了 #[account]
来修饰一个struct,表示这是一个需要序列化后存入solana account的struct。除了将实际数据序列化,anchor还会在前面放入8个字节的标识符(通过类型名计算,sha256("account:STRUCT_NAME")),并在反序列化时检查类型信息是否匹配。
对于传入合约的accounts列表,anchor提供了基类Accounts
, 通过 #[derive(Accounts)]
继承,里面允许的类型有:
Signer<'info>
:表示需要account的is_sign为trueAccount<'info, TYPE>
:表示一个最普通的账户,anchor在反序列化时会自动检查owner是否为TYPE声明所在crate的program_idAccountLoader<'info, TYPE>
:主要用于变化频繁的account,需要使用load等函数读取对于有类型的account,Anchor会直接帮我们反序列化好,可以直接像使用一般rust object一样使用,可以读取和写入,但需要注意的是,如果我们修改了该object中的值,实际数据被写入区块链是在该instruction执行完后才发生的,如果希望立即写入,应使用exit(current_program_id)
手动写入。
同时,CPI也有可能改变某一account的data,Account结构也不会自动在CPI后重新反序列化,需要手动调用reload
完成。
Accounts in anchor_lang - Rust (docs.rs)
Space Reference - Docs (anchor-lang.com)
anchor - Persist data changes to account - Solana Stack Exchange