Solana 中的 Owner 是负责修改账户数据的程序,而 Authority 是通过签名触发操作的钱包,二者共同定义了数据控制与权限的机制。
Solana 的初学者常对 “Owner(所有者)” 和 “Authority(权限)” 的区别感到困惑。本文旨在简洁清晰地解释这两个概念,帮助开发者理解其在 Solana 生态中的作用和实现方式,同时结合示例和对比加深理解。
在 Solana 中,只有程序能修改账户数据,且仅限于其拥有的账户。程序无法随意写入其他账户的数据。
然而,程序本身不会主动操作,需要外部指令触发。这些指令通常来自特定的钱包地址,即 Authority。简单来说:
账户在 Solana 中具有以下字段:
运行以下命令可查看:
solana account 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot
输出:
Public Key: 5NhLjdFKocoRMqic9sqAe5TxLagJCoCBunzg51ioMYot
Balance: 499999998.582436085 SOL
Owner: 11111111111111111111111111111111
Executable: false
钱包的 Owner 是系统程序(111...111),而非用户自身。这是因为只有 Owner 能改数据,用户通过签名交易请求系统程序更新余额。这种模式在 Solana 中反复出现:Authority 提供签名,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 合约中常见的一种设计模式。与此相对,Solana 中的 owner 概念则更为基础。在以太坊上,智能合约仅限于修改自身的存储槽。然而,如果存在一种机制,允许智能合约写入其他存储槽,那么在 Solana 的术语体系中,这些存储槽的归属地址就会被称为它们的 owner。
Authority 在 Solana 中既可是程序级权限,也可是账户级权限。例如:
#[account]
pub struct Player {
points: u32,
authority: Pubkey
}
这里,authority 存储在账户中...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!