7 Cpi

- 1 min

CPI(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 进行签名。"

  1. 什么是CPI?

答:CPI是跨程序调用(Cross-Program Invocation)的缩写,是一个程序直接调用另一个程序的方式,针对目标程序中的特定指令。

  1. 在利用CPI时,为什么验证传递给CPI的参数非常重要?

答:验证传递给CPI的参数是非常重要的,因为我们无法控制提交给程序的账户和数据。如果没有这些安全检查,有人可能会提交一个调用了完全不同程序的指令的交易,这是不理想的。

  1. 当执行CPI时,如果收到错误消息”Cross-program invocation with unauthorized signer or writable account”,可能是什么原因?

答:这个错误消息可能是由于错误地为地址签名导致的。如果使用invoke_signed并收到此错误消息,则很可能是提供的种子不正确。

  1. 在进行CPI之前,应该验证哪些内容?

答:在进行CPI之前,应该在程序代码中验证所有其他账户和instruction_data,确保传递给CPI的program_id、账户和数据是正确的,并且目标指令是预期的。

  1. 为什么CPIs很重要?

答:CPIs很重要,因为它使得Solana生态系统中的程序完全可互操作,一个程序的所有公共指令都可以通过CPI被另一个程序调用,从而扩展了开发者的可能性和灵活性。