---
title: "什么是 Solana 上的跨程序调用（Cross-Program Invocation）？"
description: "了解跨程序调用是什么、其工作原理以及常见使用场景"
---

# 什么是 Solana 上的跨程序调用（Cross-Program Invocation）？

Solana 上的运行时跨程序调用（cross-program invocation）使[程序开发](https://www.alchemy.com/docs/reference/solana-api-quickstart)更加高效灵活，是该平台的一项关键特性。跨程序调用（Cross Program Invocations，CPIs）指的是 Solana 区块链上的一个程序调用另一个程序并执行其代码的能力。

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

## **什么是跨程序调用（cpis）？**

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

[Solana 运行时](https://docs.solana.com/developing/programming-model/runtime)为执行这些跨程序调用提供了一个安全的去中心化环境。Solana 的运行时确保被调用的程序正确执行，并以可验证的方式将结果返回给调用程序。这使得在 Solana 区块链上构建无需信任的去中心化应用成为可能。

## **跨程序调用有哪些使用场景？**

跨程序调用在 Solana 区块链上支持广泛的使用场景，例如多签交易、代币转账、状态通道、[应用](https://www.alchemy.com/dapps/top/defi-dapps)之间的互操作性、新型交易类型，以及共享通用功能。

### **1. 多重签名（multisig）交易**

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

### **2. 代币转账**

Solana 为所有与代币相关的交易提供了[代币程序和账户](https://www.alchemy.com/overviews/solana-account-model)。这些代币程序可以被其他程序调用，以将代币从一个账户转移到另一个账户，从而支持构建去中心化交易所等应用。

### **3. 状态通道**

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

### **4. 应用之间的互操作性**

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

### **5. 共享通用功能**

应用可以使用跨程序调用来共享通用功能，例如加密函数或数据存储。这可以减少每个 dApp 需要实现的代码量，并使[在 Solana 上构建应用](https://www.alchemy.com/solana)更加容易。

### **6. 支持新型交易类型**

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

无论你是想在涉及多个程序的场景中（例如[去中心化交易所](https://www.alchemy.com/list-of/decentralized-exchanges-on-solana)）实施复杂的业务逻辑，还是想创建需要来自不同程序的多个签名的多签钱包，抑或是想通过可组合、可复用的程序构建可扩展的系统，实现跨程序调用都是最佳方案。

## **跨程序调用有哪些示例？**

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

### **1. Solana 多签钱包**

通过跨程序调用，我们可以创建像[Snowflake 这样的多签钱包](https://www.alchemy.com/dapps/snowflake)，要求两个签名才能执行一笔交易。做法是创建两个程序：每个程序负责一个签名。

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

### **2. Solana NFT 交易市场**

跨程序调用也有助于开发用于买卖非同质化代币（NFT）的[Solana NFT 交易市场](https://www.alchemy.com/list-of/nft-marketplaces-on-solana)。开发者可以通过创建一个管理交易市场的程序，以及为市场上交易的每种 NFT 类型创建独立的程序来实现这一点。交易市场程序可以调用相应的 NFT 程序来验证该 NFT 的唯一性和所有权，如果一切有效，则执行交易。

### **3. 模块化程序**

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

## **如何运行跨程序调用**

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

### **步骤 1：编写你的 Solana 程序**

首先，你需要编写希望彼此调用的程序。这些程序可以使用任意[原生 Rust](https://www.alchemy.com/overviews/solidity-vs-rust) 编写，也可以使用 Anchor 框架，或使用 Python 结合[Seahorse 框架](https://www.alchemy.com/overviews/solana-seahorse)编写。

### **步骤 2：将程序编译为 wasm**

编写完程序后，你需要使用合适的编译器将其编译为 Wasm。这将生成一个可由 Solana 运行时执行的 Wasm 二进制文件。

### **步骤 3：将程序部署到 Solana**

接下来，你需要将编译好的 Wasm 二进制文件部署到 Solana 区块链。可以使用 solana-deploy 命令行工具完成此操作，该工具是 [Solana 软件开发工具包（SDK）](https://docs.rs/solana-sdk/latest/solana_sdk/)的一部分。

### **步骤 4：编写交易以调用你的程序**

部署程序后，你可以使用 Solana SDK 编写一笔交易，调用其中一个程序并向其传递数据。该交易会被提交到 Solana 区块链，由运行时环境进行验证和执行。

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

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

**注意：**[Solana 程序租金费用](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)会根据存在的程序数量而有所不同。

### **简单的实现示例**

举例来说，假设你在 Solana 上有两个程序 _program1_ 和 _program2_，你想从 _program2_ **调用** _program1_ 中的函数 _process_data_。

**你可以按以下方式实现：**

在 _program1_ 中，添加一个新函数 _process_data_interface_，该函数接收输入数据作为参数并返回输出数据：

在 _program2_ 中，添加代码来调用 _program1_ 中的 _process_data_interface_，传递输入数据并接收输出数据：

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

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

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

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

总体而言，Solana 运行时 CPI 是[Solana 开发者技能集](https://www.alchemy.com/overviews/learn-solana-development)的重要组成部分，因为它们支持构建复杂而强大的去中心化应用。

如果你想开启 Solana 开发和 CPI 的学习之旅，现在就注册一个[Alchemy 账户](https://dashboard.alchemy.com/signup/?a=cross-program-invocation)吧！
