一句话理解
Solana 的每个验证者必须持有“所有账户”的当前状态:余额、所有者、数据、所属程序,一个都不能少。持久账户存储设计选择了一条反直觉的路:账户更新不就地覆盖,而是不断往只追加的文件尾部写,另一个内存索引负责记住每个账户此刻住在哪个文件的哪个偏移量上。
为什么不用现成数据库
账户集合是全部已处理交易的计算结果。每个区块都改变这个集合,而确认前每个区块都是潜在回滚点,改变必须可逆。把账户存在内存里最快,但容量有限、价格高;存进 NVMe 之类持久介质便宜得多,读写却慢得多。两头都不合适时,设计团队选择改写入方式:把随机覆盖变成顺序追加,顺序写能让磁盘跑出接口的带宽,而并发的读可以用内存映射文件让操作系统去分页。
只追加的文件与一本索引
这套结构的核心叫 AppendVec:一个只允许一个写者向尾部追加、却允许许多读者同时随机读的文件。写入完成时原子地更新一个偏移量,读者只会看到已完整落盘的数据。验证者的回放线程和打包线程各自往自己的文件并发追加,互不阻塞。光有文件不够,定位靠账户索引:一张从公钥到“各分叉下数据位置”的映射,查询时带上分叉编号取对应版本,还能直接返回指向映射文件的引用而不用复制。多个分叉共享同一条索引,分叉之间不再需要显式检查点。

空间怎么回收
不断追加意味着旧版本还躺在文件里。回收跟着共识走:当分叉被选为根分叉后被压实,父分叉中独有的账户被索引提入新根,余额为零的账户从索引移除,变成不可达后就能被清理。文件层面,当所有账户都更新了版本、旧文件的引用消失,整个旧文件即可复用;也可以主动把长期未动的冷账户搬进新文件头部,腾出旧空间,全程只锁索引。进程重启时按索引维护的原子写版本号重排各文件的重建顺序:每个账户条目都记着写入时的版本计数,恢复时不分先后地读完所有文件,给每个分叉留下最新版本即可复原全貌。生成快照只需把映射文件刷盘,索引一并写出,新节点据此就能跳过从创世重放的路。
为什么值得普通用户知道
验证者的硬件门槛——尤其是磁盘——就是公链去中心化的门槛之一。把账户存储做成对磁盘友好,目的就是让一台机器跟得上高吞吐,降低合规节点的运行成本,让质押分布少一个向大机房倾斜的理由。这是存储设计对网络结构的上游意义。
和归档数据的分野
这套结构存的是当前状态,不是历史流水。账户的最新余额与数据在索引与文件里,而“某个区块时刻的完整世界状态”是另一回事,属于归档职责,用不同的数据布局换取任意高度的可查询性。只追加文件优化的是高频覆盖写的工作负载:余额天天在变,就地更新会把磁盘写满随机写,追加把它们变成顺序流。理解了这一点,就能明白验证者硬件清单里高速 NVMe 和充足内存为什么同时上榜——一个吃追加带宽,一个养索引与热数据。
风险边界
这套机制只回答“状态怎么存取得快”,不提供任何交易安全保证:它不保护私钥,不消除软件缺陷,也不改变分叉与最终性的规则。账户模型下数据永久占用状态空间,状态膨胀本身仍是各链共同面对的课题。本文只作机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。