Solana中的程序派生地址(PDAs):是什么,为什么,以及如何?
程序派生地址 (PDA) 在 Solana 中的应用:什么、为什么和如何?
在学习 Solana 时,你会经常听到关于 程序派生地址 (PDAs) 的讨论。它们就像这样 —— 强大、多功能,而且最重要的是,稍微被误解。如果你是一个开发者,试图理解它们,不用担心。我们将在本文中一起揭开 PDAs 的面纱。
在本文中,我将从基础开始解释 PDAs,假设你刚刚开始接触 Solana。因此,不需要任何先前的知识 —— 让我们开始吧。
什么是 PDA?
让我们简单开始。程序派生地址 (PDA) 是 Solana 中一种特殊的地址。我们都知道 Solana 使用账户存储所有数据,而 Solana 程序天生是无状态的。与普通账户(如你的钱包)不同,PDAs 没有私钥。相反,它们是 在运行时由程序生成和管理的。
可以把 PDAs 想象成 程序控制的储物柜:
• 每个储物柜 (PDA) 属于特定的程序。
• 只有程序可以访问、控制它,并使用它来存储数据。
• 没有人类可以直接为 PDA 签名交易,因为没有私钥可丢失或被盗。
PDAs 是通过以下方式生成的:
-
种子:输入数据(如用户 ID 或自定义字符串)。
-
程序 ID:控制 PDA 的程序。
-
哈希函数:确保 PDA 是唯一和安全的。
重要提示 — PDA 是 确定性的:相同的输入将始终生成相同的 PDA。
PDA 与普通账户有什么不同?
你可能会想,“如果 PDA 只是一个地址,那它和我的钱包或其他账户有什么不同呢?”
下面是一个对比,让它更清晰:
普通账户是你用于钱包或与应用程序交互的账户。而 PDA 则是 程序拥有的账户 —— 只有程序可以与之交互。
PDA 何时以及如何使用?
以下是 PDA 常见的使用时机和方式:
1. 数据存储
程序通常使用 PDA 来存储数据。由于 PDA 是以可预测的方式生成的,因此程序不需要跟踪它们的地址。
它可以在需要时计算它们。
示例:一个游戏程序可以为每个玩家创建一个 PDA,以存储他们的分数、库存和成就。
2. 代币账户
许多程序使用 PDA 来管理代币账户。例如,质押程序创建 PDA 来表示你的质押,这直接与你的钱包相关,并且只有质押程序会对此拥有控制权。
为什么选择 PDA? 因为它们安全,并且完全由程序控制 —— 没有用户可以篡改它们。
3. 资金托管和多签名
PDA 非常适合临时持有资金(例如,在托管系统中)或管理多签名钱包。它们充当公正的账户,仅在满足程序规则时执行交易。
如何创建 PDA?
PDA 是使用 find_program_address 函数创建的。其工作原理如下:
-
提供 种子(如“user123”或 user_pubkey)。
-
将其与 程序 ID 组合。
-
该函数输出 PDA 和一个 增量种子(以避免冲突)。
以下是 Rust 语言中的示例:
let (pda, bump_seed) = Pubkey::find_program_address(&[b"user-seed", user_pubkey.as_ref()],program_id
);
这将生成一个只有程序可以控制的 PDA。同样的输入对于 user-seed 和公钥将始终导致相同的 PDA —— 没有意外!
静态程序拥有账户的问题:
- 本质上是静态的:
— 程序拥有的账户通常在程序初始化时手动创建。
— 每个账户需要明确资助(以免租金)并存储。
- 每个用户或用例的唯一账户:
— 如果你的程序需要为许多用户提供单独的账户(例如,特定于用户的托管或质押账户),使用普通程序拥有账户将会要求:
— 为每个用户预生成许多账户。
— 手动跟踪每个账户地址。
— 在前期产生额外的费用(租金豁免)对每个账户。
- 灵活性有限:
使用普通程序拥有账户,程序无法根据用户输入或事件动态生成新地址。
这些限制使普通程序拥有账户不适合动态、可扩展的应用,如质押池、流动性协议或特定于用户的数据管理。
PDA 的安全隐患
PDA 是酷炫而强大的,但它们并非没有奇怪之处。如果使用不当,可能会导致严重的安全问题。让我们讨论一些需要注意的陷阱。
1. 不应将 PDA 用于授权
这是黄金法则。PDA 没有私钥,这意味着它们无法签署交易。如果你使用 PDA 来授权敏感操作(如转账),你就邀请了麻烦。攻击者可以轻松计算 PDA 并绕过你的检查。
注意:始终使用密码学签名进行用户授权。
2. 唯一的种子至关重要
在生成 PDA 时,确保你的种子是唯一的。如果两个 PDA 产生相同的种子,你将覆盖数据。这就像给两个人相同的储物柜钥匙 —— 混乱将随之而来。
3. 不要在 PDA 中存储敏感数据
PDA 是公共的。任何人都可以计算地址并查看里面的内容。如果你需要存储敏感数据,请先加密它。
结论
程序派生地址 (PDA) 是 Solana 的一个独特特性,为智能合约带来了确定性控制。它们灵活、强大且安全 —— 只要你负责任地使用它们。通过了解它们的工作原理和局限性,你可以在你的 Solana 程序中解锁全新的功能级别。
记住:PDA 没有私钥。因此,如果你在等待一个来签署某个东西,你将永远等下去,请,https://t.me/+_QibemQqIIg1OTY1
相关文章:

