Solana 学习开发之旅

2025年04月03日更新 33 人订阅
原价: ¥ 20 限时优惠
专栏简介 【Solana】使用 CLI 创建 SPL 标准的 Token 以及基础使用 【Solana】完善 SPL Token 名称和 Logo 【Solana】创建 SPL 标准的 NFT 以及完善 metadata 【Solana】一些基本的js脚本 【Solana】Anchor 框架使用笔记 【Solana】Anchor 示例:通过 CPI 实现 Sol 转账与手续费收取 Solana Hello World: 安装与开发指南 Solana 与 Rust 算术入门—从 Solidity 到 Anchor Solana Anchor 程序接口定义语言(IDL) Solana Anchor 框架下的 Require 与自定义错误 Solana 程序:支持升级与无构造函数实现 Solidity 开发者必知的 Rust 语法基础 Rust 的独特语法解析 Rust 类函数宏解析 Rust 结构体、属性宏与自定义派生宏 Rust 与 Solana 中的可见性及模块化复用 Solana 中的时钟与其他区块变量 Solana 系统变量详解 Solana 日志、事件日志与历史交易查询 Solana 中的Tx.origin、msg.sender 和 onlyOwner Solana 计算单元与交易费用概述 Solana 与 Anchor 中的账户初始化 Solana 计数器教程:账户数据的读写 使用 Solana Web3.js 和 Anchor 读取账户数据 在 Solana 中实现映射表与嵌套映射表 Solana 存储成本、最大容量与账户调整 在 Anchor 中读取账户余额:Solana 的 address(account).balance Solana 中的函数修饰符与 Fallback 函数:为何不存在 Solana 中的 SOL 转移与分割:取代 msg.value 的设计 使用不同签名者修改账户:Solana 中的权限控制 PDA 与密钥对账户:Solana 中的地址与权限模型 Anchor 中的 init_if_needed 与重新初始化攻击防范 Solana 中的 Multicall:批处理交易和交易大小的限制 Solana 中的 Owner 和 Authority 删除和关闭 Solana 中的账户和程序 在 Anchor 中的 #[derive(Accounts)] 不同类型的账户 在链上读取另一个 Anchor 程序的账户数据 Anchor 中的跨程序调用

Solana 中的 Owner 和 Authority

  • 0xE
  • 发布于 2025-04-02 10:19
  • 阅读 1555

Solana 中的 Owner 是负责修改账户数据的程序,而 Authority 是通过签名触发操作的钱包,二者共同定义了数据控制与权限的机制。

Solana 的初学者常对 “Owner(所有者)” 和 “Authority(权限)” 的区别感到困惑。本文旨在简洁清晰地解释这两个概念,帮助开发者理解其在 Solana 生态中的作用和实现方式,同时结合示例和对比加深理解。


Owner 和 Authority 的区别

在 Solana 中,只有程序能修改账户数据,且仅限于其拥有的账户。程序无法随意写入其他账户的数据。

然而,程序本身不会主动操作,需要外部指令触发。这些指令通常来自特定的钱包地址,即 Authority。简单来说:

  • Owner:账户的所有者,是一个程序,负责执行数据修改。
  • Authority:权限持有者,通常是钱包,通过签名交易触发程序操作。

账户在 Solana 中具有以下字段:

  • Public Key:账户地址。
  • Lamport Balance:余额。
  • Owner:所有者程序的地址。
  • Executable:是否可执行。
  • Rent Epoch:租金周期(免租账户可忽略)。
  • Data:存储的数据。

运行以下命令可查看:

solana account 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot

输出:

Public Key: 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot
Balance: 499999998.582436085 SOL
Owner: 11111111111111111111111111111111
Executable: false

钱包的 Owner 是系统程序(111...111),而非用户自身。这是因为只有 Owner 能改数据,用户通过签名交易请求系统程序更新余额。这种模式在 Solana 中反复出现:Authority 提供签名,Owner 执行修改。


实战验证 Owner 的作用

通过一个初始化程序验证 Owner 的行为。在测试中添加:

console.log(`program: ${program.programId.toBase58()}`);
console.log(`storage account: ${myStorage.toBase58()}`);

运行结果为:

  other_write
program: 26Kiu5LSV5xXDN3yGwE8L6aU59kKRKdyyKtSQv5Vu5VC
storage account: 5N1mVpqBqK7LjZ768DMc9ngWso6XkieEHQmC636jEtgw
    ✔ Is initialized! (691ms)

然后运行solana account <storage account>

solana account 5N1mVpqBqK7LjZ768DMc9ngWso6XkieEHQmC636jEtgw 

可以看到 owner 是程序地址:

Public Key: 5N1mVpqBqK7LjZ768DMc9ngWso6XkieEHQmC636jEtgw
Balance: 0.00100224 SOL
Owner: 26Kiu5LSV5xXDN3yGwE8L6aU59kKRKdyyKtSQv5Vu5VC
Executable: false
Rent Epoch: 18446744073709551615
Length: 16 (0x10) bytes
0000:   1c f2 3b 85  43 19 31 28  00 00 00 00  00 00 00 00   ..;.C.1(........

程序拥有存储账户,所以能够向存储账户中写入数据。用户只能通过交易请求程序写入数据。


与 Solidity 的 Owner 对比

在 Solidity 中,owner 通常指的是拥有智能合约管理权限的特殊地址。这一概念并非以太坊运行时层面的原生特性,而是 Solidity 合约中常见的一种设计模式。与此相对,Solana 中的 owner 概念则更为基础。在以太坊上,智能合约仅限于修改自身的存储槽。然而,如果存在一种机制,允许智能合约写入其他存储槽,那么在 Solana 的术语体系中,这些存储槽的归属地址就会被称为它们的 owner。


Authority 的两种角色

Authority 在 Solana 中既可是程序级权限,也可是账户级权限。例如:

#[account]
pub struct Player {
    points: u32,
    authority: Pubkey
}

这里,authority 存储在账户中...

剩余50%的内容订阅专栏后可查看

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论