肖臻《区块链技术与应用》第23-26讲 - The DAO事件、BEC事件、反思和总结
“代码即法律”的终极考验:The DAO事件与以太坊的硬分叉
摘要:
“重入攻击”不仅仅是理论上的安全漏洞,它曾在现实世界中引发了一场惊天动地的黑客攻击,并最终导致了以太坊社区的分裂。本文基于北京大学肖臻老师的公开课内容,详细回顾了以太坊历史上里程碑式的The DAO事件。文章将带领读者了解The DAO这一早期去中心化自治组织的宏大愿景,剖析其智能合约中致命的“先转账后清零”漏洞是如何被黑客利用的。随后,我们将深入探讨事件发生后,以太坊社区内部关于是否应该“回滚交易”以挽回损失的激烈哲学辩论,以及从失败的软分叉到最终实施硬分叉的曲折历程,最终揭示以太坊(ETH)与以太坊经典(ETC)因此诞生的历史根源。
1. The DAO:一个伟大的去中心化实验
在比特币成功实现“去中心化货币”后,社区开始探索:“如果货币能去中心化,还有什么可以?”DAO(Decentralized Autonomous Organization,去中心化自治组织)的概念应运而生,它旨在用代码构建一个组织的规章制度,实现组织的自治。
The DAO是2016年5月在以太坊上发起的一个具体的DAO项目,其本质是一个去中心化的众筹投资基金。
- 运作原理: 任何人都可以向The DAO的智能合约发送以太币,换取The DAO的代币。持有代币的人可以投票决定投资哪些项目,投资产生的收益也按照代币持有比例进行分配。
- 巨大成功: 这一理念在当时引起了巨大轰动。在短短一个月内,The DAO筹集到了当时价值1.5亿美元的以太币,占据了当时以太币总流通量的百分之十几,成为史上规模最大的众筹项目之一。社区普遍认为,它代表了未来的组织形态。
2. 致命漏洞:重入攻击的现实上演
然而,这个被寄予厚望的项目,在其设计中埋下了一颗定时炸弹。问题出在投资者取回投资和收益的唯一途径——拆分DAO(Split DAO)函数的代码实现上。
2.1 拆分DAO的逻辑
投资者如果想退出,可以调用splitDAO
函数,将自己的代币份额从主DAO中拆分出去,成立一个自己的“子DAO”(Child DAO),相应的以太币也会被转移到这个子DAO中。
2.2 “先转账,后清零”的漏洞
splitDAO
函数的代码逻辑存在一个与我们上节课讨论的拍卖合约完全相同的致命缺陷:
// The DAO 拆分函数的错误逻辑(简化版)
function splitDAO(...) {// ... 检查条件 ...// 1. 先将ETH转给调用者的新地址recipient.transfer(amount);// 2. 后更新调用者在The DAO中的余额balances[msg.sender] = 0;// ...
}
2016年6月,黑客正是利用了这个“先转账后更新状态”的漏洞,发起了教科书般的重入攻击。黑客通过一个恶意合约反复调用splitDAO
函数,在The DAO合约将其余额清零之前,循环地、递归地将资金转出。
最终,黑客成功盗取了The DAO中约三分之一的资金,价值约5000万美元。曾经前途无量的The DAO,上线不足三月便轰然倒塌。
3. 社区的抉择:回滚交易还是坚守原则?
黑客攻击虽然成功,但由于The DAO的设计中存在28天的资金锁定期,被盗资金暂时无法被黑客取走。这给了以太坊社区宝贵的应对时间,但也引发了一场激烈的哲学辩论。
- 回滚派(以Vitalik Buterin为首):
他们认为,The DAO事件影响巨大(Too Big to Fail),如果不加以干预,不仅会使大量投资者的利益受损,更会对整个以太坊生态的信心造成毁灭性打击。他们主张采取补救措施,通过硬分叉回滚交易,将被盗资金物归原主。