在Solana中,程序派生地址(PDA)有两个主要用途:
- 确定性账户地址:通过组合可选“种子”(预定义输入)和特定程序ID来确定性地派生地址。
- 启用程序签名:Solana运行时允许程序对派生自其程序ID的PDA进行“签名”。
可以将PDA看作是通过预定义输入(例如字符串、数字和其他账户地址)在链上创建类似哈希表结构的一种方式。
这种方法的好处在于,它消除了对准确地址的跟踪需求。 相反,您只需记住用于其派生的特定输入。
重要的是要明白,简单地派生程序派生地址(PDA)不会自动在该地址上创建链上账户。
以 PDA 作为链上地址的账户必须通过用于派生地址的程序明确创建。
你可以将派生 PDA 理解为在地图上找到地址。仅有地址并不意味着该位置上有任何建筑物。
本节将涵盖有关推导 PDAs 的详细信息。 有关程序如何使用 PDAs 进行签名的细节将在跨程序调用 (CPIs) 部分中进行讨论, 因为这需要两个概念的上下文。
关键点
- 通过使用用户定义的种子、
bump seed和程序的 ID 的组合,确定性地推导出 PDAs 地址。 - PDAs 是指偏离
Ed25519曲线且没有相应私钥的地址。 - Solana 程序可以通过其程序 ID 为使用该程序 ID 推导出的 PDAs 进行程序化“签名”。
- 推导
PDA不会自动创建链上账户。 - 使用
PDA作为地址的账户必须通过 Solana 程序内的专用指令显式创建。
什么是PDA
PDA是确定性派生的地址,类似标准公钥,但没有关联的私钥。
外部用户无法为该地址生成有效签名。
然而,Solana运行时允许程序无需私钥即可程序化地对PDA进行“签名”。
在上下文中,Solana Keypairs 是 Ed25519 曲线上的点(椭圆曲线加密),具有公钥和对应的私钥。
我们经常使用公钥作为新的链上账户的唯一标识符,私钥用于签名。
PDA 是使用预定义的一组输入故意导出到 Ed25519 曲线之外的点 。
不在 Ed25519 曲线上的点没有有效的对应私钥,无法用于加密操作(签名)。
PDA 然后可以用作链上账户的地址(唯一标识符), 提供一种便捷的存储、映射和获取程序状态的方法。
如何派生PDA
派生PDA需要三个输入:
- 可选种子:用于派生PDA的预定义输入(如字符串、数字、其他账户地址), 这些输入转换为字节缓冲区。
- 递增种子:保证生成有效PDA的附加输入(值在
255到0之间)。 递增种子附加到可选种子后用于生成PDA,将点“推离”Ed25519曲线。 - 程序ID:用于派生PDA的程序地址,也是可以代表PDA“签名”的程序。
使用findProgramAddressSync方法可以派生PDA,输入可选种子的字节缓冲区和程序ID。
找到有效PDA后,该方法返回地址(PDA)和递增种子。
以下示例包含指向Solana Playground的链接,在那里您可以在基于浏览器的编辑器中运行示例。