Skip to main content

CpiContext

链接

https://www.rareskills.io/post/cross-program-invocation

https://docs.rs/anchor-lang/latest/anchor_lang/context/struct.CpiContext.html

代码分析

这段代码展示了两个 Solana 程序:calleecaller,并演示了如何通过跨程序调用(CPI)从 caller 调用 callee 的方法。

Callee Program

  1. init 方法: 初始化 Data 账户,并设置 authority
  2. set_data 方法: 更新 Data 账户中的 data 字段。
  • Data 结构体: 包含 dataauthority 字段。
  • Init 账户结构: 用于创建和初始化 Data 账户。
  • SetData 账户结构: 用于更新 Data 账户,要求 authority 签名。

Caller Program

  1. do_cpi 方法: 调用 callee 程序的 set_data 方法。
  2. do_cpi_with_pda_authority 方法: 使用程序派生地址(PDA)作为权限,调用 callee 程序的 set_data 方法。
  • DoCpi 账户结构: 包含 data_acccallee_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 的简化步骤:

  1. 准备账户
  2. 定义上下文
  3. 创建 CpiContext
  4. 执行调用

如果使用 PDA,则处理签名者。