NONDUBITO

凿构周期律 · 区块链系列 06 / 21

The DAO

The DAO 事件把代码执行、参与者意图、节点选择与市场命名拆成四套规则,也留下两条继续运行的链。

一 四套规则

这段历史最常见的压缩版本是一句话:一个智能合约被黑,以太坊为了退款回滚,然后诞生了 ETC。

这句话里至少有三处不准确,后面几节逐个处理。

而更要紧的是,它把一件事讲小了。

2016 年那三个月真正做到的,是把四套此前被默认为同一件事的规则,当着所有人的面分开了。

EVM 会执行什么。

The DAO 的参与者原本想要什么。

以太坊的节点愿意接受什么新的协议规则。

市场愿意把哪一条链叫做以太坊。

在此之前,这四个问题的答案被假定是一致的。此后再也没有人能这样假定。

而它们分开的方式很具体。同一段代码,在同一个虚拟机上,按同样的规则执行了;执行的结果,参与的人几乎一致认为不是他们想要的;于是有人提议改一条协议规则去抵消那个结果;而改与不改,最后由几群互不隶属的人分别决定:写客户端的,挖矿的,开交易所的,以及买卖那枚币的。

四件事,四批人,四种决定方式。

而余项就在这四套规则的接缝里。它不是任何一套规则没有覆盖到的东西,恰恰相反:它是四套规则各自覆盖到了,而给出的答案彼此不同的那一块。

先看它到底是什么。

Christoph Jentzsch 那份白皮书的题目是自动化治理的去中心化自治组织。它首先描述的不是一家公司,是一套把组织决策规则写进以太坊智能合约的实现。

它的核心问题意识也不是众筹。是委托与代理:如何让出资者直接决定共同资金的流向,从而减少管理人和资金所有者之间的距离;同时又为少数派准备一条不必服从多数决的退出通道。

这两个目标本身是有分量的。前一个针对的是一个几百年的老问题:把钱交给别人打理的人,没有办法持续知道那个人在做什么。后一个针对的是另一个老问题:少数派在一个组织里,通常只能服从或者退出,而退出往往要付出损失。

把这两件事同时写进合约,是一个相当大的抱负。

上一篇里那个构,做的事情是给执行定价。

而这一次这个构,要做的事情是给决策定规矩。

给执行定价的那一套,后来被证明是这条链最耐用的部分之一,十年没有出过原理性的问题。而给决策定规矩这一套,只运行了不到两个月。

这中间的差别,是接下来七节要拆的东西。

二 三个权力节点

Slock.it 是这套抽象框架背后的具体商业力量。

它是一家德国的区块链与物联网创业公司,由 Christoph Jentzsch,Simon Jentzsch,Stephan Tual 等人推动。它的设想是把智能合约与真实物品连接起来,让门锁,车辆或者别的设备可以被自动出租和共享。

而它当时已经公开准备向 The DAO 提交自己的第一个重大融资提案。

所以这里有一个必须限定的流行说法。

Slock.it 创建了它然后完全无关,不对。Slock.it 控制它,也不对。

材料能支持的较窄版本是:Slock.it 写作,部署并推广了代码,经营主要的沟通渠道,挑选了首批 Curator,并且准备成为首批承包商之一;而在部署之后,Slock.it 本身没有一把能够任意把资金转进自己账户的管理员私钥。正常的资金拨付仍然要满足合约里的投票和白名单条件。

再看那三个权力节点各自是什么。

提案这一头。一个承包方想拿到钱,要先部署相应合同,再向 The DAO 创建提案,指定收款地址,金额,讨论截止时间和描述,并支付一笔押金。正常提案至少有约两周的讨论期。只有条件满足之后,执行函数才会按链上的投票结果转移资金。

投票这一头。它不是一地址一票。一个地址持有多少 DAO Token,就是它对提案的投票权重。而投过票的代币在提案结束前会被限制转让。

这就产生了一个当时就已经被研究者指出来的激励问题:投赞成票的人希望推动收益项目;投反对票的人会被锁住代币;而干脆不投票的人保持着更大的流动性。

所以这里不存在一个中性的,无成本的直接民主环境。一个人是否参与投票,本身就要付出代价,而代价的方向并不对称。

