跳到主要内容

Solana核心概念: Solana 账户模型

鱼雪

在 Solana 上,所有数据都存储在称为账户的结构中。

Solana 上的数据组织方式类似于键值存储,其中数据库中的每个条目称为账户。

Solana Accounts

关键点​

  • 账户可以存储最多 10MB 的数据,这些数据可以是可执行程序代码或程序状态。
  • 账户需要存入与存储数据量成比例的 SOL 作为租金,当账户关闭时,这些租金可以全额退还。
  • 每个账户都有一个程序所有者。只有拥有账户的程序才能修改其数据或扣除其 lamport 余额。 不过,任何人都可以增加账户的余额。
  • 程序(智能合约)是存储可执行代码的无状态账户。
  • 数据账户由程序创建,用于存储和管理程序状态。
  • 原生程序是 Solana 运行时包含的内置程序。
  • Sysvar 账户是存储网络集群状态的特殊账户。

账户​

每个账户通过其唯一地址进行标识,该地址由 32 字节组成,格式为 Ed25519 公钥。

可以将地址视为账户的唯一标识符。

Account Address

账户与其地址之间的关系可以看作是键值对,其中地址作为键,用于定位账户对应的链上数据。

账户信息​

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

AccountInfo

每个账户的账户信息包括以下字段:

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

作为 Solana 账户模型的一个关键部分,每个 Solana 上的账户都有一个指定的“所有者”,即一个程序。

只有被指定为账户所有者的程序才能修改账户上存储的数据或扣除 lamport 余额。

需要注意的是,虽然只有所有者可以扣除余额,但任何人都可以增加余额。

信息

要在链上存储数据,需要将一定数量的 SOL 转入账户。 转入的数量与账户上存储的数据量成比例。 这个概念通常称为租金。不过,您可以将租金视为押金, 因为当账户关闭时,分配给账户的 SOL 可以全额退还。

原生程序​

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

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

系统程序​

默认情况下,所有新账户都由系统程序拥有。

系统程序执行以下几个关键任务:

  • 新账户创建:只有系统程序可以创建新账户。
  • 空间分配:设置每个账户数据字段的字节容量。
  • 分配程序所有权:系统程序创建账户后,可以将指定的程序所有者重新分配给其他程序账户。 这就是自定义程序如何获得系统程序创建的新账户的所有权。

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

System Account

信息

只有由系统程序拥有的账户才能用作交易费用支付者。

BPF 加载器程序​

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

Sysvar 账户​

Sysvar 账户是位于预定义地址的特殊账户,提供访问集群状态数据的功能。

这些账户会动态更新网络集群的数据。您可以在此处找到 Sysvar 账户的完整列表。

自定义程序​

在 Solana 上,智能合约称为程序。

程序是包含可执行代码的账户,通过设置为 true 的“可执行”标志来表示。

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

程序账户​

当在 Solana 上部署新程序时,实际上会创建三个独立的账户:

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

例如,这里是指向 Solana Explorer 的 Token 扩展程序账户及其相应的程序可执行数据账户的链接。

Program and Executable Data Accounts

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

Program Account

信息

程序账户的地址通常称为程序 ID,用于调用程序。

数据账户​

Solana 程序是“无状态”的,这意味着程序账户仅包含程序的可执行字节代码。

为了存储和修改额外的数据,必须创建新账户。

这些账户通常称为数据账户。

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

Data Account

请注意,只有系统程序可以创建新账户。

系统程序创建账户后,可以将新账户的所有权转移给另一个程序。

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

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

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

Solana 账户模型总结​

在 Solana 区块链上,所有数据都存储在称为“账户”的结构中。

以下是 Solana 上账户模型的主要内容和账户类型:

账户类型​

  1. 程序账户(Program Accounts)

    • 描述:存储可执行程序代码的无状态账户。
    • 用途:代表链上的智能合约,包含可执行的字节码。
    • 关键点:程序账户的地址被称为程序 ID,用于调用该程序。
  2. 数据账户(Data Accounts)

    • 描述:存储程序状态的账户。
    • 用途:用于存储和管理与程序相关的任意数据。
    • 关键点:只有系统程序可以创建新账户,创建后可以将所有权转移给自定义程序。
  3. 原生程序账户(Native Program Accounts)

    • 描述:内置于 Solana 运行时的程序账户。
    • 用途:提供网络的核心功能。
    • 关键点:包括系统程序和 BPF 加载器等,系统程序默认拥有新账户。
  4. Sysvar 账户(Sysvar Accounts)

    • 描述:存储网络集群状态的特殊账户。
    • 用途:提供动态更新的网络状态数据。
    • 关键点:包括诸如时钟、租金等集群状态信息。

账户功能​

  • 租金(Rent):存储数据的账户需要存入与数据量成比例的 SOL 作为租金,这些 SOL 可以在账户关闭时全额退还。
  • 账户地址:每个账户都有唯一的地址,格式为 Ed25519 公钥,作为账户的唯一标识符。
  • 账户信息(AccountInfo):
    • data:存储账户状态的字节数组。
    • executable:标识账户是否为程序的布尔标志。
    • lamports:账户余额,单位为 lamports(1 SOL = 10 亿 lamports)。
    • owner:账户的所有者程序的公钥(程序 ID)。

系统程序(System Program)​

  • 新账户创建:只有系统程序可以创建新账户。
  • 空间分配:设置账户数据字段的字节容量。
  • 分配程序所有权:系统程序创建账户后,可以将所有权转移给其他程序。

BPF 加载器(BPF Loader)​

  • 描述:负责部署、升级和执行自定义程序的程序。
  • 用途:管理非原生程序的部署和执行。

总结​

Solana 的账户模型包括多种账户类型,各自具有不同的功能和用途。

  • 程序账户:用于存储和执行智能合约
  • 数据账户:用于存储程序状态
  • 原生程序账户:提供核心网络功能
  • Sysvar 账户:存储网络状态数据
  • 系统程序:负责新账户的创建和管理
  • BPF 加载器:管理自定义程序的部署和执行。

理解这些账户类型及其作用,有助于更好地进行 Solana 区块链的开发和使用。