anchor提供了 #[account] 来修饰一个struct,表示这是一个需要序列化后存入solana account的struct。除了将实际数据序列化,anchor还会在前面放入8个字节的标识符(通过类型名计算,sha256("account:STRUCT_NAME")),并在反序列化时检查类型信息是否匹配。

Untitled

对于传入合约的accounts列表,anchor提供了基类Accounts , 通过 #[derive(Accounts)] 继承,里面允许的类型有:

  1. Signer<'info> :表示需要account的is_sign为true
  2. Account<'info, TYPE> :表示一个最普通的账户,anchor在反序列化时会自动检查owner是否为TYPE声明所在crate的program_id
  3. AccountLoader<'info, TYPE> :主要用于变化频繁的account,需要使用load等函数读取

对象序列化与反序列化

对于有类型的account,Anchor会直接帮我们反序列化好,可以直接像使用一般rust object一样使用,可以读取和写入,但需要注意的是,如果我们修改了该object中的值,实际数据被写入区块链是在该instruction执行完后才发生的,如果希望立即写入,应使用exit(current_program_id) 手动写入。

同时,CPI也有可能改变某一account的data,Account结构也不会自动在CPI后重新反序列化,需要手动调用reload完成。

account属性

Accounts in anchor_lang - Rust (docs.rs)

Space Reference - Docs (anchor-lang.com)

anchor - Persist data changes to account - Solana Stack Exchange