Solana 中的 Owner 和 Authority

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

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 条评论

请先 登录 后评论
0xE
0xE
0x59f6...a17e
17年进入币圈,Web3 开发者。刨根问底探链上真相,品味坎坷悟 Web3 人生。