Solana 账户模型
在 Solana 上,所有数据都存储在所谓的“帐户”中。 Solana 上的数据组织方式类似 于键值存储,其中数据 库中的每个条目称为“帐户(Account)”。
账户
要点 #
-
账户最多可存储10MB 数据,这些数据可以由可执行的程序代码或程序状态组成。
-
账户需要以 SOL 形式存入租金,与存储数据的数量成比例,当账户关闭时,该金额可以 全额退款。
-
每个帐户都有一个程序“所有者”。 只有拥有帐户的程序可以修改其数据或扣除其lamport 余额。 然而,任何人都可以增加的余额。
-
程序 (智能合约) 是无状态账户,用于存储可执行代码。
-
数据账户是由程序创建的,用于存储和管理程序状态。
-
原生程序是内置程序,包括在 Solana 运行时内。
-
Sysvar 帐户是存储网络集群状态的特殊帐户。
账户 #
每个帐户都可以通过其唯一的地址来识别,用 Ed25519
PublicKey
格式。 你可以将地址的视为账户的唯一标识符。
帐户地址
此账户及其地址之间的关系可以被视为键值对, 而地址是定位相应的链上账户数据的键。
帐户信息 #
帐户有一个 最大大小为 10MB(10 Mega Bytes) ,并且 Solana 上每个帐户上存储的数据有以下结构称为 AccountInfo。
AccountInfo
每个账户的 AccountInfo
包含以下字段:
data
: 存储帐户状态的字节数组。 如果帐户是程序(智能合约),则存储可执行程序代 码。 此字段是,通常称为“帐户数据”。executable
: 表示帐户是否为程序的布尔标识符。lamports
:账户余额的数字表示方式为 lamports,这是SOL中最小的单位(1 SOL = 10亿 lamports)。owner
:指定哪一个程序的公钥 (程序ID) 拥有该帐户。
作为Solana 账户模式的一个关键部分,Solana 上的每个账户都有一个指定为“所有者”,特 别是一个程序。 只有指定为帐户所有者的程序可以修改帐户中存储的数据或扣除lamport余 额。 重要的是要注意到,虽然只有所有者可以扣除余额,但任何人都可以增加余额。
若要在链上存储数据,必须将一定数量的SOL转账到一个帐户。 转账金额与账户上存储的 数据的大小成比例。 这一概念通常称为“租用”。 然而,仍然存在着这种情况。你可以认 为"出租"更像"保证金",因为分配给帐户的SOL可以在关闭帐户时完全恢复。
原生程序 #
Solana 包含少数原生程序,这些程序是验证器实现的一部分,并为网络提供了各种核心功 能。 You can find the full list of native programs here.
当在 Solana 上开发自定义程序时,你通常会与两个原生程序交互,即系统程序和 BPF Loader。
系统程序 #
默认情况下,所有新账户都属 于系统程序。 系统程序执行几项关键任务,例如:
- 新账户创建: 只有系统程序可以创建新帐户。
- 空间分配: 设置每个帐户数据字节的容量。
- 分配程序所有者: 一旦系统程序创建了一个帐户,它可以将指定的程序所有者重新分配到不同的程序帐户。 这是自定义程序如何获取系统程序创建的新账户的所有权。
在Solana上,“钱包”只是系统程序拥有的帐户。 钱包的 lamport 余额是账户拥有的 SOL金 额。
系统账户
只有系统程序拥有的账户才能用作交易费付款人。
BPFLoader 程序 #
BPF Loader 是指定为网络上所有其他程序的“所有者”的程序,不包括原生程序。 它负责部署、升级和 执行自定义程序。
Sysvar 帐户 #
Sysvar账户是位于预定义地址的特殊账户,可以访问集群状态数据。 这些帐户使用网络集 群的数据动态更新。 You can find the full list of Sysvar Accounts here.
自定义程序 #
在Solana,“智能合约”称为 programs。 程序是一个包含可执 行代码的帐户,由一个设置为真的 “executable” 标志表示。
关于程序部署过程的更详细解释,请参阅此文档 的部署程序。
程序账户 #
当新程序 为已部署时, 从技术上讲,Solana 上创建了三个独立的账户:
- 程序账户: 代表链上程序的主账户。 此帐户存储可执行数据帐户的地址(存储编译的 程序代码)和程序的更新权限(授权地址更改程序)。
- 程序可执行数据帐户:包含可执行文件的帐户程序的字节码。
- 缓冲帐户:一个临时帐户,在程序正在部署或升级时存储字节代码。 处理完成后, 数据将转入程序可执行数据账户,并关闭缓冲账户。
例如,这里是 Solana 浏览器上的 Token 扩展 的程序账户链 接及其相应 的程序可执行数据帐户。
程序和可执行数据账户
为了简单起见,你可以将“程序帐户”视为程序本身。
程序账户
“程序帐户”的地址通常称为“程序ID”,用于调用该程序。
数据帐户 #
Solana 程序是“无状态”的,这意味着程序帐户只包含程序可执行字节代码。 要存储和修改 额外数据,必须创建新的帐户。 这些账户通常称为“数据账户”。
数据账户可以存储在所有者程序的代码中定义的任意数据。
数据账户
注意,只有 System Program 可以创建新帐 户。 一旦系统程序创建了一个帐户,它就可以将新帐户的所有权转移到另一个程序。
换言之,为自定义程序创建数据账户需要两个步骤:
- 调用系统程序来创建一个帐户,然后将所有权转到一个自定义程序
- 调用现在拥有账户的自定义程序,然后初始化程序代码中定义的账户数据
这个数据账户创建过程常常是抽象为一步,但是了解基础过程是有用的。