---
title: "Solana のクロスプログラム呼び出し(CPI)とは"
description: "クロスプログラム呼び出しとは何か、その仕組みと主なユースケースを解説"
---

# Solana のクロスプログラム呼び出し(CPI)とは

SolanaにおけるランタイムのCross Program Invocationは、より効率的で柔軟な[プログラム開発](https://www.alchemy.com/docs/reference/solana-api-quickstart)を可能にし、プラットフォームの重要な機能となっている。Cross Program Invocations（CPI）とは、Solanaブロックチェーン上のプログラムが別のプログラムを呼び出し、そのコードを実行する能力を指す。

この記事では、Solanaにおけるcross program invocationとは何か、その具体的なユースケース、そしてSolanaプログラムでの使い方について解説する。

## **Cross-program invocations（CPI）とは何か？**

**ランタイムのcross-program invocationでは、Solana上のあるプログラムが別のプログラムを呼び出し、データを渡すことができる。これにより、複雑でモジュール化されたスマートコントラクトシステムの構築が可能になる。**

[Solanaランタイム](https://docs.solana.com/developing/programming-model/runtime)は、これらのcross-program invocationを実行するための安全で分散化された環境を提供する。Solanaのランタイムは、呼び出されたプログラムが正しく実行され、その結果が検証可能な形で呼び出し元のプログラムに返されることを保証する。これにより、Solanaブロックチェーン上でトラストレスかつ分散化されたアプリケーションの構築が可能になる。

## **Cross-program invocationsのユースケースとは？**

Cross-program invocationsは、マルチシグトランザクション、トークン転送、ステートチャネル、[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)間の相互運用性、新しいトランザクションタイプ、共通機能の共有など、Solanaブロックチェーン上で幅広いユースケースを可能にする。

### **1. マルチシグネチャ（マルチシグ）トランザクション**

マルチシグネチャプログラムとは、ブロックチェーン上でトランザクションが実行される前に、複数の当事者による署名が必要となるプログラムである。cross-program invocationsを使えば、マルチシグプログラムを他のプログラムから呼び出し、処理前にトランザクションが必要な署名数を満たしているかを確認できる。

### **2. トークン転送**

Solanaには、トークンに関連するすべてのトランザクションを扱う[トークンプログラムとアカウント](https://www.alchemy.com/overviews/solana-account-model)がある。これらのトークンプログラムは他のプログラムから呼び出すことができ、あるアカウントから別のアカウントへトークンを転送できる。これにより、分散型取引所のようなアプリケーションの構築が可能になる。

### **3. ステートチャネル**

Solanaのプログラムは、オフチェーンのトランザクションをオンチェーンで決済するステートチャネルの実装に利用できる。例えば、シンプルなブロックチェーンゲーム用のステートチャネルを実装する場合、プレイヤーが手を打つたびに他のプログラムからステートプログラムを呼び出し、最終的な状態をオンチェーンで決済する、といった形が考えられる。

### **4. アプリ間の相互運用性**

Cross-program invocationsにより、アプリ同士が通信しデータを共有できるようになり、Solanaネットワーク上の異なるアプリ間でより円滑なやり取りが可能になる。

### **5. 共通機能の共有**

アプリはcross-program invocationsを使って、暗号関数やデータストレージといった共通機能を共有できる。これにより各dAppが実装すべきコード量を削減でき、[Solana上でのアプリ構築](https://www.alchemy.com/solana)が容易になる。

### **6. 新しいトランザクションタイプの実現**

Cross-program invocationsは、あるdAppが別のdAppからデータをリクエストしたり、別のdApp内でアクションをトリガーしたりするなど、アプリ間の新しい相互作用のタイプを可能にする。

[分散型取引所](https://www.alchemy.com/list-of/decentralized-exchanges-on-solana)のように複数のプログラムにまたがる複雑なビジネスロジックを実装したい場合、異なるプログラムからの複数署名を必要とするマルチシグウォレットを作りたい場合、あるいは組み合わせ可能で再利用可能なプログラムでスケールを目指したい場合、cross-program invocationsを実装することが最善のアプローチとなる。

## **Cross-program invocationsの実装例にはどのようなものがあるか？**

**Cross-program invocationsは、マルチシグウォレット、NFTマーケットプレイス、モジュール化されたプログラムなど、さまざまな形で利用できる。**

### **1. Solanaマルチシグウォレット**

cross-program invocationsを使うことで、トランザクションの実行に2つの署名を必要とする[Snowflakeのようなマルチシグウォレット](https://www.alchemy.com/dapps/snowflake)を作成できる。これは、それぞれの署名を担当する2つのプログラムを作成することで実現できる。

トランザクションが開始されると、1つ目のプログラムが1番目の署名を検証し、2つ目のプログラムを呼び出して2番目の署名を検証する。両方の署名が有効であれば、トランザクションが実行される。

### **2. Solana NFTマーケットプレイス**

Cross-program invocationsは、非代替性トークン（NFT）の売買を行う[Solana NFTマーケットプレイス](https://www.alchemy.com/list-of/nft-marketplaces-on-solana)の開発にも役立つ。開発者は、マーケットプレイスを管理するプログラムと、マーケットプレイスで取引される各NFTタイプごとの個別のプログラムを作成することでこれを実現できる。マーケットプレイスプログラムは、該当するNFTプログラムを呼び出してNFTの一意性と所有権を検証し、すべて問題がなければ取引を実行する。

### **3. モジュール化されたプログラム**

Cross-program invocationsは、複数のステップやインタラクションを伴う複雑なプログラムの作成に直接役立つ。これは、それぞれ契約の特定のステップや側面を処理する複数のプログラムを作成することで実現される。メインの契約プログラムは、契約の各ステップを実行するために必要に応じて他のプログラムを呼び出すことができる。

## **Cross-program invocationsの実行方法**

Solanaでランタイムのcross-program invocationを構築するには、記述、コンパイル、デプロイ、呼び出しという以下のステップが必要になる。

### **ステップ1：Solanaプログラムを書く**

まず、互いに呼び出し合えるようにしたいプログラムを書く必要がある。これらのプログラムは、Anchorフレームワークを使った[ネイティブRust](https://www.alchemy.com/overviews/solidity-vs-rust)、あるいは[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上でランタイムのcross-program invocationを構築するには、プログラムを書き、Wasmにコンパイルし、ブロックチェーンにデプロイし、Solana SDKを使ってプログラム間でデータを呼び出し・受け渡す、という一連の作業が必要になる。これにより、Solanaプラットフォーム上で複雑かつモジュール化されたスマートコントラクトシステムを構築できる。

**注：** [Solanaプログラムのrentフィー](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)は、存在するプログラムの数によって変動する。

### **実装のシンプルな例**

例として、Solana上に_program1_と_program2_という2つのプログラムがあり、_program2_**から**_program1_内の関数_process_data_を呼び出したいとする。

**その方法は以下の通りだ：**

_program1_に、入力データをパラメータとして受け取り、出力データを返す新しい関数_process_data_interface_を追加する：

_program2_に、_program1_の_process_data_interface_を呼び出し、入力データを渡して出力データを受け取るコードを追加する：

その後、_program2_内で必要に応じてその出力データを使用できる。

**注**：これはあくまで簡単な例であり、実際の実装は取り扱う具体的なプログラムや関数によって異なる。エラー処理や適切な認可の確保などのために、追加のコードが必要になる場合がある。

## **Solanaランタイムのcross program invocationsを始める**

Solanaには、プラットフォーム上で動作するスマートコントラクトが他のプログラムを安全かつ分散化された形で呼び出せるようにする、ランタイムCross Program Invocationsという重要な機能がある。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)にサインアップしよう！