Curator 这一头是第三个,也是最容易被误解的一个。

白皮书没有假装 Curator 没有权力。它明确写着这个设计给了 Curator 相当大的权力。

Curator 控制的是一份白名单:哪些地址有资格成为 The DAO 的收款方。它的用意是验证提案背后是否存在可识别的承包方,并防止某些恶意的合约结构。在实际运行中,单个 Curator 地址又被做成了多签安排。

首批公开的 Curator 有 11 名,是 Slock.it 在形成 The DAO 时挑选的,同期公告把他们介绍为以太坊生态中的高知名度人士。

而 Gavin Wood 在攻击发生之前的 2016 年5 月已经辞去了这个身份。所以那份 11 人名单是初始名单,不是攻击当天的名单。

SEC 后来对 Curator 权力的描述,比当时的推广材料更重。它认为 Curator 不仅验证承包方的身份和代码,维护白名单,而且实际上能够决定某个地址是否有资格进入可以被支付的集合;它还引述过一位 Curator 把这种权力描述为对白名单拥有完全的控制。此外,Curator 还有逐步下调法定人数门槛的特殊权限。

而反过来,Curator 也不是传统意义上的基金经理。白名单本身不会把任何一枚 ETH 转出去;正常提案仍然需要代币投票达到合约条件。

所以更准确的结构是这样的:

代币持有人提供是否批准的资本权重。Curator 提供谁有资格被支付的入口控制。合约提供最终的执行。

三者都不等于单独的任意支配权。

而这正是后来 SEC 不接受代币持有人有投票权所以不依赖他人这一抗辩的关键。

最后是那个后来出事的机制。

分割本来是一种少数派退出机制,不是普通意义上成立一家受母公司控制的子公司。持有人可以对一个指定了新 Curator 的分割提案投赞成票;之后愿意退出的人,带着自己按比例对应的 ETH 和与历史奖励权利有关的账目,进入一个新的 DAO。

换句话说,子 DAO 是一个拿着我的比例资产离开当前治理共同体的技术容器。它的设计意图,恰恰是不让多数持有人和原 Curator 把少数派的资本永远困住。

这也说明了白皮书理想与实际之间真正的距离在哪里。

距离不是白皮书完全去中心化而现实突然冒出一个 Curator。白皮书本来就承认了那个权力节点,也用分割作为制衡。

真正的差异是:现实中的 The DAO 又叠加了一层链外的事实。代码的作者身份,网站和沟通渠道,首批 Curator 的选择权,以及自己准备成为首批大额承包商。

三 多付的那部分不给票

众筹的窗口是 2016 年4 月30 日到 5 月28 日。

SEC 的口径是:期间约售出 11.5 亿枚 DAO Token,共收到约 1,200 万 ETH,按发售结束附近的估值约为 1.5 亿美元。

而美元数字尤其不能脱离价格时点。

同期一篇安全论文在众筹末期称约 1,150 万 ETH,1.5 亿美元;而后来一项民族志研究写过众筹结束附近约 2.5 亿美元。

这并不意味着合约凭空多收了一亿美元。它说明的是同一批以 ETH 计的资产,被用不同日期的市场价格重估过。

所以研究这件事的募集规模,最稳定的计量单位是 ETH 的数量,不是回看时的美元市值。

价格曲线也不是固定的 1 ETH 换 100 DAO。

部署的代码先以基准比率创建代币,此后创建比率按天上调,最终达到约 1.5 ETH 换 100 DAO。SEC 因此把销售期的价格概括为约 1 到 1.5 ETH 换 100 枚。

而这里有一个几乎从不被提起的会计细节。

后期加价的那部分 ETH,并不等比例地给买家增加投票权。

代码把按基础兑换率对应的那一部分转化成 DAO Token,而价格曲线里多出来的溢价,进入一个叫做额外余额的池子。

也就是说,多付了多少 ETH,和获得多少投票权重,不是同一个变量。

这一句要停一下。

晚买的人付得更多,而他拿到的投票权,并没有按他多付的比例增加。

这也解释了为什么后来的退款必须区分主 DAO 那个 1 比 100 的基础兑换,和额外余额的权利。

而募集总量这个数字本身,至少有三个互相不同的口径。