Solana中的程序派生地址(PDAs):是什么,为什么,以及如何?
程序派生地址 (PDA) 在 Solana 中的应用:什么、为什么和如何? 在学习 Solana 时,你会经常听到关于 程序派生地址 (PDAs) 的讨论。它们就像这样 —— 强大、多功能,而且最重要的是,稍微被误解。如果你是一个开发者&…...

利用FatJar彻底解决Jar包冲突(一)
利用FatJar彻底解决Jar包冲突 序FatJar的加载与隔离⼀、 FatJar概念⼆、FatJar的加载三、FatJar的隔离四、隔离机制验证五、 FatJar的定位六、 打包注意点 序 今天整理旧电脑里的资料,偶然翻到大概10年前实习时写的笔记,之前经常遇到Java依赖冲突的问题…...
Spring MVC笔记
01 什么是Spring MVC Spring MVC 是 Spring 框架中的一个核心模块,专门用于构建 Web 应用程序。它基于经典的 MVC 设计模式(Model-View-Controller),但通过 Spring 的特性(如依赖注入、注解驱动)大幅简化了…...

BurpSuite插件jsEncrypter使用教程
一、前言 在当今Web应用安全测试中,前端加密已成为开发者保护敏感数据的常用手段。然而,这也给安全测试人员带来了挑战,传统的抓包方式难以获取明文数据,测试效率大打折扣。BurpSuite作为一款强大的Web安全测试工具,其…...

【C#实现手写Ollama服务交互,实现本地模型对话】
前言 C#手写Ollama服务交互,实现本地模型对话 最近使用C#调用OllamaSharpe库实现Ollama本地对话,然后思考着能否自己实现这个功能。经过一番查找,和查看OllamaSharpe源码发现确实可以。其实就是开启Ollama服务后,发送HTTP请求&a…...
Android Glide 框架线程管理模块原理的源码级别深入分析
一、引言 在现代的 Android 应用开发中,图片加载是一个常见且重要的功能。Glide 作为一款广泛使用的图片加载框架,以其高效、灵活和易用的特点受到了开发者的青睐。其中,线程管理模块是 Glide 框架中至关重要的一部分,它负责协调…...
每天记录一道Java面试题---day32
MySQL索引的数据结构、各自优劣 回答重点 B树:是一个平衡的多叉树,从根节点到每个叶子节点的高度差不超过1,而且同层级的节点间有指针相互连接。在B树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大…...

Vue3 Pinia 符合直觉的Vue.js状态管理库
Pinia 符合直觉的Vue.js状态管理库 什么时候使用Pinia 当两个关系非常远的组件,要传递参数时使用Pinia组件的公共参数使用Pinia...
深度学习与大模型基础-向量
大家好!今天我们来聊聊向量(Vector)。别被这个词吓到,其实向量在我们的生活中无处不在,只是我们没注意罢了。 1. 向量是什么? 简单来说,向量就是有大小和方向的量。比如你从家走到学校&#x…...
【网络编程】完成端口 IOCP
10.11 完成端口 10.11.1 基本概念 完成端口的全称是I/O 完成端口,英文为IOCP(I/O Completion Port) 。IOCP是一个异 步I/O 的 API, 可以高效地将I/O 事件通知给应用程序。与使用select() 或是其他异步方法不同 的是,一个套接字与一个完成端口关联了起来…...

