账户是 Solana 用于存储状态的基本数据单元。网络将所有状态存储在一个键值对数据库中,每个键是一个 32 字节的地址,每个值就是一个账户。
三个账户及其地址的示意图。包含账户结构定义。
账户结构
账户地址(公钥、PDA)、每个账户包含的五个字段、rent 状态机,并附有交互式代码演示。
账户类型
程序账户(可执行代码)、数据账户(程序状态)、系统账户和 sysvars(集群全局状态)。
修改规则
针对 lamports、数据、所有者、可执行标志和借用的运行时强制规则。
账户运行时
账户加载校验、BPF 序列化格式与反序列化。
关键信息
- 结构:每个账户都包含相同的五个字段:lamports、data、owner、executable、rent_epoch。
- 地址:每个账户由唯一的 32 字节地址标识(可以是 Ed25519 公钥或 PDA)。
- 所有权:只有账户的 owner 程序可以修改其数据或扣除 lamports。任何程序都可以向任何可写账户充值 lamports。
- rent:每个账户都必须持有与其数据大小成比例的最低 lamport 余额,才能保持链上状态。
限制
| 限制项 | 数值 | 来源 |
|---|---|---|
| 账户数据最大尺寸 | 10 MiB(10,485,760 字节) | MAX_ACCOUNT_DATA_LEN |
| 每条指令最大数据增长 | 10 KiB(10,240 字节) | MAX_PERMITTED_DATA_INCREASE |
| 每笔交易最大数据增长 | 20 MiB(20,971,520 字节) | MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION |
| 账户基础存储开销 | 每个账户 64 字节 | TRANSACTION_ACCOUNT_BASE_SIZE |
| 地址长度 | 32 字节(Ed25519 公钥) | -- |
| rent 免除最低值(公式) | (account_size + 128) * 3,480 lamports/字节-年 * 2 年 | minimum_balance() |
Is this page helpful?