不改协议的硬分叉:EIP-779 记录的 DAO 事件状态改写 图 1
不改协议的硬分叉:EIP-779 记录的 DAO 事件状态改写 · 图 1

以太坊的升级目录里,DAO 分叉是一个语法上的悖论:它被实现为硬分叉,却不改变协议。EIP-779(标题就叫 Hardfork Meta: DAO Fork,Casey Detrio 起草,2017 年 11 月 26 日创建,状态 Final)在一年半之后为这次事件补了正式的元提案文档,摘要开门见山点破性质:与其他硬分叉不同,DAO Fork 不改 EVM 操作码、不改交易格式、不改区块结构,它是一次「不规则状态变更」(irregular state change),内容是把一份账户名单里的以太余额转移进指定账户。

一次升级的解剖

规范给出的参数极简。代号 DAO Fork,主网激活块 1920000。状态改写的取材范围从区块 1880000 开始扫描,编入清单 L 的账户包括:The DAO 合约本体、它的 extraBalance 子账户、The DAO 创建者名下的全部子 DAO(child DAO)合约,以及每个子 DAO 各自的 extraBalance。折叠区里那份长名单逐个写着十六进制地址——这些账户的共同点是:资金都源自 The DAO 这个众筹投资容器,其托管漏洞在 2016 年夏天被提取路径抽走了一笔巨款。分叉后,原主链(后来的 Ethereum Classic)保留了入侵者的余额;而选择分叉的这一支,从 1920000 块起把这批账户的 ether 整体搬进一个预先部署好的退款合约,让原持有人按自己的节奏去申领。

不改协议的硬分叉:EIP-779 记录的 DAO 事件状态改写 图 2
不改协议的硬分叉:EIP-779 记录的 DAO 事件状态改写 · 图 2

为什么用「硬分叉」装一个例外

关键在机制与内容的分离。要让一次全网性的账户改写生效,可用的强制工具其实只有共识激活:客户端在指定块高度执行一段一次性代码,不照做的节点会从此拒绝对方接受的块、或被拒绝,链就此分开。所以 DAO 事件的技术载体必然是硬分叉,哪怕它完全没有改变「规则」。这也是社区当年最尖锐的争论点:反对者认为给特定账户开天窗让协议从「规则平等」滑向「结果干预」,支持者则认为不回滚等于默许漏洞即法律。EIP-779 通篇没有评价任何一方,它只履行元提案的职责——把发生过的事登记进标准目录。

元提案的迟到与补救史

这份文档的创建日期本身就是故事:分叉发生在 2016 年 7 月,元提案迟至 2017 年 11 月,且 requires 字段指向 EIP-606——Homestead 的元提案。DAO 分叉夹在 Frontier、Homestead 之后,当时还没有成熟的元提案惯例,早期几次升级的文档补全正是这批事后 EIP 的分工。把这段历史读全,能理解为什么以太坊的升级档案是「先有事实后有条目」的拼贴画,而不是预先规划的目录树;也解释了为什么后来连 Meta 类型提案一度也被放弃,直到 EIP-7568 式的回溯补编出现。

快速问答

问:DAO 分叉改了发行量吗? 答:没有改发行规则,只是把既有余额在账户间平移,总量不变。

问:不规则状态变更和后来的状态迁移(比如账户代码迁移类提案)有何异同? 答:同点都是一次性改写状态而非规则;不同在 DAO 是一次政治决定的孤例,后续提案都试图给出规则化的迁移机制。

问:怎么验证那份账户名单? 答:名单在 EIP 原文的折叠区,配合任意全节点在 1880000 至 1919999 区间的状态快照即可复核每个地址的余额去向。

一条直觉线

把协议想成法律、状态想成账本:普通硬分叉修法律,DAO 分叉是全体公证人同意在某页直接把几个名字划掉重写。前者每次生效都留下可复用的条文,后者用完即弃——这正是它稀有、也它刺眼的双重原因。

常见误区

一是把「硬分叉」三个字自动翻译成「协议变了」,本案例是最佳反例;二是混淆分叉激活块(1920000)与扫描起点(1880000),后者是确定名单取材范围的锚点;三是把这次迁移说成「回滚」,链上没有撤销任何历史交易,只是改写了交易造成的最终余额。

风险提示:本文复盘历史事件与文档,不构成投资建议;涉及金额与地址请以原文名单和链上数据为准。