CPI,也就是Program调用其他Program的过程

使用invoke/invoke_signed

一个transaction中任意instruction中任意一次CPI失败,整个transaction就会被回滚

无法像ETH中一样invoke其他Program,并通过call返回值判断是否出错,一旦被调用的instruction返回的不是Ok,而是Err,Solana会直接中止并回滚transaction,调用者无法获得错误信息。

这也导致CPI无法通过直接return返回值,所以solana提供了额外的API用于在CPI中返回值(参考2),使用sol_set_return_datasol_get_return_data来写入和读取返回值

同时,通过 instruction_sysvar 获取到的instructions将不包含CPI,因为它的内容是在tx执行前就被预先填充好了的[3]

参考:

  1. https://github.com/solana-labs/solana/issues/18302
  2. Return data from SBF programs | Solana Docs
  3. What is the behavior of the Instructions sysvar during CPI calls? - Solana Stack Exchange