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_data
和sol_get_return_data
来写入和读取返回值
同时,通过 instruction_sysvar
获取到的instructions将不包含CPI,因为它的内容是在tx执行前就被预先填充好了的[3]。
参考: