为什么每个节点都要重算一遍交易?区块链确定性执行的底层约定 图 1
为什么每个节点都要重算一遍交易?区块链确定性执行的底层约定 · 图 1

一个画面:一百万个会计抄同一本账

传统系统的账本有一个“说了算”的服务器:它先记账,别人信它。区块链把这套关系倒过来:没有一个先记账的裁判,每个全节点都亲自把从创世以来的每一笔交易重新执行一遍,自己算出每个账户的当前余额、每个合约的当前存储值,再和网络上其他人公布的结果对表。谁发布的区块里状态对不上,节点就丢弃它,哪怕发布者声望再高。

要让这种“百万人抄同一本账”能收敛到同一个答案,必须满足一个苛刻的前提:执行必须是确定性的。

确定性的含义:同样的输入,必然同样的输出

确定性执行指的是:给定相同的起始状态和相同的交易输入,任何一台合规机器上跑出的结果必须逐字节一致。比特币的脚本和以太坊的虚拟机(EVM)都被刻意设计成满足这个性质的状态机:指令集合、运算规则、费用扣减、报错处理全部由协议写死,不允许“看机器情况执行”。

正因为每个节点都是“记账人兼审计员”,打包区块的人并没有凌驾于规则之上的权力:他可以决定交易以什么顺序进块,但他无法让一笔无效交易被全网接受——因为节点不是“相信区块有效”,而是“自己验过有效”。这是区块链安全叙事里最常被省略的一句:验证靠重算,重算靠确定性。

由此推出几条硬边界

确定性给链上程序划了几条不能越过的线。第一,合约读不到真实时钟:节点在不同年代重放历史,如果执行依赖“当前时间”,历史区块会算出不同结果;交易能感知到的时间只有被打包时写进区块头的时间戳。第二,合约没有真随机数:重放时各节点各自掷骰子必然不一致,所以链上所谓的随机都来自可重放的确定性素材(例如区块头字段的哈希),需要真随机时要靠链下可验证随机方案补充。第三,合约读不到任何外部数据:去查天气、查股价的结果无法被重放核对,这就是预言机存在的根源,也是预言机成为攻击重灾区的原因——它把不确定的外部世界硬塞进确定的机器里。

为什么不省事:选一个裁判节点,别人抽查?

理论上可以只让少数节点执行、其余节点抽查,省掉大量重复计算。但“没被抽查到就默认合法”意味着:攻击者只要收买或控制抽查方,假账就能混进来;而全量重算的防守方是全世界,收买成本趋于无穷。区块链选择用昂贵的重复计算,换“无需信任任何一方”的性质。为了缓解成本,研究也在推进折中方案,例如让轻客户端凭证明验证、让节点不必永久保存全部历史与状态(无状态化路线)——它们改变的是“谁来重算、重算多少”,但没有取消“必须有人重算并可比对”这个根基。

一个常见误区

有人把确定性执行理解成“交易永远不会失败”。事实相反:交易会因条件不满足而回滚,但“它会回滚”这件事本身是确定的——同样的链状态下,任何节点重放它都会得到同样的失败结果,并已消耗的燃料照扣不误。确定性说的是结果的唯一性,不是结果的好看。

常见误区

第一,把确定性当成“公开透明所以有人盯梢”——链上没有裁判,安全来自每台机器独立重算后互相比对,不是来自某个权威审核。第二,把重算理解成“浪费”——重算的重复度正是篡改成本的分母,删掉重复等于给造假开门。第三,以为“全网同步”意味着所有节点同时执行同一笔交易——节点各自追块、先后执行,只是历史顺序由共识锁定,谁重放都得到同一答案,同步的是结果而不是时刻。

风险提示:本文解释底层机制,不构成投资建议;理解机制有助于独立判断,但不消除任何资产价格与协议本身的风险。