一句话先说清
世界状态(world state)是以太坊在某个区块高度上的完整快照:每个地址有多少余额、nonce 是几、合约代码是什么、合约存储里每个槽位装着什么。交易只是通向它的路径,它才是答案。每个区块头里那个 32 字节的 state root,就是这张快照的默克尔指纹——所有节点各自重放交易,只要最后算出的根哈希一致,就证明大家的世界完全相同。
状态对象长什么样
以太坊把每个地址映射到一个账户对象,只有四个字段:nonce(该地址发出过多少笔交易,合约账户则记录创建次数)、balance(以太余额,以 Wei 计)、storage root(指向该账户私有存储树另一棵默克尔树的根)、code hash(合约字节码的哈希,外部账户此项为空)。全部账户组织在一棵树里,每个账户的存储又是独立的一棵子树——“树上有树”是状态结构的精髓:改一个存储槽,只需要沿那棵子树更新到根,再冒泡到全局 state root。
根哈希即真相
区块头不存状态本身,只存三棵树的根:交易树、收据树、状态树。轻客户端想验证“某个地址此刻余额是多少”,不需要下载全部状态:向全节点要一份带兄弟节点哈希的证明,沿路径算一次根,与信任的区块头比对即可。一条几百字节的默克尔证明替代了几十 GB 的账本,这就是“状态即树”带来的杠杆,也是以太坊比“让节点整库导出”类链高效得多的根本原因。
状态怎么被更新
每笔交易执行前,节点从状态树里读出涉及的账户;执行(转账、调用合约、读写存储);执行后写回,沿途重算受影响的节点哈希。整个过程遵循确定性铁律:同样的父状态加同样的交易序列,任何实现语言都必须得到 bit 级相同的 state root——一旦不同,分叉就发生了。以太坊虚拟机为此把每一步_gas 消耗、每个边界情况都写进黄皮书,让“实现细节”无处发挥。
状态的重量
天下没有免费的快照:状态是只增不减的巨石,历史交易可以裁剪,状态却必须随时可查——每笔新调用都可能触及任意账户。十余年下来状态体积持续增长,节点磁盘与内存压力成为公链最真实的参与门槛之一。协议层的应对思路各有代表:从状态租金(按占用付费)、状态过期(冷状态冻结、使用时附证唤醒),到历史过期与无状态客户端(节点只验证明不存全库)。这些路线有的已激活、有的仍在提案,读者查资料时务必分清“已上线”与“在讨论”,本文不为任何时间表背书。
快速问答
问:世界状态和区块链有什么区别?答:链是交易日志,状态是日志重放到当前的物化视图。严格说区块链是状态变迁的历史,状态是当前视图,以太坊选择后者为一等公民。
问:状态会丢吗?答:只要还有一个节点完整保留,状态就能恢复;正因如此,“多跑全节点”对以太坊不是口号而是灾备冗余。
一条直觉线
把以太坊想成一台只认输入输出的计算机:输入是交易,输出是状态。你无法从输出一路倒推输入的全部过程(历史可以裁剪),但从输入必然能前推到输出(确定性执行)。state root 就是这台计算机每一拍自检后亮出的校验码。
常见误区
一是把“区块链”等同于“交易列表”,在以太坊里那只是账本的一半;二是以为 state root 变化频繁说明状态在变,其实空块也会带根——根由执行序列决定而非时间流逝;三是把状态和历史混谈:历史过期讨论的是旧区块原始数据,状态过期针对的是当前余额与存储,两者不是一回事。
风险提示:本文为协议机制科普,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。