在 Solana 上,所有数据都存储在称为账户的结构中。
Solana 上的数据组织方式类似于键值存储,其中数据库中的每个条目称为账户。
关键点
- 账户可以存储最多
10MB的数据,这些数据可以是可执行程序代码或程序状态。 - 账户需要存入与存储数据量成比例的
SOL作为租金,当账户关闭时,这些租金可以全额退还。 - 每个账户都有一个程序所有者。只有拥有账户的程序才能修改其数据或扣除其
lamport余额。 不过,任何人都可以增加账户的余额。 - 程序(智能合约)是存储可执行代码的无状态账户。
- 数据账户由程序创建,用于存储和管理程序状态。
- 原生程序是 Solana 运行时包含的内置程序。
- Sysvar 账户是存储网络集群状态的特殊账户。
账户
每个账户通过其唯一地址进行标识,该地址由 32 字节组成,格式为 Ed25519 公钥。
可以将地址视为账户的唯一标识符。
账户与其地址之间的关系可以看作是键值对,其中地址作为键,用于定位账户对应的链上数据。
账户信息
账户的最大大小为 10MB(10 兆字节),每个 Solana 上存储的数据账户都具有以下结构,
称为账户信息(AccountInfo)。
每个账户的账户信息包括以下字段:
data:存储账户状态的字节数组。如果账户是一个程序(智能合约),则存储可执行程序代码。该字段通常称为“账户数据”。executable:一个布尔标志,指示该账户是否是一个程序。lamports:账户余额的数字表示,单位为lamports,这是SOL的最小单位(1 SOL = 10 亿 lamports)。owner:指定拥有账户的程序的公钥(程序 ID)。
作为 Solana 账户模型的一个关键部分,每个 Solana 上的账户都有一个指定的“所有者”,即一个程序。
只有被指定为账户所有者的程序才能修改账户上存储的数据或扣除 lamport 余额。
需要注意的是,虽然只有所有者可以扣除余额,但任何人都可以增加余额。
要在链上存储数据,需要将一定数量的 SOL 转入账户。
转入的数量与账户上存储的数据量成比例。
这个概念通常称为租金。不过,您可以将租金视为押金,
因为当账户关闭时,分配给账户的 SOL 可以全额退还。
原生程序
Solana 包含少量原生程序,这些程序是验证器实现的一部分,并为网络提供各种核心功能。 您可以在此处找到完整的原生程序列表。
在 Solana 上开发自定义程序时,您通常会与两个原生程序进行交互,即系统程序和 BPF 加载器。
系统程序
默认情况下,所有新账户都由系统程序拥有。
系统程序执行以下几个关键任务:
- 新账户创建:只有系统程序可以创建新账户。
- 空间分配:设置每个账户数据字段的字节容量。
- 分配程序所有权:系统程序创建账户后,可以将指定的程序所有者重新分配给其他程序账户。 这就是自定义程序如何获得 系统程序创建的新账户的所有权。
在 Solana 上,“钱包”只是由系统程序拥有的一个账户。钱包的 lamport 余额是账户拥有的 SOL 数量。
只有由系统程序拥有的账户才能用作交易费用支付者。
BPF 加载器程序
BPF 加载器是网络上所有其他程序(不包括原生程序)的指定“所有者”。它负责部署、升级和执行自定义程序。
Sysvar 账户
Sysvar 账户是位于预定义地址的特殊账户,提供访问集群状态数据的功能。
这些账户会动态更新网络集群的数据。您可以在此处找到 Sysvar 账户的完整列表。