Program Derived Address(PDA)

Program Derived Address(PDA)是 32 字节的账户地址,通过程序 ID 和一组 seed 确定性推导而来。它们保证不会落在 Ed25519 曲线上,这意味着没有对应的私钥。只有用于推导的程序 ID 所属的程序可以为 PDA “签名”,并且是通过 invoke_signed 在跨程序调用(CPI)时实现的。

Program Derived AddressProgram Derived Address

关键要点

  • 确定性:相同的 seed 和程序 ID 总是生成相同的地址。
  • 非曲线:推导出的地址会被验证为不是有效的 Ed25519 公钥。如果哈希结果落在曲线上,推导会失败,并尝试不同的 bump seed。
  • 无私钥:由于地址是非曲线的,任何人都无法为其生成加密签名。程序会通过运行时的 invoke_signed 机制进行“签名”。

何时使用 PDA

  • 确定性地址:每次都能用相同的 seed 推导出相同的账户。
  • 程序签名:只有拥有该 PDA 的程序可以通过 invoke_signed 签名,使程序能够作为自治的权限方。
  • 用户作用域状态:可通过用户 pubkey 作为 seed 推导每个用户的账户(如 ["user", user_pubkey])。
  • 无需 keypair 管理:无需存储或管理私钥,地址完全由 seed 推导而来。

限制

限制项数值来源
最大 seed 数量16MAX_SEEDS
单个 seed 最大长度每个 seed 最多 32 字节MAX_SEED_LEN
bump 范围0-255(1 字节)作为最后一个 seed 元素附加
create_program_address 成本1,500 CUscreate_program_address_units
find_program_address 最坏情况成本1,500 初始 + 1,500 x 迭代次数进入时 1,500 + 每次 bump 失败再加 1,500
每次 CPI 最大 PDA 签名者数量16MAX_SIGNERS

Is this page helpful?

Table of Contents

Edit Page

管理者

©️ 2026 Solana 基金会版权所有
取得联系