约 1,200 万 ETH,是 SEC 对整个发售募集额的约数。

约 1,150 万 ETH,是同期经常被引用的众筹规模近似值。

而 11,898,333.9787 ETH,是后来分叉退款代码使用的一个状态口径,它把分叉时相关的主 DAO,子 DAO 和额外余额状态一并纳入,不能直接当成众筹合约累计收到的精确总额。

三个数并列,不互相覆盖。

参与人数同样没有一个可靠的自然人数字。

SEC 明确说明认购是假名的:链上只看得到以太坊地址,没有身份核验,因此一个人可以有多个地址,一个交易所地址也可能代表许多人。

同期报道所说的超过 11,000 名投资者,应当被看作对地址或参与者的近似表达。而后来对分叉前状态的链上快照,得到约 22,092 个非零 DAO Token 账户;另一项历史整理给出 22,873 个持有账户。

两个数字的口径不完全相同,而它们都不是原始众筹买家的人数。

集中度也只能给时间切片。2016 年5 月17 日,众筹尚未结束时的同期统计称,最大的单一持有人不到总量的 4%,前 100 个地址约占 46%。

这说明并不存在一个地址拥有多数票。而它同时说明,没有大股东不等于权力平均分布。

代币持有人实际取得的,是由代码界定的几类权利:按余额加权投票,符合条件时按比例参与奖励,在市场开放后转让代币,以及通过分割带着比例资产退出。

它不是 Slock.it 的普通股。它也不自动赋予对 Slock.it 这家公司,对以太坊基金会,或者对某项物联网知识产权的任何所有权。

现在把两头追一遍。

众筹的时候:认购地址减少 ETH,主 DAO 与额外余额增加 ETH;认购地址增加 DAO Token。

正常投资的时候:DAO 的资产减少,被列入白名单并且经投票批准的承包方增加 ETH;而代币持有人得到的不是立即返还的本金,是项目合同约定产生的未来奖励权利。

所以承担项目失败风险的,是代币持有人的共同资金池。而承包方在提案条件达成之后就可以收到项目款。

这两者不是同一个风险与收益的主体。

这是这个系列里第三次遇到同一种形状。第二篇里,预售把难度上涨的时间风险转给了买家,而厂商拿到了无息的营运资金。第四篇里,提前完成让卖家拿到周转,而买家失去了托管保护。

这一次是:资金池承担项目失败,承包方在条件达成后收到项目款。

四 金额为零

这次攻击常被改写成一段教学代码:先转钱,后改余额,顺序写反了,于是攻击者反复提款。

这抓住了可重入的原则,而它不是实际的调用链。

真正危险的那条路径是这样走的。

第一步,分割函数根据调用者的余额,分割快照里的数据和总供应量,算出这个人应该搬走多少 ETH。

第二步,它先把这一比例的 ETH 放进子 DAO,并给调用者子 DAO 的代币。

第三步,随后进入提取奖励的函数。

第四步,提取奖励的函数调用奖励账户的支付函数。

第五步,那个支付函数使用低级调用把钱发出去,因而会执行接收者的回退函数,而接收者就是攻击合约。

第六步,攻击合约的回退函数再次调用同一个分割函数。

第七步,此刻上一层的分割函数还没有执行最下面那两行:把总供应量减去调用者的余额,以及把调用者的余额清零。

于是第二层看到的还是那个旧的,没有归零的余额,再一次算出同样的搬运金额。

如此递归下去,同一份代币余额,因此可以在状态更新之前多次触发资产迁移。

违反的安全模式,就是今天所说的先检查,再改状态,最后与外部交互。更准确地说,不只是提取奖励这个函数有问题,而是分割已经产生了资产效果,持有人的旧余额却还保持有效,然后奖励那条路径又给了攻击者重新进入分割的控制流机会。

而这里有一个反直觉的细节,它是整件事里最值得记住的一处。

Slock.it 在攻击之前曾经认为,奖励账户里没有可以支付的奖励,因此递归提取不会危及主本金。

这个判断在算术上是对的。可以被提走的奖励确实是零。

而以零金额发起的那次低级调用,仍然会执行接收合约的回退函数。

攻击者需要的从来不是那笔奖励。他需要的是控制流。

