Program-Derived Address 是一个位于 Ed25519 曲线之外的 Solana 地址,因此并不存在与之对应的私钥。PDA 的计算方式是:把程序 ID、一组 seeds 以及一字节的 bump 一起哈希,反复尝试直到结果落到曲线之外。只有拥有它的程序才能通过 invoke_signed 替这个 PDA 签发交易,因此 PDA 是程序在不依赖外部密钥的前提下保存状态、托管资产的标准做法。
SolMask 在每个池里使用五个 PDA:pool(持有配置的程序状态账户)、vault(托管存款的 SPL token 账户)、fee_vault(协议费累计账户)、merkle_frontier(Merkle 树的追加端,并包含叶子计数器)以及 root_history(最近有效 root 的环形缓冲区)。
PDA 是确定性的:只要拿到程序 ID 与 seeds,任何客户端都能算出同一个地址。relayer、indexer 和你的钱包因此可以在不依赖任何带外配置的情况下,一致地认定哪一个账户保存着池的状态。