CpiContext
链接
https://www.rareskills.io/post/cross-program-invocation
https://docs.rs/anchor-lang/latest/anchor_lang/context/struct.CpiContext.html
代码分析
这段代码展示了两个 Solana 程序:callee 和 caller,并演示了如何通过跨程序调用(CPI)从 caller 调用 callee 的方法。
Callee Program
init方法: 初始化Data账户,并设置authority。set_data方法: 更新Data账户中的data字段。
Data结构体: 包含data和authority字段。Init账户结构: 用于创建和初始化Data账户。SetData账户结构: 用于更新Data账户,要求authority签名。
Caller Program
do_cpi方法: 调用callee程序的set_data方法。do_cpi_with_pda_authority方法: 使用程序派生地址(PDA)作为权限,调用callee程序的set_data方法。
DoCpi账户结构: 包含data_acc和callee_authority,以及callee程序。DoCpiWithPDAAuthority账户结构: 类似DoCpi,但使用 PDA 作为authority。
调用交互图
Caller Program
|
|-- do_cpi(data: u64) --------------------------------
| | |
| | [Create CpiContext] |
| | |
| |-- Call callee::set_data(data: u64) -------------|
| |
| |
|-- do_cpi_with_pda_authority(bump: u8, data: u64) ----
| |
| [Create CpiContext with PDA signer] |
| |
|-- Call callee::set_data(data: u64) -------------|
关键点
- CPI(跨程序调用):
caller程序通过CpiContext调用callee程序的方法。 - PDA: 在
do_cpi_with_pda_authority中使用 PDA 作为authority,需要提供种子和 bump 值来生成 PDA。 - 账户检查:
caller程序使用UncheckedAccount,因为账户检查在callee程序中完成。
简化步骤
在 Solana 中进行 CPI 的简化步骤:
- 准备账户。
- 定义上下文。
- 创建 CpiContext。
- 执行调用。
如果使用 PDA,则处理签名者。