本文详细介绍了Solana中的程序派生地址(PDA)的概念和应用,PDA作为一种键值数据存储,能够独立存取和更新数据,并为Solana智能合约提供高效的并发处理能力。文章提供了四个具体实例,展示了PDA在资产存储、程序数据管理、可配置参数以及代币转账中的使用,为开发者理解和应用PDAs提供了实用的视角。
感谢 0xIchigo 的审阅、Unboxed Software 的电影评论程序,以及 Paul Verhoeven 的《机器人警察》。
Solana 程序(智能合约)将其数据存储在称为程序派生地址(PDAs)的独立账户中。
PDAs 可以独立访问和更新,从而减少争用并允许并行处理。
虽然 PDAs 不是一个困难的概念,但对新开发者来说,理解起来可能会比较困难。
本文将帮助你将 PDAs 理解为键/值存储,并分享四个 PDAs 的实际示例。
让我们开始吧。
键/值存储在区块链出现之前的编程中已经存在很多年。它们是一种快速查找数据的方式。在存储中查找给定键的值时,总是可以找到相同的数据。
在 Solana 的编程模型中,程序的键/值存储就是 PDA 系统。
每一条数据的 键 是由程序员决定的输入种子生成的一种特殊地址。
相同的种子总是生成相同的地址,因此任何人都可以确定性地找到给定种子集的数据。
PDA 地址绝不会与实际的公钥冲突,因为它们的值是“离曲线”,即,用于生成 PDA 的地址在数学上与存在于 Solana 的 Ed25519 曲线的公钥值是不同的。
值 是一个结构体(或对象),包含你作为程序作者想要存储的字段和值。
用示例来解释 PDA 可能更好,所以我们就这样做吧。
让我们从其他人的程序开始——一个你已经使用过的程序。你已经知道你的钱包中有不同的代币,并且每个代币都有自己的余额。欢迎来到 PDAs 的第一个示例!
你每个代币余额存储在一个 PDA 账户中,种子由 关联代币账户 程序决定。
让我们看看它是如何工作的:
Solana PDA 示例 1:关联代币程序 - YouTube
程序:关联代币账户程序
账户目的:存储你钱包中独特代币的余额
种子:钱包地址和代币的铸造地址
数据:该钱包的此代币余额
有一个规范的位置可以查找用户持有的特定代币,由于用户余额存储在独立账户中,因此可以并行运行更多交易,使 Solana 快速!
好吧,但是我们如何在 Solana 程序中使用 PDAs 作为通用数据存储?在设计 PDA 的种子和数据时,我们需要考虑什么?
Solana PDA 示例 2:存储用户特定数据 - YouTube
程序:一个电影评论程序,利用资产所有权来确保评论更可能是真实的
账户目的:存储每个资产所有者对一部电影的评论
种子:钱包地址、电影名称和发行年份
数据:
string
)u8
有一个规范的位置可以查找用户对特定电影的评论。用户可以并行更新他们的评论而不会互相阻塞。我们智能的 PDA 设计确保每个用户对一部电影只有一条评论,并处理边缘情况,例如坏人重拍《机器人警察》。
在创建你自己的应用程序时,你可能会有一些想要在程序生命周期中设置的可配置值:
我们不想为了改变这些值而升级程序,所以让我们把配置放入一个 PDA 账户中!我们可以创建一些指令处理程序来更新这些值,并检查传入的指令是否由指定的“管理员”账户签名。
在这种情况下,我们将有一个包含允许的公钥列表的配置,这样我们可以限制谁可以与我们的程序交互,但我们可以添加其他我们想要的配置设置。
这是一个有趣的例子,因为 PDAs 可以被用来存储像这样的全局配置可能并不明显!
Solana PDA 示例 3:程序配置 - YouTube
程序:你创建的任何程序
账户目的:存储一些动态可更新的配置
种子:"config"
数据:我们的配置,在这种情况下,是一个允许列表和管理员账户
allow_list
:允许使用此应用程序的用户的公钥向量authority
:可以更改这些设置的账户的公钥(Solana 应用程序通常使用“authority”一词传达某种权限)。我们将确保该账户签署特权操作!与其将某些配置硬编码到源代码中,我们可以在程序中使用指令函数实时更新它。
我们的配置更新也不会被与之无关的数据更改所阻塞。在第一次部署程序时,你也希望运行 intialize_config()
并设置你的权限!
PDAs 不仅用于存储数据。PDAs 还可以拥有自己的代币账户。我们的程序随后作为 PDA 签署交易,以将代币从这些代币账户转移到其他地方。这使我们的程序能够存储和转移价值:
Solana PDA 示例 4:拥有代币账户的 PDA - YouTube
程序:交换程序
账户目的:
种子:"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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!