一个金额为零所以无害的判断,漏掉的是另一件事:转账的金额确实是零,而控制权仍然被交了出去。

这是这个域里最贵的一次疏忽之一,而它的形状值得记住:被检查的是数量,被忽略的是权限。

上一篇写过 gas 那套机制怎样给执行的每一步定价。而定价管的是要花多少,不管这一步把控制权交给了谁。一次金额为零的转账,在收费上确实接近于零;而在控制流上,它和一次金额巨大的转账没有任何区别。

攻击者利用的具体位置,正是分割函数里先把比例 ETH 给子 DAO,后烧毁原有余额的那一段区间。

编号为 59 的那个提案,通常被记作孤独,如此孤独,提供了执行恶意分割所需要的路径。攻击者提前等过了分割提案的最短辩论期。

这说明它不是 6 月17 日临时发现漏洞然后立即完成的偶发行为。

2016 年6 月17 日,攻击开始。以太坊基金会当天在事件仍在进行时发布紧急公告,说明攻击者正在利用递归调用漏洞把 ETH 转进子 DAO,并公布了恶意子 DAO 的地址;公告同时指出,子 DAO 的时间限制使这些 ETH 当时还不能立即变成攻击者可以自由支配的普通 ETH。

金额的第一个可靠量级是约 360 万 ETH。

一封署名信后来宣称精确到 3,641,694 枚,而这封信的作者身份从来没有通过链上签名之类的方式得到验证。所以它只能作为自称攻击者的文本,不能当作对攻击者身份或者权利的认定。

美元值则随取价时点变化。那些五千万,六千万的标题,只是把约 360 万 ETH 按 6 月17 日不同时间点的价格折算,它们不是第二个损失数字。而攻击之后 ETH 本身迅速下跌,又使按攻击前,攻击中,攻击后价格算出来的损失进一步分叉。

持续多久,分几次这个问题,必须先定义什么叫一次。

一笔外层交易之内可以发生多层递归的内部调用,而攻击还使用了多个恶意合约和多笔外层交易。6 月17 日的最初抽取持续了数小时。

外层交易数,递归调用数,子 DAO 资产转移数,是三个不同的单位。现有的一手材料并没有共同使用一个权威的攻击共执行多少次的数字。

至于攻击前是否有过警告,答案要分三层。

2016 年5 月26 日,三位研究者发布了对 The DAO 的系统性批评,讨论投票冷漠,赞成偏向,以及提案和分割的机制设计攻击,并主张暂缓开始投资。第二天其中一人又公开呼吁临时暂停,而 Vitalik Buterin 公开表示支持。

而把那篇论文说成一个月前就准确公布了最终的可重入攻击,并不准确。它最突出的内容是机制设计和治理风险,不是那条完整的调用链。

6 月9 日,Peter Vessenes 公开讨论了合约里的递归调用问题:外部调用发生在余额归零之前,就可能让接收方重新进入。这已经和最终攻击的核心技术性质直接同源。

6 月12 日,Slock.it 公开回应了这个问题,称框架的更新版本已经防护这一类调用,而同时作出了当前资金没有风险的判断。

所以这里的历史意义,不在于证明他们完全不知道可重入。恰恰相反:他们已经知道通用的递归调用风险。

问题在于,他们没有识别出部署中的那一份合约,可以经由分割加奖励的组合,把一个通用的缺陷变成主本金的抽干。

五 六月二十八日

攻击之后那一个月,最值得看清楚的不是硬分叉,是软分叉为什么死掉。

6 月17 日当天,以太坊基金会提出的第一个方案是软分叉,而且明确标注着不回滚:从某个指定高度开始,让那些会减少 DAO 及其子 DAO 余额的相关调用导致整笔交易无效,以此冻结资金。

6 月21 日,一批志愿者开始使用相同的分割弱点,抢先把仍然处于可攻击状态的大量 ETH 迁入他们控制的白帽子 DAO。历史整理通常写为保护了剩余约七成的资金。

这次反攻的性质要说清楚。

它不是协议层的强行转账,也不是警方冻结。它使用的是与攻击者同一类别的,已经部署的合约行为,在攻击者取得剩余资产之前把它们带走。技术上更接近防御性的利用。

