跳至内容
0%

什么是 Solana 上的跨程序调用(Cross-Program Invocation)?

作者 Tau

发布于 2023年1月25日1 分钟阅读

Solana 上的运行时跨程序调用(cross-program invocation)使程序开发更加高效灵活,是该平台的一项关键特性。跨程序调用(Cross Program Invocations,CPIs)指的是 Solana 区块链上的一个程序调用另一个程序并执行其代码的能力。

本文将帮助你理解 Solana 上的跨程序调用是什么、其具体使用场景,以及如何在你的 Solana 程序中使用它们。

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

在运行时跨程序调用中,Solana 上的一个程序可以调用另一个程序并向其传递数据,从而支持构建复杂的模块化智能合约系统。

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

跨程序调用有哪些使用场景?

跨程序调用在 Solana 区块链上支持广泛的使用场景,例如多签交易、代币转账、状态通道、应用之间的互操作性、新型交易类型,以及共享通用功能。

1. 多重签名(multisig)交易

多重签名程序要求多方在交易执行前对其进行签名。借助跨程序调用,多签程序可以被其他程序调用,以在交易被处理前检查其是否具备所需数量的签名。

2. 代币转账

Solana 为所有与代币相关的交易提供了代币程序和账户。这些代币程序可以被其他程序调用,以将代币从一个账户转移到另一个账户,从而支持构建去中心化交易所等应用。

3. 状态通道

Solana 程序可用于实现状态通道,从而支持链下交易并在链上结算。例如,一个程序可以用于实现简单区块链游戏的状态通道,其中状态程序可以在玩家做出动作时被其他程序调用,并最终在链上结算最终状态。

4. 应用之间的互操作性

跨程序调用使应用之间能够相互通信并共享数据,从而让 Solana 网络上不同应用之间的交互更加顺畅。

5. 共享通用功能

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

6. 支持新型交易类型

跨程序调用使应用之间产生新型交互成为可能,例如一个 dApp 可以向另一个 dApp 请求数据,或触发另一个 dApp 中的某个动作。

无论你是想在涉及多个程序的场景中(例如去中心化交易所)实施复杂的业务逻辑,还是想创建需要来自不同程序的多个签名的多签钱包,抑或是想通过可组合、可复用的程序构建可扩展的系统,实现跨程序调用都是最佳方案。

跨程序调用有哪些示例?

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

1. Solana 多签钱包

通过跨程序调用,我们可以创建像Snowflake 这样的多签钱包,要求两个签名才能执行一笔交易。做法是创建两个程序:每个程序负责一个签名。

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

2. Solana NFT 交易市场

跨程序调用也有助于开发用于买卖非同质化代币(NFT)的Solana 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,该函数接收输入数据作为参数并返回输出数据:

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

然后你就可以根据需要在 program2 中使用这些输出数据。

注意:这只是一个简单示例,具体实现将取决于你所使用的具体程序和函数。你可能需要添加额外的代码来处理错误、确保适当的授权等。

开始使用 Solana 运行时跨程序调用

Solana 有一项关键特性叫做运行时跨程序调用,它使运行在该平台上的智能合约能够以安全、去中心化的方式调用其他程序。在 Solana 中,每个程序在区块链上都有一个唯一的地址,CPI 就是通过调用你想执行的程序的地址来实现的。这使得程序之间能够相互交互,并在 Solana 区块链上支持复杂的程序功能。

总体而言,Solana 运行时 CPI 是Solana 开发者技能集的重要组成部分,因为它们支持构建复杂而强大的去中心化应用。

如果你想开启 Solana 开发和 CPI 的学习之旅,现在就注册一个Alchemy 账户吧!

Background gradient

构建区块链应用

Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。