7 Cpi
- 1 minCPI(Cross Program Invoke)
1. 什么是CPI?
A. 跨程序调用(Cross-Program Invocation,CPI)是一个程序直接调用另一个程序的方式。
B. 跨程序调用(Cross-Program Invocation,CPI)是一个程序对另一个程序的调用,针对的是目标程序中的特定指令。
C. 跨程序调用(Cross-Program Invocation,CPI)是一个程序对另一个程序的间接调用。
D. 跨程序调用(Cross-Program Invocation,CPI)是一个程序对另一个程序的异步调用。
Answer: B
Citation: "跨程序调用(Cross-Program Invocation,CPI)是一个程序直接调用另一个程序的方式。就像任何客户端都可以使用 JSON RPC 调用任何程序一样,任何程序都可以直接调用任何其他程序。"
2. 如何进行CPI?
A. 使用`invoke`或`invoke_signed`函数进行CPI。
B. 使用`invoke`或`invoke_unsigned`函数进行CPI。
C. 使用`call`或`call_signed`函数进行CPI。
D. 使用`execute`或`execute_signed`函数进行CPI。
Answer: A
Citation: "CPI 是使用 `solana_program` 包中的 [`invoke`](https://docs.rs/solana-program/latest/solana_program/program/fn.invoke.html) 或 [`invoke_signed`](https://docs.rs/solana-program/latest/solana_program/program/fn.invoke_signed.html) 函数进行的。"
3. CPI with `invoke`
A. `invoke`函数的`accounts`字段期望一个类型为`AccountMeta`的向量。
B. `invoke`函数的`data`字段期望一个字节缓冲区。
C. `invoke`函数的`program_id`字段是要调用的程序的公钥。
D. `invoke`函数的`accounts`字段期望一个类型为`Pubkey`的向量。
Answer: A
Citation: "Instruction` 结构体的 `accounts` 字段期望一个类型为 [`AccountMeta`](https://docs.rs/solana-program/latest/solana_program/instruction/struct.AccountMeta.html) 的向量。"
4. 为什么CPIs很重要?
A. CPIs使得程序无法互操作。
B. CPIs使得程序无法直接调用其他程序。
C. CPIs使得程序可以为其PDAs提供签名。
D. CPIs使得程序无法调用原生程序。
Answer: C
Citation: "另一个 CPIs 的重要方面是它们允许程序为它们的 PDAs 进行签名。"
- 什么是CPI?
答:CPI是跨程序调用(Cross-Program Invocation)的缩写,是一个程序直接调用另一个程序的方式,针对目标程序中的特定指令。
- 在利用CPI时,为什么验证传递给CPI的参数非常重要?
答:验证传递给CPI的参数是非常重要的,因为我们无法控制提交给程序的账户和数据。如果没有这些安全检查,有人可能会提交一个调用了完全不同程序的指令的交易,这是不理想的。
- 当执行CPI时,如果收到错误消息”Cross-program invocation with unauthorized signer or writable account”,可能是什么原因?
答:这个错误消息可能是由于错误地为地址签名导致的。如果使用invoke_signed
并收到此错误消息,则很可能是提供的种子不正确。
- 在进行CPI之前,应该验证哪些内容?
答:在进行CPI之前,应该在程序代码中验证所有其他账户和instruction_data
,确保传递给CPI的program_id
、账户和数据是正确的,并且目标指令是预期的。
- 为什么CPIs很重要?
答:CPIs很重要,因为它使得Solana生态系统中的程序完全可互操作,一个程序的所有公共指令都可以通过CPI被另一个程序调用,从而扩展了开发者的可能性和灵活性。