教程的分类
- Anchor 文档教程 (偏向入门)
- Anchor SPL Tokens (SPL专题)
- Anchor AMM Swap 合约程序 (项目应用)
- Anchor Staking (项目应用)
- Anchor GMGN 类的合约程序 (项目应用)
- 手续费扣留等 Wrap 包装
《Anchor 文档教程》的大纲
- anchor Doc: https://learnblockchain.cn/docs/anchor
- anchor Api: https://docs.rs/anchor-lang/latest/anchor_lang/index.html
主要依靠官方文档和API,初步的大纲:
- 环境安装
- Hello Anchor
- Anchor 程序结构
- Anchor 账户类型
Signer<'info>
: 验证账户已签署交易的类型Program<'info, T>
: 验证账户是指定程序类型Account<'info, T>
: 在反序列化时检查所有权的账户容器UncheckedAccount<'info>
: AccountInfo 类型的显式包装器,强调不执行检查- 添加
/// CHECK:
文档注释,解释为什么无需进行类型检查。
- 添加
AccountInfo<'info>
: 可以作为类型使用,但应改用 Unchecked AccountSystemAccount<'info>
: 验证账户由系统程序拥有的类型AccountLoader<'info, T>
: 用于按需零拷贝反序列化的类型Box<Account<'info, T>>
: 用于节省栈空间的 Box 类型Interface<'info, T>
: 验证账户属于给定程序集之一的类型InterfaceAccount<'info, T>
: 在反序列化时检查所有权的账户容器Option<Account<'info, T>>
: 用于可选账户的 Option 类型Sysvar<'info, T>
: 验证账户是 sysvar 并对其进行反序列化的类型
- Anchor 账户约束
- Anchor PDA
- 详细的约束:
- 初始化账户
init / init_if_needed
#[account(init)]
#[account(init_if_needed)]
#[account(signer)]
(支付者payer
/ 空间space
)- 常被
Signer<'info>
取代
- 常被
- 可变性(mut)与只读:
#[account(mut)]
- 种子与 PDA
#[account(seeds, bump)]
验证 PDA#[account(realloc)]
重分配#[account(zero)]
重分配
- 零拷贝账户:
#[account(zero_copy)]
- 关闭账户:
#[account(close = target)]
- 所有权相关约束
owner / has_one / constraint
#[account(owner = expr)]
#[account(has_one = target)]
#[account(constraint = expr)]
#[account(address = expr)]
#[account(executable)]
- SPL 约束
- SPL
#[account(token::*)]
- SPL
#[account(mint::*)]
- SPL
#[account(associated_token::*)]
- SPL
#[account(*::token_program = expr)]
- SPL
- 指令属性
#[instruction(...)]
- Anchor 账户空间
- Anchor IDL
- Anchor CPI
- Solana转账
- 调用其他程序,无依赖组合
declare_program
- Anchor 错误
- Anchor 事件
emit
/emit_cpi
- 零拷贝
- Anchor Cli
- Anchor 智能合约安全知识
- Anchor 测试
- 简单的应用:
program-derived-addresses
repository-layo
第一个教程完成之后,再考虑搞后面的教程。规划太多,容易偏离初心。
🌹 送人玫瑰,手留余香;人人为我,我为人人。加油,奥利给!🌹