而这也意味着,资金从所有代币持有人共同控制的主 DAO,转到了白帽子控制的子合约。他们承担了保护资金和未来返还的操作风险,同时也取得了相当大的临时事实控制权。

6 月23 日,Peter Todd 等外部开发者公开要求真正的持币人表态,并批评把模糊的社区共识当成充分的授权。这是后来那场代表性争论的重要前奏。

6 月24 日,基金会发布软分叉的投票安排。而这里有一个细节:软分叉的支持由矿工通过区块 gas 上限信号来表达,不是由 DAO Token 投票表达。

然后是 6 月28 日,真正的转折点。

客户端实现被发现有一个高严重度的拒绝服务缺陷。

攻击者可以构造一笔最终会触及被冻结状态的交易,使矿工先执行大量的运算,直到发现这笔交易因为软分叉规则而无效。而无效的交易不支付相应的费用。

于是就形成了一个近乎免费让矿工做计算的攻击面。

基金会因此要求社区对软分叉投反对票,或者关闭那个选项。

这一段值得和上一篇接起来读。

上一篇写过,gas 那套机制解决的正是资源必须有价格,执行必须有界这个结构问题。它的全部作用,就是让每一步执行都被付费。

而这条为了冻结资金而临时写下的规则,恰好造出了一段被执行了却没有被收费的计算。

一条为了救火而加的规矩,自己变成了一个新的火源。而且是同一类火。

这件事在这个系列里第一次出现,而它后面还会以别的形式回来:一个为了处理某次事故而临时加上去的机制,自己成了下一次事故的入口。原因不复杂:临时的东西没有经过它所进入的那套系统原本要求的全部检验,而它却和那套系统一样具有全网效力。

基金会后来的复盘还披露,匆忙写出的软分叉实现另有潜在的数据竞争问题,那是普通的单元测试很难捕捉的;这件事后来直接推动了网络级仿真测试工具的建设。

软分叉退出主要路径之后,讨论集中到硬分叉或者不干预。

7 月15 日,基金会正式公布硬分叉的规范:在区块 1,920,000 的开头,把名单上相关账户的 ETH 转进一个退款合约。

同一份公告还宣布,以 CarbonVote 在区块 1,894,000 的结果,来决定 Geth 客户端的默认分叉选项。

默认这两个字要留意。它不是强制,而它在实际效果上决定了绝大多数不去改配置的节点会走哪一边。

六 百分之五点五

CarbonVote 是一次按 ETH 余额加权的表态,而围绕它的数字,正好是口径问题的教材案例。

一份被保存下来的 7 月16 日快照显示:参与的总量约 4,542,416 ETH,占当时约 8,205 万枚供应量的 5.5%;其中约 3,964,516 枚,也就是 87% 支持分叉,约 577,899 枚,13% 反对。

而支持票里,约四分之一来自一个地址。

这几个数摆在这里,不加评论。

要说的只有一句关于口径的话:这是一次按余额加权的表态,不是按人计票,也没有任何机制阻止一个人使用多个地址,或者把币临时转进来投一票。

后来广为流传的那个 97%,出现在 7 月19 日前后的标题里,对应的是更晚的页面和不同的参与票口径。

无论采用哪一个,都不能改写成 87% 或者 97% 的以太坊使用者投票支持分叉。更不能写成 97% 的节点,或者 97% 的矿工。

7 月20 日,区块 1,920,000 执行了那次状态变更。基金会称分叉平稳,最初约有 85% 的矿工在分叉链上出块。

现在处理那个最容易讲错的技术问题:它是不是一次回滚。

在狭义的链状态和协议工程意义上,不是。

以太坊没有把链头退回到 6 月17 日之前,删除那些区块,再从旧的高度重新出块。攻击交易至今仍然属于两条链共同的历史。

发生的是:在区块 1,920,000 引入一条特殊的共识状态规则,把特定账户的余额搬到退款合约。基金会自己用的词是不规则的状态变更。

而在经济结果和政治论战的意义上,回滚有更宽的含义:此前代码执行已经让恶意子 DAO 取得的资产效果,被后来的协议规则定向抵消了。

所以这两个命题可以同时成立,而且并不矛盾。

