Solana 上的跨程序调用是什么?

本文将帮助您了解 Solana 上的跨程序调用是什么、它们的具体用例以及如何在 Solana 程序中使用它们。


Solana 上的运行时跨程序调用可实现更高效、更灵活的程序开发,是该平台的一个关键功能。跨程序调用 (CPI) 是指 Solana 区块链上的程序调用另一个程序并执行其代码的能力。

什么是跨程序调用 (CPI)?

在运行时跨程序调用中,Solana 上的程序可以调用另一个程序并将数据传递给它,从而可以创建复杂且模块化的智能合约系统。

Solana运行时为执行这些跨程序调用提供了一个安全且去中心化的环境。Solana 的运行时确保被调用的程序正确执行,并以可验证的方式将结果返回给调用程序。这允许在 Solana 区块链上创建无需信任且去中心化的应用程序。

跨程序调用的用例有哪些?

跨程序调用支持 Solana 区块链上的多种用例,例如多重签名交易、代币传输、状态通道、dapp 之间的互操作性、新交易类型以及共享常见功能。 

1. 多重签名(Multisig)交易

多重签名程序是指多方必须签署交易才能在区块链上执行交易。通过跨程序调用,其他程序可以调用多重签名程序来检查交易在处理之前是否具有所需数量的签名。

2. 代币转移

Solana 拥有代币程序,并记录与代币相关的所有交易。这些代币程序可以被其他程序调用,将代币从一个帐户转移到另一个帐户,从而允许创建去中心化交易所等应用程序。

3. 状态通道

Solana 程序可用于实现状态通道,允许链下交易在链上结算。例如,可以使用某个程序为简单的区块链游戏实现状态通道,当玩家移动时,其他程序可以调用该状态程序,然后在链上结算最终状态。

4. dApp 之间的互操作性

跨程序调用使 dApp 能够相互通信并共享数据,从而实现 Solana 网络上不同 dApp 之间更加无缝的交互。

5. 共享通用功能

dApp 可以使用跨程序调用来共享常见功能,例如加密函数或数据存储。这可以减少每个 dApp 需要实现的代码量,并且可以更轻松地在 Solana 上构建 dApp

6. 启用新的交易类型

跨程序调用支持 dapp 之间的新类型的交互,例如一个 dApp 可以从另一个 dapp 请求数据或在另一个 dApp 中触发操作。

无论您是想执行涉及多个程序的复杂业务逻辑(例如在去中心化交易所中),创建需要来自不同程序的多个签名的多重签名钱包,还是使用可组合、可重用的程序进行扩展,实现跨程序调用都是最佳方法。

有哪些跨程序调用的例子?

跨程序调用可以以多种方式使用,包括多重签名钱包、NFT 市场和模块化程序。

1. Solana 多重签名钱包

使用跨程序调用,我们可以创建一个像 Snowflake 这样的多重签名钱包,它需要两个签名才能执行交易。这可以通过创建两个程序来实现:每个签名一个。

当发起一笔交易时,第一个程序验证第一个签名,调用第二个程序来验证第二个签名,如果两个签名都有效,则执行该交易。

2. Solana NFT 市场

跨程序调用也有助于Solana NFT 市场的发展,用于买卖非同质化代币 (NFT)。开发人员可以通过创建一个程序来管理市场,并为市场上交易的每种 NFT 类型创建单独的程序来实现这一点。市场程序可以调用适当的 NFT 程序来验证 NFT 的唯一性和所有权,然后在一切有效的情况下执行交易。

3. 模块化程序

跨程序调用直接有助于创建涉及多个步骤和交互的复杂程序。这是通过创建多个程序来实现的,每个程序处理合约的特定步骤或方面。然后,主合约程序可以根据需要调用其他程序来执行合约的各个步骤。

如何运行跨程序调用

在 Solana 上构建运行时跨程序调用将涉及以下步骤:编写、编译、部署和调用。

步骤 1:编写你的 Solana 程序

首先,您需要编写能够相互调用的程序。这些程序可以使用任何原生 Rust(使用 Anchor 框架)或 Python (使用Seahorse 框架)编写。

步骤 2:将你的程序编译为 Wasm

编写程序后,您需要使用合适的编译器将它们编译为 Wasm。这将生成可由 Solana 运行时执行的 Wasm 二进制文件。

步骤 3:将您的程序部署到 Solana

接下来,您需要将编译后的 Wasm 二进制文件部署到 Solana 区块链。这可以使用 solana-deploy 命令行工具来完成,该工具是Solana 软件开发工具包 (SDK)的一部分。

步骤 4:编写交易来调用你的程序

部署程序后,您可以使用 Solana SDK 编写交易来调用其中一个程序并向其传递数据。此交易将提交到 Solana 区块链,并在其中由运行时环境进行验证和执行。

当被调用的程序执行时,它可以执行 Wasm 运行时内可能的任何计算,包括调用其他程序。计算结果可以返回给调用程序并存储在 Solana 区块链上。

总体而言,在 Solana 上构建运行时跨程序调用涉及编写程序、将其编译为 Wasm、将其部署到区块链以及使用 Solana SDK 在它们之间调用和传递数据。这允许在 Solana 平台上创建复杂且模块化的智能合约系统。

注意: Solana计划租金将根据现有的计划数量而有所不同。

简单实现示例

举例来说,假设您在 Solana 中有两个程序,program1program2,并且您想program2调用program1中的函数process_data。 

你可以这样做:

在program1中,添加一个新函数process_data_interface,该函数以输入数据作为参数并返回输出数据:

fn process_data_interface(input: &[u8]) -> Vec {
    let output = process_data(input);
    return output;
}

program2中,添加代码以调用program1中的process_data_interface,传递输入数据并接收输出数据:

let input = ...;  // obtain input data
let output = program1::process_data_interface(&input);

然后您可以根据需要在program2中使用输出数据。

注意:这只是一个简单的示例,确切的实现将取决于您正在使用的特定程序和功能。您可能需要添加其他代码来处理错误、确保正确的授权等。

开始使用 Solana Runtime 跨程序调用

Solana 有一个关键功能,称为运行时跨程序调用,它允许在其平台上运行的智能合约以安全和去中心化的方式调用其他程序。在 Solana 中,每个程序在区块链上都有一个唯一的地址,并且通过调用要执行的程序的地址来实现 CPI。这允许程序相互交互,并在 Solana 区块链上实现复杂的程序功能。 

总体而言,Solana 运行时 CPI 是Solana 开发人员技能组合的重要组成部分,因为它们允许创建复杂而强大的去中心化应用程序。

本文由 SlerfTools 翻译自 What are cross-program invocations on Solana?