Solana のクロスプログラム呼び出し(CPI)とは
執筆者 Tau
SolanaにおけるランタイムのCross Program Invocationは、より効率的で柔軟なプログラム開発を可能にし、プラットフォームの重要な機能となっている。Cross Program Invocations(CPI)とは、Solanaブロックチェーン上のプログラムが別のプログラムを呼び出し、そのコードを実行する能力を指す。
この記事では、Solanaにおけるcross program invocationとは何か、その具体的なユースケース、そしてSolanaプログラムでの使い方について解説する。
Cross-program invocations(CPI)とは何か?
ランタイムのcross-program invocationでは、Solana上のあるプログラムが別のプログラムを呼び出し、データを渡すことができる。これにより、複雑でモジュール化されたスマートコントラクトシステムの構築が可能になる。
Solanaランタイムは、これらのcross-program invocationを実行するための安全で分散化された環境を提供する。Solanaのランタイムは、呼び出されたプログラムが正しく実行され、その結果が検証可能な形で呼び出し元のプログラムに返されることを保証する。これにより、Solanaブロックチェーン上でトラストレスかつ分散化されたアプリケーションの構築が可能になる。
Cross-program invocationsのユースケースとは?
Cross-program invocationsは、マルチシグトランザクション、トークン転送、ステートチャネル、アプリ間の相互運用性、新しいトランザクションタイプ、共通機能の共有など、Solanaブロックチェーン上で幅広いユースケースを可能にする。
1. マルチシグネチャ(マルチシグ)トランザクション
マルチシグネチャプログラムとは、ブロックチェーン上でトランザクションが実行される前に、複数の当事者による署名が必要となるプログラムである。cross-program invocationsを使えば、マルチシグプログラムを他のプログラムから呼び出し、処理前にトランザクションが必要な署名数を満たしているかを確認できる。
2. トークン転送
Solanaには、トークンに関連するすべてのトランザクションを扱うトークンプログラムとアカウントがある。これらのトークンプログラムは他のプログラムから呼び出すことができ、あるアカウントから別のアカウントへトークンを転送できる。これにより、分散型取引所のようなアプリケーションの構築が可能になる。
3. ステートチャネル
Solanaのプログラムは、オフチェーンのトランザクションをオンチェーンで決済するステートチャネルの実装に利用できる。例えば、シンプルなブロックチェーンゲーム用のステートチャネルを実装する場合、プレイヤーが手を打つたびに他のプログラムからステートプログラムを呼び出し、最終的な状態をオンチェーンで決済する、といった形が考えられる。
4. アプリ間の相互運用性
Cross-program invocationsにより、アプリ同士が通信しデータを共有できるようになり、Solanaネットワーク上の異なるアプリ間でより円滑なやり取りが可能になる。
5. 共通機能の共有
アプリはcross-program invocationsを使って、暗号関数やデータストレージといった共通機能を共有できる。これにより各dAppが実装すべきコード量を削減でき、Solana上でのアプリ構築が容易になる。
6. 新しいトランザクションタイプの実現
Cross-program invocationsは、あるdAppが別のdAppからデータをリクエストしたり、別のdApp内でアクションをトリガーしたりするなど、アプリ間の新しい相互作用のタイプを可能にする。
分散型取引所のように複数のプログラムにまたがる複雑なビジネスロジックを実装したい場合、異なるプログラムからの複数署名を必要とするマルチシグウォレットを作りたい場合、あるいは組み合わせ可能で再利用可能なプログラムでスケールを目指したい場合、cross-program invocationsを実装することが最善のアプローチとなる。
Cross-program invocationsの実装例にはどのようなものがあるか?
Cross-program invocationsは、マルチシグウォレット、NFTマーケットプレイス、モジュール化されたプログラムなど、さまざまな形で利用できる。
1. Solanaマルチシグウォレット
cross-program invocationsを使うことで、トランザクションの実行に2つの署名を必要とするSnowflakeのようなマルチシグウォレットを作成できる。これは、それぞれの署名を担当する2つのプログラムを作成することで実現できる。
トランザクションが開始されると、1つ目のプログラムが1番目の署名を検証し、2つ目のプログラムを呼び出して2番目の署名を検証する。両方の署名が有効であれば、トランザクションが実行される。
2. Solana NFTマーケットプレイス
Cross-program invocationsは、非代替性トークン(NFT)の売買を行うSolana NFTマーケットプレイスの開発にも役立つ。開発者は、マーケットプレイスを管理するプログラムと、マーケットプレイスで取引される各NFTタイプごとの個別のプログラムを作成することでこれを実現できる。マーケットプレイスプログラムは、該当するNFTプログラムを呼び出してNFTの一意性と所有権を検証し、すべて問題がなければ取引を実行する。
3. モジュール化されたプログラム
Cross-program invocationsは、複数のステップやインタラクションを伴う複雑なプログラムの作成に直接役立つ。これは、それぞれ契約の特定のステップや側面を処理する複数のプログラムを作成することで実現される。メインの契約プログラムは、契約の各ステップを実行するために必要に応じて他のプログラムを呼び出すことができる。
Cross-program invocationsの実行方法
Solanaでランタイムのcross-program invocationを構築するには、記述、コンパイル、デプロイ、呼び出しという以下のステップが必要になる。
ステップ1:Solanaプログラムを書く
まず、互いに呼び出し合えるようにしたいプログラムを書く必要がある。これらのプログラムは、Anchorフレームワークを使ったネイティブRust、あるいはSeahorseフレームワークを使ったPythonで書くことができる。
ステップ2:プログラムをWasmにコンパイルする
プログラムを書き終えたら、適切なコンパイラを使ってWasmにコンパイルする必要がある。これにより、Solanaランタイムが実行できるWasmバイナリが生成される。
ステップ3:プログラムをSolanaにデプロイする
次に、コンパイル済みのWasmバイナリをSolanaブロックチェーンにデプロイする必要がある。これは、SolanaのSDKに含まれるsolana-deployコマンドラインツールを使って行うことができる。
ステップ4:プログラムを呼び出すトランザクションを書く
プログラムをデプロイした後は、Solana SDKを使って、いずれかのプログラムを呼び出しデータを渡すトランザクションを書くことができる。このトランザクションはSolanaブロックチェーンに送信され、ランタイム環境によって検証・実行される。
呼び出されたプログラムが実行されると、他のプログラムの呼び出しを含め、Wasmランタイム内で可能なあらゆる計算を実行できる。計算の結果は呼び出し元のプログラムに返され、Solanaブロックチェーン上に保存できる。
まとめると、Solana上でランタイムのcross-program invocationを構築するには、プログラムを書き、Wasmにコンパイルし、ブロックチェーンにデプロイし、Solana SDKを使ってプログラム間でデータを呼び出し・受け渡す、という一連の作業が必要になる。これにより、Solanaプラットフォーム上で複雑かつモジュール化されたスマートコントラクトシステムを構築できる。
注: Solanaプログラムのrentフィーは、存在するプログラムの数によって変動する。
実装のシンプルな例
例として、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開発者に求められるスキルセットの重要な一部であり、複雑かつ強力な分散型アプリケーションの構築を可能にする。
Solana開発とCPIへの取り組みを始めたい方は、今すぐAlchemyアカウントにサインアップしよう!
関連する概要
Solana2026年7月27日
Solanaノード:バリデーター、RPCノード、セルフホスティング
Solanaノードとは何か、バリデーター、RPCノード、セカンダリーデータシステムの違い、そしてセルフホストとプロバイダー利用をどう使い分けるか。
Solana2026年7月22日
Solanaアーカイブデータ: ブロックとトランザクションの全履歴をクエリする方法
Solanaアーカイブデータの解説: ノードが履歴をプルーニングする理由、アーカイブアクセスが必要なRPCメソッド、大規模にブロックとトランザクションの全履歴をクエリする方法。
Solana2026年5月28日
Solana Agent Kit vs GOAT vs ElizaOS:どのフレームワークを使うべきか?
Solana Agent Kit、GOAT、ElizaOSを比較:Solanaネイティブな深さ、マルチチェーンの広さ、フルエージェントランタイムのいずれかを選ぶ。コード例と意思決定フレームワークを掲載。

ブロックチェーンで魔法を生み出す
Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。