Solana 中的所有者与权限

  • RareSkills
  • 发布于 2024-03-13 15:36
  • 阅读 213

文章详细解释了Solana中'owner'和'authority'的区别,'owner'是程序,'authority'是钱包,程序只能修改其拥有的账户数据,而'authority'通过发送签名交易来请求程序修改数据。

展示 Owner vs Authority 的英雄图像

新来者在 Solana 中常常对“owner”和“authority”之间的区别感到困惑。本文力图尽可能简洁地澄清这种混淆。

Owner 和 Authority

只有程序可以向账户写入数据——具体而言,只有向它们拥有的账户写入。程序不能随意向任意账户写入数据。

当然,程序不能自发地向账户写入数据。它们需要从一个钱包接收指令。然而,程序通常只会从特权钱包接受特定账户的写入指令:即 authority

账户的拥有者是一个程序。Authority 是一个钱包。Authority 发送一个交易到程序,该程序可以向账户写入数据。

Solana 中所有账户都有以下字段,这些字段大多不言自明:

  • 公钥
  • lamport 余额
  • owner
  • 可执行(布尔标志)
  • 租金周期(可忽略租金豁免账户)
  • 数据

我们可以通过在终端运行 solana account <我们的钱包地址> 来查看这些(在背景中运行 Solana 验证器):

solana account 命令

注意一些有趣的事情:我们不是我们钱包的拥有者! 地址 111...111system program

为什么系统程序拥有钱包,而不是钱包自己拥有自己?

只有账户的拥有者可以修改其中的数据。

这意味着我们无法直接修改我们的余额。只有系统程序可以做到这一点。要将 SOL 从我们的账户转出,我们发送一个签名交易到系统程序。系统程序验证我们拥有该账户的私钥,然后代表我们修改余额。

这是你在 Solana 中经常会看到的模式:只有账户的拥有者可以修改该账户中的数据。如果程序看到来自一个预定地址的有效签名,它就会修改账户中的数据:即 authority

Authority 是一个地址,程序将在看到有效签名时接受该地址的指令。Authority 不能直接修改账户。它需要通过拥有它正在尝试修改的账户的程序来进行操作。

Authority -> Owner -> Account

然而,拥有者始终是一个程序,而该程序将在交易的签名有效时代表其他人修改账户。

例如,在我们关于 使用不同签名者修改账户 的教程中,我们看到了这一点。

练习:创建一个程序来初始化存储账户。你将需要方便地记录程序和存储账户的地址。考虑将以下代码添加到测试中:

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

然后在被初始化的账户上运行 solana account <存储账户>。你应该看到拥有者是程序。

这里是运行练习的截图:

通过 : 已初始化

当我们查看存储账户的元数据时,我们看到程序是拥有者。

因为程序拥有存储账户,所以它能够写入数据。用户无法直接写入存储账户,他们需要签署交易并请求程序写入数据。

Solana 中的 owner 和 Solidity 中的 owner 非常不同

在 Solidity 中,我们通常将拥有者称为对智能合约拥有管理权限的特殊地址。“拥有者”并不是以太坊运行级别存在的概念,而是应用于 Solidity 合约的一种设计模式。Solana 中的拥有者则更为根本。在以太坊中,智能合约只能写入自己的存储插槽。想象一下我们有一种机制,可以让以太坊智能合约能够写入其他存储插槽。在 Solana 术语中,它将成为这些存储插槽的 owner

Authority 可以表示谁部署了一个合约以及谁可以发送特定账户的写入交易

Authority 可以是程序级别的一个构造。在我们关于 Anchor 签名者 的教程中,我们制作了一个程序,允许Alice从她的账户中扣除积分并转给其他人。为了知道只有Alice可以发...

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

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

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/