Program Derived
Address(PDA)是 32 字节的账户地址,通过程序 ID 和一组 seed 确定性推导而来。它们保证不会落在 Ed25519 曲线上,这意味着没有对应的私钥。只有用于推导的程序 ID 所属的程序可以为 PDA
“签名”,并且是通过 invoke_signed
在跨程序调用(CPI)时实现的。
Program Derived Address
关键要点
- 确定性:相同的 seed 和程序 ID 总是生成相同的地址。
- 非曲线:推导出的地址会被验证为不是有效的 Ed25519 公钥。如果哈希结果落在曲线上,推导会失败,并尝试不同的 bump seed。
- 无私钥:由于地址是非曲线的,任何人都无法为其生成加密签名。程序会通过运行时的
invoke_signed机制进行“签名”。
何时使用 PDA
- 确定性地址:每次都能用相同的 seed 推导出相同的账户。
- 程序签名:只有拥有该 PDA 的程序可以通过
invoke_signed签名,使程序能够作为自治的权限方。 - 用户作用域状态:可通过用户 pubkey 作为 seed 推导每个用户的账户(如
["user", user_pubkey])。 - 无需 keypair 管理:无需存储或管理私钥,地址完全由 seed 推导而来。
限制
| 限制项 | 数值 | 来源 |
|---|---|---|
| 最大 seed 数量 | 16 | MAX_SEEDS |
| 单个 seed 最大长度 | 每个 seed 最多 32 字节 | MAX_SEED_LEN |
| bump 范围 | 0-255(1 字节) | 作为最后一个 seed 元素附加 |
create_program_address 成本 | 1,500 CUs | 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?