它不是把整条区块链倒带。

以及,它以协议干预撤销了攻击在经济所有权上的预期结果。

前者描述的是状态转换的技术,后者表达的是反对者所说的那种规范意义上的回滚。

两个词描述的是同一件事在两个层面上的样子。而后来十年里绝大多数关于这件事的争吵,都是一方拿着前一个层面的事实,去反驳另一方在后一个层面上的主张。

退款合约的原则是 100 枚 DAO Token 换 1 枚 ETH。

在分叉完成的当天,基金会称约 450 万 ETH 已经由退款合约发给了代币持有人,另有约 46.3 万枚当时处于 Curator 控制之下,等待额外余额这类边缘情况的退款工具完成安全审核。

所以追回了多少这个问题,至少需要三种口径。

分叉时从相关状态迁入退款体系的,基金会给的是约 1,200 万 ETH,链上重算约 1,200.2 万枚。而这不等于投资者已经提现。

分叉当天已经实际付给持有人的,约 450 万枚。而这不是最终的累计退款。

以及后面第八节要讲的那个数:到 2026 年仍然明显没有被原权利人领走的部分。

而不能拿第一个数减去第三个数当作最终的提现总额。因为主退款合约是另一个池子,而且申领至今仍然开放。

七 两条链

在区块 1,920,000 之前,今天所说的 ETH 和 ETC 没有两套不同的历史。它们是同一条链。

分歧发生在:支持那次状态变更的客户端接受特殊的余额迁移,不支持的继续按原有的状态转换规则验证区块。

基金会的客户端甚至明确保留了一个反对分叉的选项,并提醒继续留在原链的人注意重放攻击。

所以 ETC 是 7 月20 日新创建的一条链,只是命名意义上的说法。更精确的表述是:分叉的那一支后来保留了以太坊这个名称,主要的开发团队和多数算力;不分叉的那一支继续原有状态,后来采用了以太坊经典这个名称。

ETC 后来那份独立宣言,把 2016 年7 月20 日和区块 1,920,000 视为自己政治身份的形成时刻,并把不可篡改,可替代性和账本的神圣性放在论证的中心。

它列出的三条不满是:软分叉的黑名单,它认为没有代表性的 CarbonVote,以及硬分叉的那次不规则状态变更。

这一点很要紧,因为它说明反对方最初的论证并不只是攻击者应该拿到钱。

它的主张是:即使某一次干预的受益对象值得同情,允许协议根据具体交易的价值判断去定向改写状态,这件事本身就会损害可预测的账本规则。

而支持一方的论证也不能被简化成为了退款不择手段。他们的说法是:攻击利用的是实现缺陷,不是投资者的共同商业意图;资金当时还被时间锁困在子 DAO 里;存在一个能让原权利人按原有比率领取的狭窄修复;而整个社区,矿工,客户端和基础设施都可以公开选择是否采用。

把两边并排看,能看出一件事:他们争的其实不是要不要相信代码。

支持分叉的一方可以说,协议本来就允许全体节点升级规则,而分叉本身也是代码。

反对的一方则说,如果基础层可以针对具体的历史财产争议制定例外,那么应用层的不可逆承诺就被削弱了。

两边争的是:哪一层的代码,应该具有更高的承诺性。

这个提法比要不要相信代码有用得多,因为它可以被继续往下问:一份应用合约的承诺,是不是应该比运行它的那套协议规则更硬。

如果答案是不应该,那么任何一份合约的不可逆,最终都依赖于运行它的那批人不去改规则。如果答案是应该,那么这套协议就失去了修改自己的能力,包括修补自己的缺陷。

两个答案各有各的代价,而这件事至今没有一个各方都接受的回答。

而把理论上的少数分支变成可交易资产的,是交易所。

Poloniex 在 2016 年7 月下旬宣布新增 ETC 的交易对。通行的历史时间记作 7 月24 日,而 ETC 自己的历史页面按不同的时区记作 7 月23 日。这一天的差别应当作为时间戳口径保存,不必强行抹平。

这个动作非常关键。在此之前,不分叉的那条链可以有节点和矿工,而它的区块奖励是否具有独立的市场价格仍然不明确。有了交易对以后,矿工第一次能够直接比较两条链的币价和挖矿收益;而原来的持有人也突然同时拥有了两套可以交易的余额。

