Solana中的程序派生地址(PDAs):是什么,为什么,以及如何?

本文详细介绍了Solana中的程序派生地址(PDA),包括PDA的定义、创建方式及其与常规账户的区别,应用场景以及安全隐患。PDA作为智能合约中的独特特性,能够为开发者提供灵活和安全的数据存储方案,但在使用时需关注其潜在的安全问题。

程序派生地址 (PDA) 在 Solana 中的应用:什么、为什么和如何?

在学习 Solana 时,你会经常听到关于 程序派生地址 (PDAs) 的讨论。它们就像这样 —— 强大、多功能,而且最重要的是,稍微被误解。如果你是一个开发者,试图理解它们,不用担心。我们将在本文中一起揭开 PDAs 的面纱。

在本文中,我将从基础开始解释 PDAs,假设你刚刚开始接触 Solana。因此,不需要任何先前的知识 —— 让我们开始吧。

什么是 PDA?

让我们简单开始。程序派生地址 (PDA) 是 Solana 中一种特殊的地址。我们都知道 Solana 使用账户存储所有数据,而 Solana 程序天生是无状态的。与普通账户(如你的钱包)不同,PDAs 没有私钥。相反,它们是 在运行时由程序生成和管理的

可以把 PDAs 想象成 程序控制的储物柜

• 每个储物柜 (PDA) 属于特定的程序。

• 只有程序可以访问、控制它,并使用它来存储数据。

• 没有人类可以直接为 PDA 签名交易,因为没有私钥可丢失或被盗。

PDAs 是通过以下方式生成的:

  1. 种子:输入数据(如用户 ID 或自定义字符串)。

  2. 程序 ID:控制 PDA 的程序。

  3. 哈希函数:确保 PDA 是唯一和安全的。

重要提示 — PDA 是 确定性的:相同的输入将始终生成相同的 PDA。

PDA 与普通账户有什么不同?

你可能会想,“如果 PDA 只是一个地址,那它和我的钱包或其他账户有什么不同呢?”

下面是一个对比,让它更清晰:

普通账户是你用于钱包或与应用程序交互的账户。而 PDA 则是 程序拥有的账户 —— 只有程序可以与之交互。

PDA 何时以及如何使用?

以下是 PDA 常见的使用时机和方式:

1. 数据存储

程序通常使用 PDA 来存储数据。由于 PDA 是以可预测的方式生成的,因此程序不需要跟踪它们的地址。

它可以在需要时计算它们。

示例:一个游戏程序可以为每个玩家创建一个 PDA,以存储他们的分数、库存和成就。

2. 代币账户

许多程序使用 PDA 来管理代币账户。例如,质押程序创建 PDA 来表示你的质押,这直接与你的钱包相关,并且只有质押程序会对此拥有控制权。

为什么选择 PDA? 因为它们安全,并且完全由程序控制 —— 没有用户可以篡改它们。

3. 资金托管和多签名

PDA 非常适合临时持有资金(例如,在托管系统中)或管理多签名钱包。它们充当公正的账户,仅在满足程序规则时执行交易。

如何创建 PDA?

PDA 是使用 find_program_address 函数创建的。其工作原理如下:

  1. 提供 种子(如“user123”或 user_pubkey)。

  2. 将其与 程序 ID 组合。

  3. 该函数输出 PDA 和一个 增量种子(以避免冲突)。

以下是 Rust 语言中的示例:

let (pda, bump_seed) = Pubkey::find_program_address(
    &[b"user-seed", user_pubkey.as_ref()],
    program_id
);

这将生成一个只有程序可以控制的 PDA。同样的输入对于 user-seed 和公钥将始终导致相同的 PDA —— 没有意外!

静态程序拥有账户的问题:

  1. 本质上是静态的:

— 程序拥有的账户通常在程序初始化时手动创建。

— 每个账户需要明确资助(以免租金)并存储。

  1. 每个用户或用例的唯一账户:

— 如果你的程序需要为许多用户提供单独的账户(例如,特定于用户的托管或质押账户),使用普通程序拥有账户将会要求:

— 为每个用户预生成许多账户。

— 手动跟踪每个账户地址。

— 在前期产生额外的费用(租金豁免)对每个账户。

  1. 灵活性有限:

使用普通程序拥有账户,程序无法根据用户输入或事件动态生成新地址。

这些限制使普通程序拥有账户不适合动态、可扩展的应用,如质押池、流动性协议或特定于用户的数据管理。

PDA 的安全隐患

PDA 是酷炫而强大的,但它们并非没有奇怪之处。如果使用不当,可能会导致严重的安全问题。让我们讨论一些需要注意的陷阱。

1. 不应将 PDA 用于授权

这是黄金法则。PDA 没有私钥,这意味着它们无法签署交易。如果你使用 PDA 来授权敏感操作(如转账),你就邀请了麻烦。攻击者可以轻松计算 PDA 并绕过你的检查。

注意:始终使用密码学签名进行用户授权。

2. 唯一的种子至关重要

在生成 PDA 时,确保你的种子是唯一的。如果两个 PDA 产生相同的种子,你将覆盖数据。这就像给两个人相同的储物柜钥匙 —— 混乱将随之而来。

3. 不要在 PDA 中存储敏感数据

PDA 是公共的。任何人都可以计算地址并查看里面的内容。如果你需要存储敏感数据,请先加密它。

结论

程序派生地址 (PDA) 是 Solana 的一个独特特性,为智能合约带来了确定性控制。它们灵活、强大且安全 —— 只要你负责任地使用它们。通过了解它们的工作原理和局限性,你可以在你的 Solana 程序中解锁全新的功能级别。

记住:PDA 没有私钥。因此,如果你在等待一个来签署某个东西,你将永远等下去。祝你编码愉快!

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

0 条评论

请先 登录 后评论
OxElliot
OxElliot
https://tusharbhatia43.medium.com/