Solana 账户模型

内容

在 Solana 上,所有数据都存储在所谓的“账户”中。Solana 上的数据组织方式类似于 键-值存储,数据库中的每个条目被称为一个“账户”。

AccountsAccounts

要点 #

  • 帐户最多可以存储10MB的数据,可以是可执行程序代码,也可以是程序状态。
  • 账户需要在 SOL 中支付租金押金,与存储数据量成比例,当账户关闭时全额退还。
  • 每个账户都有一个程序“所有者”。只有拥有账户的程序才能修改其数据或扣除其 lamport 余额。但是,任何人都可以增加余额。
  • 程序(智能合约)是存储可执行代码的无状态账户。
  • 数据账户是由程序创建的,用于存储和管理程序状态。
  • 本地程序是随 Solana 运行时一起提供的内置程序。
  • Sysvar账户是存储网络集群状态的特殊账户。

账户 #

每个帐户都可以通过其唯一地址进行识别,以32字节的Ed25519 PublicKey格式表示。您可以将地址视为帐户的唯一标识符。

Account AddressAccount Address

账户与其地址之间的关系可以被视为键值对,其中地址充当键,用于定位账户的链上数据。

账户的最大大小为10MB(10兆字节),Solana上每个账户存储的数据具有以下结构,称为AccountInfo。

AccountInfoAccountInfo

每个帐户的AccountInfo包括以下字段:

  • data: 存储账户状态的字节数组。如果账户是程序(智能合约),则存储可执行程序代码。此字段通常称为“账户数据”。
  • executable: 一个布尔标志,指示账户是否为程序。
  • lamports: 以 lamports 表示的账户余额的数值表示,lamport 是 SOL 的最小单位(1 SOL = 10亿 lamports)。
  • owner: 指定拥有该账户的程序的公钥(程序 ID)。

作为 Solana 账户模型的关键部分,Solana 上的每个账户都有一个指定的“所有者”,具体来说是一个程序。只有被指定为账户所有者的程序才能修改存储在账户上的数据或扣除 lamport 余额。需要注意的是,虽然只有所有者可以扣除余额,但任何人都可以增加余额。

要在链上存储数据,必须将一定数量的 SOL 转账到一个账户。转账的数量与账户存储的数据大小成比例。这个概念通常被称为“租金”。然而,你可以将“租金”更像是“押金”,因为分配给账户的 SOL 在账户关闭时可以完全收回。

本地程序 #

Solana 包含少量原生程序,这些程序是验证器实现的一部分,并为网络提供各种核心功能。您可以在这里找到完整的原生程序列表。

在 Solana 上开发自定义程序时,您通常会与两个原生程序进行交互,即系统程序和 BPF 加载程序。

系统程序 #

默认情况下,所有新账户都由System Program拥有。系统程序执行几个关键任务,例如:

  • 新建账户: 只有系统程序才能创建新账户。
  • 空间分配: 为每个账户的数据字段设置字节容量。
  • 指定程序所有权: 一旦系统程序创建了一个账户,它可以重新分配指定程序所有者给不同的程序账户。这是自定义程序接管系统程序创建的新账户所有权的方式。

在 Solana 上,“钱包”只是系统程序拥有的一个账户。 钱包的 lamport 余额是账户拥有的 SOL 数量。

System AccountSystem Account

只有系统程序拥有的账户可以用作交易手续费支付者。

BPF加载程序 是网络上所有其他程序的“所有者”,不包括原生程序。它负责部署、升级和执行自定义程序。

Sysvar Accounts #

Sysvar 账户是位于预定义地址的特殊账户,提供对集群状态数据的访问。这些账户会动态更新网络集群的数据。您可以在这里找到完整的 Sysvar 账户列表。

自定义程序 #

在 Solana 上,“智能合约”被称为程序。程序是一个包含可执行代码的账户,并且通过设置为 true 的“可执行”标志来表示。

有关程序部署过程的更详细解释,请参阅本文档的部署程序页面。

项目账户 #

当在 Solana 上部署新程序时,从技术上讲会创建三个独立的账户:

  • 程序账户:代表链上程序的主要账户。该账户存储可执行数据账户的地址(存储编译后的程序代码)和程序的更新权限(授权地址可更改程序)。
  • 程序可执行数据账户:包含程序可执行字节码的账户。
  • 缓冲账户:在程序正在部署或升级时存储字节码的临时账户。一旦过程完成,数据将转移到程序可执行数据账户,缓冲账户将被关闭。

例如,这里是 Solana Explorer 的 Token Extensions 的链接 Program Account 和其对应的 Program Executable Data Account

Program and Executable Data AccountsProgram and Executable Data Accounts

为简单起见,您可以将“程序账户”视为程序本身。

Program AccountProgram Account

“Program Account” 的地址通常被称为“程序 ID”,用于调用该程序。

数据账户 #

Solana程序是“无状态”的,这意味着程序账户只包含程序的可执行字节码。要存储和修改额外数据,必须创建新账户。这些账户通常被称为“数据账户”。

数据账户可以存储所有在所有者程序代码中定义的任意数据。

Data AccountData Account

请注意,只有System Program能够创建新账户。一旦System Program创建了一个账户,它就可以将新账户的所有权转移给另一个程序。

换句话说,为自定义程序创建数据帐户需要两个步骤:

  1. 调用系统程序创建一个账户,然后将所有权转移给自定义程序
  2. 调用现在拥有该账户的自定义程序,然后根据程序代码中定义的方式初始化账户数据

这个数据账户创建过程通常被抽象为一个步骤,但了解底层过程是有帮助的。

总结
Solana的数据存储在被称为“账户”的地方。每个账户可以存储高达10MB的数据,可以是可执行程序代码或程序状态。账户需要以SOL的形式支付租金押金,与存储的数据量成比例,关闭账户时押金可全额退还。每个账户都有一个程序“所有者”,只有拥有账户的程序才能修改数据或扣除余额。Solana包含原生程序、数据账户和Sysvar账户。账户由唯一的32字节地址标识,地址可视为账户的唯一标识符。账户数据包括data、executable、lamports和owner字段。Solana的账户模型中,每个账户都有指定的“所有者”,通常是一个程序。只有所有者才能修改数据或扣除余额。系统程序是所有新账户的所有者,负责创建新账户、分配空间和指定程序所有者。BPF Loader是网络上所有其他程序的“所有者”,负责部署、升级和执行自定义程序。Sysvar账户是位于预定义地址的特殊账户,提供对集群状态数据的访问。Solana上的智能合约称为程序,包含可执行代码,通过设置“executable”标志为true来表示。部署新程序时,实际上会创建三个独立的账户:程序账户、可执行数据账户和缓冲账户。数据账户用于存储额外数据。