算力方面,分叉当天基金会观察到约 85% 的矿工在分叉链上。而这只能作为分叉初刻的量级,不能推导出 ETC 永久拥有 15% 的算力,因为矿工随后可以随价格和难度不断切换。

此后还出现了一个根本性的口径断点:以太坊在 2022 年完成权益证明转换之后,已经没有可以和 ETC 直接比较的工作量证明算力。把今天的以太坊算力为零解释成它没有安全性,是一次错误的类别比较。

截至 2026 年8 月下旬,两家挖矿数据商根据难度和近期出块时间估算的 ETC 网络算力,大约在 160 到 163 TH/s 之间。这是数据商的估算值,不是链上直接存在的一项总计数,所以应当报成区间。

市值则可以同口径比较。在本次检索的时点,同一家数据商给出的以太坊市值约 2,862 亿美元,以太坊经典约 11.15 亿美元,按同一方法计算相差约 257 倍。这是单一数据商在某一天的时点值。

开发活动没有同样干净的单一指标。把以太坊整个生态的贡献者数量,和 ETC 一个核心客户端仓库的提交数拿来比较,会严重失真。

可以比较稳妥地说的是协议路线:以太坊此后继续大规模升级并最终转向权益证明;ETC 保留工作量证明,同时也有自己的一串升级历史。所以它并不是 2016 年代码冻结之后没有人再开发,而它也没有跟随以太坊的全部路线。

而小算力的工作量证明链,后来付出了它的代价。

ETC 的官方历史记录了 2019 年1 月的一次成功的大规模重组与双花;2020 年7 月31 日,8 月上旬和 8 月29 日又发生了三次成功的多数算力攻击。

Coinbase 对 2020 年前两次做过节点级的复盘:第一次识别出约 800,000 枚 ETC,当时约 580 万美元的双花交易;第二次约 460,000 枚,约 320 万美元。它明确说明自己不是受害者,而因为检测到极大的重组,大幅提高了 ETC 的入账确认要求。第一次攻击还暴露出不同客户端对极深重组的处理方式不同,造成了临时的网络分裂。

8 月29 日的第三次又重组了 7,000 多个区块。这个数字来自矿池与媒体的二手记录,口径与前两次的双花金额不同。

后果不只是币价。交易所需要提高确认数,资金的可用性因此变慢;ETC 的开发者随后讨论并部署了增加深度重组成本的客户端规则。

这里不替读者裁决,只把事实摆出来:一条以反对主观改账作为政治身份来源的链,在面对多数算力的深度重组时,同样必须去研究客户端层面应当如何定义一条过深的竞争链要受到何种额外阻力。而这套规则在 ETC 社区内部也引起过争论。

八 没有人来领

2017 年7 月25 日,美国 SEC 依据交易法第 21 条 a 款发布了对 The DAO 的调查文件。

它的核心法律判断是:The DAO 发售的代币,属于美国联邦证券法意义上的证券,具体是投资合同。因此通过虚拟组织,智能合约,用 ETH 而不是美元购买,在区块链上发行这些形式,并不能把一个满足证券定义的融资安排移出证券法。

其中关于依赖他人努力的那一部分最要紧。

SEC 认为购买者合理地依赖了 Slock.it,其共同创始人以及 Curator 的重要管理努力:Slock.it 创建,推广,维护沟通渠道,筛选首批 Curator,并公开准备自己的第一项重大提案;而 Curator 控制承包方白名单,对提案能否真正进入可执行状态具有很大裁量。

至于代币持有人明明有投票权为什么仍被认为依赖他人,它的理由是:持有人分散而且人数众多;他们的投票只能在事先写好的协议框架内,以及 Curator 准入之后的候选提案之中进行。

而 SEC 没有做的事情,同样必须列全。

它不是针对任何人作出的法院判决,也不构成对任何人证券违法的事实裁判,文件本身明确强调了这一点。

委员会明确表示,基于当时已知的行为,决定不提起执法行动,而没有给出一套可以拆解的免责理由。

它没有最终认定 The DAO 是否属于投资公司法意义上的投资公司。

