当前位置: 首页 > news >正文

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

程序派生地址 (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 没有私钥。因此,如果你在等待一个来签署某个东西,你将永远等下去,请,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 官网。选择适合的版…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...