Solana 账户模型
<!--StartFragment-->
在 Solana 上,所有数据都存储在所谓的“账户”中。Solana 上数据的组织方式类似于 [键值存储],其中数据库中的每个条目都称为“帐户”。
<!--EndFragment-->
<!--StartFragment-->
要点
- 账户最多可以存储 10MB 的数据,这些数据可以由可执行程序代码或程序状态组成。
- 账户需要以 SOL 支付租金押金,金额与存储的数据量成比例,账户关闭时可全额退还。
- 每个账户都有一个程序“所有者”。只有拥有账户的程序才能修改其数据或扣除其 Lamport 余额。但是,任何人都可以增加余额。
- 程序(智能合约)是存储可执行代码的无状态账户。
- 数据账户由程序创建,用于存储和管理程序状态。
- 本机程序是 Solana 运行时附带的内置程序。
- Sysvar 账户是存储网络集群状态的特殊账户。
<!--EndFragment--> <!--StartFragment-->
帐户
[每个帐户都可以通过其唯一地址来识别,该地址以Ed25519] 格式表示为 32 个字节PublicKey
。您可以将地址视为帐户的唯一标识符。 <!--EndFragment--> <!--StartFragment-->
这种账户和地址的关系可以看作是一个键值对,地址是定位账户对应链上数据的关键。
<!--EndFragment-->
<!--StartFragment-->
账户信息
账户的 [最大大小为 10MB](10 兆字节),Solana 上每个账户上存储的数据都具有以下称为 [AccountInfo]的结构。
<!--EndFragment-->
<!--StartFragment-->
每个帐户AccountInfo
包括以下字段:
data
:存储帐户状态的字节数组。如果帐户是程序(智能合约),则存储可执行程序代码。此字段通常称为“帐户数据”。executable
:一个布尔标志,指示该帐户是否是一个程序。lamports
[:以lamports]为单位表示账户余额的数字 ,lamports 是 SOL 的最小单位(1 SOL = 10 亿 lamports)。owner
:指定拥有该账户的程序的公钥(程序ID)。
作为 Solana 账户模型的关键部分,Solana 上的每个账户都有一个指定的“所有者”,具体来说是一个程序。只有被指定为账户所有者的程序才能修改存储在账户上的数据或扣除 Lamport 余额。需要注意的是,虽然只有所有者可以扣除余额,但任何人都可以增加余额。 <!--EndFragment--> <!--StartFragment-->
信息
要将数据存储在链上,必须将一定数量的 SOL 转移到账户中。转移的金额与账户中存储的数据大小成正比。这个概念通常被称为“租金”。然而,你可以把“租金”想象成“押金”,因为分配给账户的 SOL 可以在账户关闭时完全收回。
<!--EndFragment-->
<!--StartFragment-->
原生程序
Solana 包含少量原生程序,它们是验证器实现的一部分,并为网络提供各种核心功能。您可以找到原生程序的完整列表。
在 Solana 上开发自定义程序时,您通常会与两个本机程序(系统程序和 BPF 加载器)交互。
<!--EndFragment--> <!--StartFragment-->
系统程序
默认情况下,所有新帐户均归 [系统程序所有。系统程序执行几项关键任务,例如:
- [创建新帐户]:只有系统程序可以创建新帐户。
- [空间分配]:设置每个帐户数据字段的字节容量。
- [分配程序所有权:系统程序创建帐户后,它可以将指定的程序所有者重新分配给其他程序帐户。这就是自定义程序如何获得系统程序创建的新帐户的所有权。
在 Solana 上,“钱包”只是系统程序拥有的一个账户。钱包的 lampor 余额就是该账户拥有的 SOL 数量。
<!--EndFragment-->
<!--StartFragment-->
信息
只有系统程序所拥有的账户才可以作为交易费用的支付者。
<!--EndFragment-->
<!--StartFragment-->
[BPFLoader]程序
BPF [Loader] 是网络上所有其他程序(不包括 Native 程序)的“所有者”。它负责部署、升级和执行自定义程序。
Sysvar 账户
[Sysvar 帐户是位于预定义地址的特殊帐户,可用于访问集群状态数据。这些帐户会使用有关网络集群的数据进行动态更新。您可以在此处]找到 Sysvar 帐户的完整列表。
<!--EndFragment-->
<!--StartFragment-->
自定义程序[#]
在 Solana 上,“智能合约”被称为 [程序]。程序是一个包含可执行代码的帐户,由设置为 true 的“可执行”标志表示。
有关程序部署过程的更详细说明,请参阅 本文档的[部署程序]页面。
<!--EndFragment--> <!--StartFragment-->
计划帐户
[当在 Solana 上部署]新程序时 ,技术上会创建三个独立的帐户:
- 程序账户:代表链上程序的主账户。该账户存储了可执行数据账户的地址(存储了编译后的程序代码)和程序的更新权限(有权对程序进行更改的地址)。
- 程序可执行数据帐户:包含程序的可执行字节码的帐户。
- 缓冲账户:在程序正在部署或升级时存储字节码的临时账户。一旦该过程完成,数据将转移到程序可执行数据账户,缓冲账户将被关闭。
<!--EndFragment--> 例如,这里是代币扩展 [程序账户]及其对应 [程序可执行数据账户]的 Solana Explorer 链接。 <!--StartFragment--> <!--EndFragment--> <!--StartFragment-->
为了简单起见,您可以将“程序帐户”视为程序本身。 <!--EndFragment--> <!--StartFragment-->
信息
“程序账户”的地址,也就是我们通常说的“程序ID”,用于调用该程序。
<!--EndFragment-->
<!--StartFragment-->
数据帐户
Solana 程序是“无状态的”,这意味着程序账户仅包含程序的可执行字节码。要存储和修改其他数据,必须创建新账户。这些账户通常称为“数据账户”。
数据账户可以存储所有者程序代码中定义的任意数据。
<!--EndFragment-->
<!--StartFragment-->
请注意,只有[系统程序]才能创建新帐户。系统程序创建帐户后,即可将新帐户的所有权转让给其他程序。
换句话说,为自定义程序创建数据帐户需要两个步骤:
- 调用系统程序创建一个帐户,然后将所有权转移到自定义程序
- 调用现在拥有该帐户的自定义程序,然后按照程序代码中的定义初始化帐户数据
这个数据账户创建过程通常被抽象为一个步骤,但了解底层过程是有帮助的。
<!--EndFragment-->
作者:GTokenTool 来源:https://www.gtokentool.com
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。