---
title: "什麼是 Solana 上的跨程式呼叫（Cross-Program Invocation）？"
description: "了解跨程式呼叫的定義、運作方式與常見使用情境"
---

# 什麼是 Solana 上的跨程式呼叫（Cross-Program Invocation）？

Solana 上的執行期跨程式呼叫（runtime 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 區塊鏈上建立無需信任（trustless）的去中心化應用程式成為可能。

## **跨程式呼叫有哪些使用情境？**

跨程式呼叫能在 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)，執行交易需要兩個簽署。做法是建立兩個程式：各自負責一個簽署。

當交易發起時，第一個程式驗證第一個簽署，接著呼叫第二個程式驗證第二個簽署，若兩個簽署皆有效，則執行該交易。

### **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 框架，或使用 [Seahorse 框架](https://www.alchemy.com/overviews/solana-seahorse)以 Python 撰寫。

### **步驟 2：將程式編譯為 wasm**

撰寫完程式後，你需要使用合適的編譯器將它們編譯為 Wasm。這會產生一個可由 Solana 執行環境執行的 Wasm 二進位檔。

### **步驟 3：將程式部署至 Solana**

接著，你需要將編譯好的 Wasm 二進位檔部署至 Solana 區塊鏈。這可以透過 [Solana 軟體開發套件（SDK）](https://docs.rs/solana-sdk/latest/solana_sdk/)所提供的 solana-deploy 命令列工具來完成。

### **步驟 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)吧！
