Program Derived Address
(PDA) は、プログラムIDとシードのセットから決定論的に導出される32バイトのアカウントアドレスです。これらはEd25519曲線上に存在しないことが保証されており、秘密鍵は存在しません。導出に使用されたIDを持つプログラムのみがPDAに対して「署名」でき、クロスプログラム呼び出し (CPI) 中にinvoke_signedを通じて行われます。
Program Derived Address
PDA導出
導出アルゴリズム、正規のbump、異なるシードタイプを使用したfindProgramAddressの例。
PDAアカウント
PDAアドレスでのアカウント作成、invoke_signed署名、Anchorパターン。
主要な特徴
- 決定論的: 同じシードとプログラムIDは常に同じアドレスを生成します。
- 曲線外: 導出されたアドレスは、有効なEd25519公開鍵ではないことが検証されます。ハッシュが曲線上に位置する場合、導出は失敗し、異なるbump seedが試行されます。
- 秘密鍵なし: アドレスが曲線外であるため、誰も暗号署名を生成できません。プログラムは、ランタイムの*rs
invoke_signed*メカニズムを介して「署名」します。
PDAを使用する場合
- 決定論的アドレス指定: 同じシードから毎回同じアカウントを導出します。
- プログラム署名: 所有プログラムのみが*rs
invoke_signed*を介して署名でき、プログラムが自律的な権限として機能できます。 - ユーザースコープの状態: ユーザーpubkeyシードからユーザーごとのアカウントを導出します (例:
["user", user_pubkey])。 - keypair管理不要: 保存または紛失する秘密鍵がありません。アドレスは純粋にシードから導出されます。
制限
| 制限 | 値 | ソース |
|---|---|---|
| 最大seed数 | 16 | MAX_SEEDS |
| 最大seed長 | seed毎に最大32バイト | MAX_SEED_LEN |
| Bump範囲 | 0-255 (1バイト) | 最後のseed要素として追加 |
create_program_addressコスト | 1,500 CU | create_program_address_units |
find_program_address最悪ケースコスト | 1,500エントリー + 1,500 x 反復回数 | エントリー時に1,500 + 失敗したbump毎に1,500 |
| CPI毎の最大PDA署名者数 | 16 | MAX_SIGNERS |
Is this page helpful?