
SolanaのPDAとは?解説と事例(2026年)
レビューを担当してくれた0xIchigo、映画レビュープログラムを提供してくれたUnboxed Software、そして『ロボコップ』のPaul Verhoevenに感謝します。
Solanaプログラム(スマートコントラクト)は、Program Derived Address(PDA)と呼ばれる個別のアカウントにデータを保存します。
PDAには個別にアクセスして更新できるため、競合を減らして並列処理を可能にします。
PDA自体は難しい概念ではありませんが、初めて学ぶ開発者には理解しにくい場合があります。
この記事では、PDAをKey/Valueストアとして捉える方法を説明し、4つの実用例を紹介します。
それでは始めましょう。
Key/ValueデータストアとしてのPDA
Key/Valueストアは、ブロックチェーンが登場する何年も前からプログラミングで使われてきました。データをすばやく見つけるための仕組みです。ストア内で特定のキーの値を検索すると、常に同じデータが見つかります。
Solanaのプログラミングモデルでは、プログラムのKey/Valueストアに相当するのがPDAシステムです。
各データのキーは、プログラマーが指定した入力シードから生成される特殊なアドレスです。
同じシードからは常に同じアドレスが生成されるため、誰でも特定のシードセットに対応するデータを決定論的に見つけられます。
PDAアドレスの値は「オフカーブ」であるため、実際の公開鍵と競合することはありません。つまり、PDA用に生成されるアドレスは、SolanaのEd25519曲線上に存在する公開鍵の値とは数学的に異なります。
値は、プログラム作成者が保存したいフィールドと値を持つ構造体(またはオブジェクト)です。
PDAは事例を通して説明するのが最も分かりやすいため、実際に見ていきましょう。
1. ウォレットに関連付けられたトークンを保存するPDA
まずは、すでに利用したことがある他者のプログラムから始めます。ウォレットには複数のトークンがあり、それぞれに個別の残高があることはご存じでしょう。これがPDAの最初の事例です。
各トークンの残高はPDAアカウントに保存され、シードは関連トークンアカウントプログラムによって決定されます。
具体的な仕組みを見てみましょう。
動画のまとめ
プログラム:関連トークンアカウントプログラム
アカウントの目的:ウォレット内にある特定のトークンの残高を保存すること
シード:ウォレットアドレスとトークンのミントアドレス
データ:このウォレットが保有するこのトークンの残高
メリット:
ユーザーが保有する特定のトークンを確認するための標準的な保存場所があります。また、ユーザーの残高が個別のアカウントに保存されるため、より多くのトランザクションを並列実行でき、Solanaの高速性につながります。
2. プログラムのデータを保存するPDA
では、SolanaプログラムでPDAを汎用データストアとして使うにはどうすればよいのでしょうか。PDAのシードとデータを設計する際に、何を考慮すべきでしょうか。
動画のまとめ
プログラム:アセットの所有権を利用して、レビューの信頼性を高める映画レビュープログラム
アカウントの目的:各アセット所有者による映画レビューを保存すること
シード:ウォレットアドレス、映画名、公開年
データ:
- テキスト形式のレビュー(
string) u8として保存される0~10の評価
メリット:
ユーザーによる特定の映画のレビューを確認するための標準的な保存場所があります。ユーザーは互いをブロックすることなく、レビューを並列に更新できます。PDAを適切に設計することで、1本の映画につきユーザーごとに1件のレビューのみを許可し、悪意のある人物が『ロボコップ』をリメイクするといったエッジケースにも対応できます。
3. プログラムの設定可能な値を保存するPDA
独自のアプリを作成する場合、プログラムのライフサイクルを通じて設定したい値がいくつかあるでしょう。
- 定数値(プラットフォームの手数料など)
- プログラムで使用するトークンのミントアドレス一覧
- 必要に応じて有効化または無効化できる機能フラグ
- プログラムが稼働中か一時停止中か(管理者アカウントによるプログラムの一時停止は、多くのブロックチェーンプログラムで一般的な緊急停止機能です)
これらの値を変更するだけのためにプログラムをアップグレードするのは避けたいので、設定をPDAアカウントに保存しましょう。値を更新する命令ハンドラーを用意し、受信した命令が指定された「管理者」アカウントによって署名されていることを確認できます。
ここでは、プログラムを操作できるユーザーを制限するため、許可された公開鍵のリストを設定に含めますが、必要に応じてほかの設定も追加できます。
PDAにこのようなグローバル設定を保存できることは分かりにくい場合があるため、興味深い事例です。
動画のまとめ
プログラム:作成した任意のプログラム
アカウントの目的:動的に更新できる設定を保存すること
シード:"config"
データ:この例では、許可リストと管理者アカウントからなる設定
allow_list:このアプリの使用を許可されたユーザーの公開鍵ベクターauthority:これらの設定を変更できるアカウントの公開鍵(Solanaアプリでは、通常、何らかの権限を表すためにauthorityという言葉を使用します)。このアカウントが権限付き操作に署名するようにします。
メリット:
特定の設定をソースコードにハードコードする代わりに、プログラム内の命令関数を使ってその場で更新できます。
また、関連のないデータの変更によって設定の更新がブロックされることもありません。プログラムを初めてデプロイするときは、intialize_config()も実行して権限を設定します。
4. トークンを所有・転送するPDA
PDAはデータの保存だけに使うものではありません。PDA自体がトークンアカウントを所有することもできます。その場合、プログラムはPDAとしてトランザクションに署名し、トークンアカウントから別の場所へトークンを移動します。これにより、プログラムで価値を保存し、転送できます。
動画のまとめ
プログラム:スワッププログラム
アカウントの目的:
- スワップオファーの詳細、具体的には、オファー作成者が提供したトークンと引き換えに希望するトークンの種類と数量を保存すること。
- このPDAは、提供されたトークンを保存するトークンアカウントを所有します。PDAはトランザクションに署名し、このアカウントから受取人へトークンを転送できます。
シード:"offer"、オファーID(未使用であれば任意の識別子)、作成者のアドレス
データ:
maker_wanted_token:対価として希望するトークン。トークンのミントアドレスの公開鍵として指定しますmaker_wanted_amount:希望するトークンの数量(u64)
メリット:
このPDAにより、ユーザーはデータを保存できるだけでなく、トークンアカウントの所有者としてトークンを保有し、ほかのアカウントへ転送できます。
まとめ
以上、SolanaのPDAに関する4つの実用例を紹介しました。
1つ目に、関連トークンアカウントプログラムは、PDAを使用してウォレットが所有する各トークンの残高を保存します。
2つ目に、作成したプログラムは、ユーザーの公開鍵を使って特定のユーザーに関連するデータを保存したり、設定したIDを使って特定のデータ項目に関連するデータを保存したりできます。
3つ目に、プログラムは独自の設定をPDAに保存し、管理者専用の命令ハンドラーによって設定を変更できるユーザーを制限できます。
4つ目に、PDAは独自のトークンアカウントを所有できるため、プログラムで資金を保有できます。所有するPDAのシードを指定するだけで、プログラムはこれらのトークンを使用するトランザクションに「代理署名」できます。
PDAはSolanaを高速化するだけでなく、指定したシードに基づいてプログラムがデータをすばやく検索できる、完全なKey/Valueストアも提供します。
PDAを存分に活用し、Paul Verhoevenの映画もさらに楽しんでください!
関連記事
Heliusを購読
Solana開発の最新情報や新しい記事の公開通知を受け取れます


