Program Derived Address (PDA)

Program Derived Address (PDA) は、プログラムIDとシードのセットから決定論的に導出される32バイトのアカウントアドレスです。これらはEd25519曲線上に存在しないことが保証されており、秘密鍵は存在しません。導出に使用されたIDを持つプログラムのみがPDAに対して「署名」でき、クロスプログラム呼び出し (CPI) 中にinvoke_signedを通じて行われます。

Program Derived AddressProgram Derived Address

主要な特徴

  • 決定論的: 同じシードとプログラムIDは常に同じアドレスを生成します。
  • 曲線外: 導出されたアドレスは、有効なEd25519公開鍵ではないことが検証されます。ハッシュが曲線上に位置する場合、導出は失敗し、異なるbump seedが試行されます。
  • 秘密鍵なし: アドレスが曲線外であるため、誰も暗号署名を生成できません。プログラムは、ランタイムの*rsinvoke_signed*メカニズムを介して「署名」します。

PDAを使用する場合

  • 決定論的アドレス指定: 同じシードから毎回同じアカウントを導出します。
  • プログラム署名: 所有プログラムのみが*rsinvoke_signed*を介して署名でき、プログラムが自律的な権限として機能できます。
  • ユーザースコープの状態: ユーザーpubkeyシードからユーザーごとのアカウントを導出します (例: ["user", user_pubkey])。
  • keypair管理不要: 保存または紛失する秘密鍵がありません。アドレスは純粋にシードから導出されます。

制限

制限ソース
最大seed数16MAX_SEEDS
最大seed長seed毎に最大32バイトMAX_SEED_LEN
Bump範囲0-255 (1バイト)最後のseed要素として追加
create_program_addressコスト1,500 CUcreate_program_address_units
find_program_address最悪ケースコスト1,500エントリー + 1,500 x 反復回数エントリー時に1,500 + 失敗したbump毎に1,500
CPI毎の最大PDA署名者数16MAX_SIGNERS

Is this page helpful?

目次

ページを編集

管理運営

© 2026 Solana Foundation.
無断転載を禁じます。
つながろう