《苍穹外卖》SpringBoot后端开发项目重点知识整理(DAY1 to DAY3)
目录 一、在本地部署并启动Nginx服务1. 解压Nginx压缩包2. 启动Nginx服务3. 验证Nginx是否启动成功: 二、导入接口文档1. 黑马程序员提供的YApi平台2. YApi Pro平台3. 推荐工具:Apifox 三、Swagger1. 常用注解1.1 Api与ApiModel1.2 ApiModelProperty与Ap…...
管理网络安全
防火墙在 Linux 系统安全中有哪些重要的作用? 防火墙作为网络安全的第一道防线,能够根据预设的规则,对进出系统的网络流量进行严格筛选。它可以阻止未经授权的外部访问,只允许符合规则的流量进入系统,从而保护系统免受…...

明日直播|Go IoT 开发平台,开启万物智联新征程
在物联网技术飞速发展的当下,物联网行业却深受协议碎片化、生态封闭、开发低效等难题的困扰。企业和开发者们渴望找到一个能突破这些困境,实现高效、便捷开发的有力工具。 3 月 11 日(星期二)19:00,GitCode 特别邀请独…...

系统架构设计师—系统架构设计篇—软件架构风格
文章目录 概述经典体系结构风格数据流风格批处理管道过滤器对比 调用/返回风格主程序/子程序面向对象架构风格层次架构风格 独立构件风格进程通信事件驱动的系统 虚拟机风格解释器基于规则的系统 仓库风格(数据共享风格)数据库系统黑板系统超文本系统 闭…...

【MySQL_04】数据库基本操作(用户管理--配置文件--远程连接--数据库信息查看、创建、删除)
文章目录 一、MySQL 用户管理1.1 用户管理1.11 mysql.user表详解1.12 添加用户1.13 修改用户权限1.14 删除用户1.15 密码问题 二、MySQL 配置文件2.1 配置文件位置2.2 配置文件结构2.3 常用配置参数 三、MySQL远程连接四、数据库的查看、创建、删除4.1 查看数据库4.2 创建、删除…...
【Zinx】Day5-Part4:Zinx 的连接属性设置
目录 Day5-Part4:Zinx 的连接属性设置给连接添加连接配置的接口连接属性方法的实现 测试 Zinx-v1.0总结 Day5-Part4:Zinx 的连接属性设置 在 Zinx 当中,我们使用 Server 来开启服务并监听指定的端口,当接收到来自客户端的连接请求…...

【英伟达AI论文】多模态大型语言模型的高效长视频理解
摘要:近年来,基于视频的多模态大型语言模型(Video-LLMs)通过将视频处理为图像帧序列,显著提升了视频理解能力。然而,许多现有方法在视觉主干网络中独立处理各帧,缺乏显式的时序建模,…...

小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡
在微信小程序中,事件分为 冒泡事件 和 非冒泡事件 : 冒泡事件:当一个组件的事件被触发后,该事件会向父节点传递;(如果父节点中也绑定了一个事件,父节点事件也会被触发,也就是说子组…...
全球首款 5G-A 人形机器人发布
全球首款 5G-A 人形机器人于世界移动通信大会(MWC2025)上由中国移动、华为、乐聚联合发布。以下是关于这款机器人的详细介绍: 名称与背景 名称9:这款人形机器人名为 “夸父”,是中国移动、华为与乐聚机器人在 GTI 平台…...
Tomcat 新手入门指南
Tomcat 新手入门指南 Apache Tomcat 是一个开源的 Java Servlet 容器和 Web 服务器,广泛用于部署和运行 Java Web 应用程序。以下是 Tomcat 的入门指南,帮助你快速上手。 1. 安装 Tomcat 步骤 1: 下载 Tomcat 访问 Apache Tomcat 官网。选择适合的版…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...