而它的主要功能是市场告知与法律解释:联邦证券法适用于符合其定义的数字资产发行和交易,不因为一个组织被称作 DAO 就改变。

所以那句 SEC 认定 The DAO 是非法证券骗局,需要重大改写。材料真正支持的是:SEC 认定这些代币在该事实结构下属于证券,而委员会本次没有提起执法行动,也没有作出法院式的违法事实裁判。

现在到了真实世界的那一节。

而这一节写不下去。

可以明确识别的组织有德国的 Slock.it,瑞士的合作方,以及围绕几个链外协调主体的社群。可以明确观察到的市场影响,是 ETH 在攻击消息公布后数小时内急跌,以及交易所此后必须处理分叉,ETC 上币,重放风险和更复杂的资产归属。

而没有任何可靠数据能够回答下面这些问题:多少人因此失业。哪个国家有多少自然人受损。家庭财富减少了多少。融资的可及性因此变化了多少。

根本原因就在设计本身。

认购是假名的,没有身份核验,地址不能可靠地映射到人,企业或者地区。而 The DAO 自己也没有传统意义上的雇员名册。

SEC 的调查可以确认 Slock.it 的企业角色,却没有办法从链上还原全球最终受益人的地理分布。

所以不应该用 11,000 或者 22,000 个地址乘以一个平均损失,去制造受害人数或者地区影响的估计。

而这个缺失也是历史证据的一部分。

一个号称全球,无许可,假名参与的资本池,在发生危机之后,链上的资产流极易被精确追踪,而链外的社会损失异常难以识别。

第二篇的结尾说过,记电的是电力公司,记钱的是企业,而没有哪一个机构的职责是记人。

这里更彻底一层:钱记得精确到最小单位,而人根本无法被识别。

而这不是疏忽。这是设计。

匿名是这套东西承诺过的东西之一,而且是它最被看重的承诺之一。它兑现了。代价是当出事之后想要知道谁受了损失的时候,没有任何人有办法回答。

这两件事是同一件事,不能只要一半。

最后回到那笔钱。

到 2026 年,这件退款工作在技术上仍然没有关账。

约 70,500 枚 ETH 仍然留在历史上的额外余额退款合约里,另有约 4,600 枚等值的资产位于 Curator 多签和历史边缘账户。2026 年,合计超过 75,000 枚的长期无人领取资产被重新组织成一个安全基金,主要用于质押,其收益资助以太坊的安全工作。

而原来的主退款合约不属于这笔基金,仍然维持 100 枚 DAO 换 1 枚 ETH 的兑换权;额外余额的申领也继续开放。该项目称自 2026 年启动以来,又向申领者返还了 738 枚。

十年了,还有人在来领。

而更多的人不会再来。

这就是余项在这里的形状。

不是被漏掉的,不是被压平的,也不是没有被记录的。它是那些永远不会来领的人。

他们的钱在链上,可以精确到最小的单位,任何人都查得到。而他们是谁,在哪里,还在不在,这条链不知道,也没有办法知道。

这和第三篇里那一处正好相反。那一次是数据一直在,而没有人去读。这一次是钱一直在,而没有人来领。

两件事有一个共同点:缺的那一样都不在链上,而链本身运转得毫无问题。

于是一次为了退款而做的干预,十年之后还没有结完,并且自己长出了一个新的治理问题:怎么处理永远不会有人来领的链上财产,同时又不取消任何人的权利。

回到第一节那四套规则。

EVM 会执行什么,那一天它执行了。

参与者原本想要什么,那件事从来不在代码里。

节点愿意接受什么新规则,那是由投票,默认值和升级决定的。

市场愿意把哪条链叫做以太坊,那是由交易所和使用它的人决定的。

四个问题,四套规则,四种决定的方式。

而 2016 年7 月20 日,没有消灭其中任何一个答案。

它把不同的答案,各自变成了一条可以继续运行的链。

两条链今天都还在出块。一条上面那笔钱被退了,另一条上面没有。

链还在结算,而结算什么还没有共识。

资料说明

本文依据公开协议文档、链上记录、法院文书、监管文件与同行评议研究写成;文中的数字均保留其统计口径。系列资料截至 2026 年 8 月。

Where next

沿着问题继续读