提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
从https://solana.com/zh/docs/intro/quick-start/reading-from-network中学习solana账户结构
一、理解solana账户模型
在solana中,所有的数据储存在accounts中,你可以理解为一种数据结构:由address和account组成的键值对,account又是一种基础统一的结构
二、KeyPoints
- Accounts可以储存10m的数据,包括可执行程序代码或者程序状态
- Accounts要求租赁与数据量成比例的lamports,可以在关闭账户时完全退还
- 每个account都由一个程序所有者。只有程序所有者可以修改数据或者扣除lamport。然后任何人可以增加余额
- Sysvar accounts是一种特殊的用来存储网络集群状态的accounts
- Program accouts可以储存智能合约可执行代码
- Data accounts是被程序创建用来存储和管理程序状态的
三、Account
每个solana账户是由唯一的32位字节地址进行识别,该地址通常展示为base58编码字符串
虽然公钥作为常见的账户地址,solana还支持一种叫做程序派生地址的功能(PDAs)。PDAs是从程序ID和可选的输入(seeds)中确定性导出的特殊地址
1 账户类型
Accounts 有10M的最大容量并且每个solana账户有相同的账户类型
每个账户都有一下的字段:
- data:一个账户存储任意数据的字节数组。对于不可执行账户,这通常是存储只读状态。对于程序账户(智能合约),这包含可执行程序代码。数据字段通常被成为“账户数据”
- executalbe:Boolean标识用来表明是否一个账户是否为一个程序
- lamports:账户余额以lamports为单位,即sol的最小单位为lamports(1sol=10亿lamports)。1sol=1e9 lamports,1lamports=1e-9sol
- Owner:拥有此账户的程序的程序ID(公钥)。只有所有者程序能修改账户数据或者扣除lamports余额
- rent_epoch:Solana有一个定期从账户中扣除lamports机制的遗留字段。虽然此字段仍存在于Account类型中,但由于租金收取已被弃用,因此不再使用。
2 租金
为了在链上存储数据,账户还必须保持与账户上存储的数据量(以字节为单位)成比例的最小lamport(SOL)余额。这个最低余额被称为“租金”,尽管它的功能更像是存款,因为当账户关闭时可以全额收回。你可以在这里找到使用这些常数的计算。
“租金”一词是由于一种过时的机制,该机制定期从低于租金门槛的账户中扣除灯柱。该机制不再有效。
3 程序拥有者
在Solana上,“智能合约”被称为程序。程序所有权是Solana帐户模型的一个关键方面。每个帐户都有一个指定的程序作为其所有者。只有所有者程序可以:
- 修改帐户的数据字段
- 从账户余额中扣除lamports
四、系统程序
默认情况下,所有新帐户都归系统程序所有。系统程序执行几个关键任务:
- 创建新账户:只有系统程序可以创建新账户
- 空间分配:设置每个帐户数据字段的字节容量。
- 转移/分配程序所有权:系统程序创建帐户后,可以将指定的程序所有者重新分配给其他程序帐户。这就是自定义程序如何获得系统程序创建的新帐户的所有权。
Solana上的所有“钱包”账户都是系统程序拥有的账户。这些账户中存储的lamport余额代表钱包拥有的SOL金额。只有系统程序拥有的账户才能用作交易费支付者。
在这里我们基本可以理解为:我们只是向系统程序上租用了一个钱包地址,最后不用了可以退租。
五、Sysvar帐户
Sysvar帐户是位于预定义地址的特殊帐户,提供对集群状态数据的访问。这些帐户会动态更新有关网络集群的数据。您可以在https://docs.anza.xyz/runtime/sysvars找到Sysvar帐户的完整列表。
六、系统账户
除了loader-v3之外,所有加载器都将它们管理的程序里可执行代码存储在所谓的程序帐户中:
为简单起见,您可以将程序帐户视为程序本身。当调用程序的指令时,您需要指定程序帐户的地址(通常称为“程序ID”)。
1 缓冲区账户
Loader-v3有一个特殊的帐户类型,用于在部署或重新部署/升级期间临时暂存程序的上传。在loader-v4中仍然有缓冲区,但它们只是普通的程序帐户。
2 程序数据帐户
Loader-v3的工作方式与所有其他加载器不同,因为它对每个程序都有一个间接方式。程序帐户只包含程序数据帐户的地址,然后程序数据帐户又保存实际的可执行代码:
这些程序数据帐户不要与程序的数据帐户混淆
七、数据账户
在Solana上,程序的可执行代码存储在与程序状态不同的帐户中。这类似于操作系统通常为程序本身及其数据提供单独的文件。
为了维护状态,程序定义了创建由程序拥有单独账户的指令。这些账户中每一葛都有自己的唯一地址,可以用来存储程序定义的任何任意数据
请注意,只有系统程序可以创建新帐户。一旦系统程序创建了一个帐户,它就可以将新帐户的所有权转移/分配给另一个程序。
换句话说,为自定义程序创建数据帐户需要两个步骤:
- 调用系统程序创建帐户,然后将所有权转移到自定义程序
- 调用现在拥有帐户的自定义程序,然后按照程序指令定义初始化帐户数据
这个帐户创建过程通常被抽象为一个步骤,但理解底层过程是有帮助的。