什么是Solana PDA?解释与示例(2025)

  • Helius
  • 发布于 1天前
  • 阅读 38

本文详细介绍了Solana中的程序派生地址(PDA)的概念和应用,PDA作为一种键值数据存储,能够独立存取和更新数据,并为Solana智能合约提供高效的并发处理能力。文章提供了四个具体实例,展示了PDA在资产存储、程序数据管理、可配置参数以及代币转账中的使用,为开发者理解和应用PDAs提供了实用的视角。

感谢 0xIchigo 的审阅、Unboxed Software 的电影评论程序,以及 Paul Verhoeven 的《机器人警察》。

Solana 程序(智能合约)将其数据存储在称为程序派生地址(PDAs)的独立账户中。

PDAs 可以独立访问和更新,从而减少争用并允许并行处理。

虽然 PDAs 不是一个困难的概念,但对新开发者来说,理解起来可能会比较困难。

本文将帮助你将 PDAs 理解为键/值存储,并分享四个 PDAs 的实际示例。

让我们开始吧。

PDAs 作为键/值数据存储

键/值存储在区块链出现之前的编程中已经存在很多年。它们是一种快速查找数据的方式。在存储中查找给定键的值时,总是可以找到相同的数据。

Solana 的编程模型中,程序的键/值存储就是 PDA 系统。

每一条数据的 是由程序员决定的输入种子生成的一种特殊地址。

相同的种子总是生成相同的地址,因此任何人都可以确定性地找到给定种子集的数据。

PDA 地址绝不会与实际的公钥冲突,因为它们的值是“离曲线”,即,用于生成 PDA 的地址在数学上与存在于 Solana 的 Ed25519 曲线的公钥值是不同的。

是一个结构体(或对象),包含你作为程序作者想要存储的字段和值。

用示例来解释 PDA 可能更好,所以我们就这样做吧。

1. 用于存储与钱包关联的代币的 PDA

让我们从其他人的程序开始——一个你已经使用过的程序。你已经知道你的钱包中有不同的代币,并且每个代币都有自己的余额。欢迎来到 PDAs 的第一个示例!

你每个代币余额存储在一个 PDA 账户中,种子由 关联代币账户 程序决定。

让我们看看它是如何工作的:

Solana PDA 示例 1:关联代币程序 - YouTube

视频回顾

程序:关联代币账户程序

账户目的:存储你钱包中独特代币的余额

种子:钱包地址和代币的铸造地址

数据:该钱包的此代币余额

好处:

有一个规范的位置可以查找用户持有的特定代币,由于用户余额存储在独立账户中,因此可以并行运行更多交易,使 Solana 快速!

2. 用于存储程序数据的 PDA

好吧,但是我们如何在 Solana 程序中使用 PDAs 作为通用数据存储?在设计 PDA 的种子和数据时,我们需要考虑什么?

Solana PDA 示例 2:存储用户特定数据 - YouTube

视频回顾

程序:一个电影评论程序,利用资产所有权来确保评论更可能是真实的

账户目的:存储每个资产所有者对一部电影的评论

种子:钱包地址、电影名称和发行年份

数据

  1. 一篇书面评论(string
  2. 从 0-10 的评分,存储为 u8

好处:

有一个规范的位置可以查找用户对特定电影的评论。用户可以并行更新他们的评论而不会互相阻塞。我们智能的 PDA 设计确保每个用户对一部电影只有一条评论,并处理边缘情况,例如坏人重拍《机器人警察》。

3. 用于设置程序可配置值的 PDA

在创建你自己的应用程序时,你可能会有一些想要在程序生命周期中设置的可配置值:

  • 常量值(例如,你平台的费用)
  • 程序将使用的代币的铸造地址列表
  • 可以任意启用和禁用的功能标志
  • 你的程序是活动还是暂停(例如,允许管理员账户暂停程序是许多区块链程序的典型紧急停止特性)

我们不想为了改变这些值而升级程序,所以让我们把配置放入一个 PDA 账户中!我们可以创建一些指令处理程序来更新这些值,并检查传入的指令是否由指定的“管理员”账户签名。

在这种情况下,我们将有一个包含允许的公钥列表的配置,这样我们可以限制谁可以与我们的程序交互,但我们可以添加其他我们想要的配置设置。

这是一个有趣的例子,因为 PDAs 可以被用来存储像这样的全局配置可能并不明显!

Solana PDA 示例 3:程序配置 - YouTube

视频回顾

程序:你创建的任何程序

账户目的:存储一些动态可更新的配置

种子:"config"

数据:我们的配置,在这种情况下,是一个允许列表和管理员账户

  • allow_list:允许使用此应用程序的用户的公钥向量
  • authority:可以更改这些设置的账户的公钥(Solana 应用程序通常使用“authority”一词传达某种权限)。我们将确保该账户签署特权操作!

好处:

与其将某些配置硬编码到源代码中,我们可以在程序中使用指令函数实时更新它。

我们的配置更新也不会被与之无关的数据更改所阻塞。在第一次部署程序时,你也希望运行 intialize_config() 并设置你的权限!

4. 用于拥有和转移代币的 PDA

PDAs 不仅用于存储数据。PDAs 还可以拥有自己的代币账户。我们的程序随后作为 PDA 签署交易,以将代币从这些代币账户转移到其他地方。这使我们的程序能够存储和转移价值:

Solana PDA 示例 4:拥有代币账户的 PDA - YouTube

视频回顾

程序:交换程序

账户目的

  1. 存储交换提议的详细信息,特别是提议者希望以其供应的代币换取的代币及其数量。
  2. 该 PDA 拥有一个代币账户,存储供应的代币。PDA 可以签署交易并将代币从该账户转移到接收方。

种子:"offer",一个提议 ID(只要它尚未被占用的任何标识符),以及提议者的地址

数据

  • maker_wanted_token:希望换取的代币,以铸造地址的公钥表示
  • maker_wanted_amount:希望的代币数量(u64

好处:

这个 PDA 使用户能够存储数据,并且还作为代币账户的拥有者,以存储代币并将其转移到其他账户。

总结

以上是四个关于 Solana PDA 的实际示例。

首先,关联代币账户程序使用 PDAs 存储你的钱包所持有的每个代币的余额。

第二,你编写的程序可以 存储与特定用户相关联的数据,使用他们的公钥或特定数据项,使用你为它们设置的 ID

第三,程序可以 在 PDA 中存储它们自己的配置,并限制只有管理员的指令处理程序可以修改这些设置。

第四,你的 PDAs 可以拥有自己的代币账户,允许你的程序持有资金。你的程序只需指定拥有它们的 PDA 的种子,就可以为使用这些代币的交易进行“签名”。

PDAs 不仅使 Solana 更加快速,还提供了一个完整的键/值存储,使你的程序能够快速查找基于指定种子的数据信息。

使用 PDAs 玩得开心,并观看更多 Paul Verhoeven 的电影!

  • 原文链接: helius.dev/blog/solana-p...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Helius
Helius
https://www.helius.dev/