Solana中什么是 CPI​

  • 曲弯
  • 发布于 1天前
  • 阅读 33

Solana中的CPI​指的是跨程序调用,它允许一个Solana智能合约(程序)在执行过程中去调用另一个智能合约的功能。这就像是我们在点外卖时,一个订单串联起了平台、餐厅和骑手等多个服务方;在Solana上,一个交易可以通过CPI串联起多个智能合约,共同完成一项复杂的任务。为了

<!--StartFragment-->

Solana 中的 CPI​ 指的是跨程序调用,它允许一个 Solana 智能合约(程序)在执行过程中去调用另一个智能合约的功能。这就像是我们在点外卖时,一个订单串联起了平台、餐厅和骑手等多个服务方;在 Solana 上,一个交易可以通过 CPI 串联起多个智能合约,共同完成一项复杂的任务。

为了帮你快速把握全貌,下面这个表格概括了 CPI 的核心要点。

特性 说明
核心目标 实现智能合约之间的功能组合模块化协作
关键机制 通过 invokeinvoke_signed函数调用目标程序的指令。
主要价值 将复杂操作原子化,避免多次交易;促进代码复用,提升开发效率。
常见应用 DeFi 协议组合、代币转账、NFT 铸造等需要多个合约交互的场景。

工作原理与调用方式

你可以把每个 Solana 智能合约想象成一个独立的、有特定功能的积木。CPI 就是允许你将这些积木安全地拼接在一起,构建出更复杂结构的方法。一次 CPI 调用本质上是在一个交易内,当前运行的程序向另一个程序发送一条执行特定操作的请求。

根据目标账户的不同,主要有两种调用方式:

调用方式 适用场景 说明
invoke 目标账户是普通外部账户,由私钥控制。 程序直接调用目标指令,权限检查基于原始交易中账户的签名状态。
invoke_signed 目标账户是程序派生地址,没有私钥。 这是 CPI 的精髓。程序通过提供生成 PDA 时使用的“种子”,来为这个本无私钥的账户“生成签名”,代表它执行操作。

核心概念:PDA 与 invoke_signed

理解 invoke_signed是掌握高级 Solana 开发的关键。程序派生地址(PDA)是一种由程序ID和一组种子(seeds)通过哈希算法生成的、没有对应私钥的地址。正因为没有私钥,任何外部用户都无法直接操作它,这使它成为程序专属的、安全的“数据保险箱”。

当程序需要代表一个 PDA 执行操作时(比如从PDA关联的账户中转出代币),就需要使用 invoke_signed。程序在调用时传入生成该PDA所用的种子,Solana运行时会验证这些种子是否能推导出正确的PDA地址。验证通过后,运行时即视同该PDA已经对操作进行了授权。

为何使用 CPI?

  • 原子性保证:一次交易中包含的所有程序调用,要么全部成功,要么全部失败。这避免了中间状态,对于金融操作至关重要。
  • 模块化与复用:开发者可以像搭积木一样,直接调用经过审计的、标准的合约(如代币合约),而无需重复实现通用逻辑,提升了开发效率和安全性。
  • 功能扩展:通过组合不同的程序,可以创造出单一程序无法实现的复杂功能,例如闪电贷等高级DeFi应用。

实际应用简单比方

在实际开发中,高阶框架如 Anchor 对 CPI 进行了大量封装,使得调用变得非常简便。例如,一个众筹合约在收到捐款时,可以通过 CPI 调用系统程序的标准转账指令,将代币从捐款人账户转移到项目账户。另一个典型场景是,一个游戏程序在生成稀有装备时,可以通过 CPI 调用一个可验证随机函数程序来获取随机数。

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
曲弯
曲弯
0xb51E...CADb
江湖只有他的大名,没有他的介绍。