1 The DAO
DAO - Decentralized Autonomous Organization(去中心化自治组织)是以太坊创始人Vitalik Buterin(下称V神)提出的概念,简单来说,就是依靠智能合约在区块链上运行,没有法律实体,可以理解为“去中心化的公司”。
1.1 The DAO 项目
1、众筹阶段
The DAO 是区块链公司 Slock.it 发起的一个众筹项目,在为期28天的众筹阶段期间,众筹们将以太币发送到一个指定的钱包地址,以 1 以太币 == 100 左右DAO Token 的比例换取该项目的代币DAO Token。
拥有DAO Token的人称为 DAO代币持有者(DAO Token Holders)或者 DAO投资者(DAO Investors)。
2、投票阶段
The DAO 完全由社区成员自治,通过部署在以太坊上的智能合约来进行,允许公司提出融资提案。
一旦一项提案被列入白名单,DAO代币持有者就需要对提案进行投票,决定是否为该提案提供项目资金(即决定项目资金的用途),如果项目盈利,则DAO代币持有者也相应地会得到回报。
如果提案获得20%法定人数的支持,则所需资金就会发放到该提案地址。
3、分离退出
当投资者认为被接受的提案具有破坏性或者质量较差时,投资者可以利用 the DAO 中提供的 “exit door”——"split 函数"离开组织。
split 函数允许投资者撤销并取回发送给The DAO的以太币,具体来说:
当有投资者决定从The DAO分离时,投资者通过调用 The DAO 智能合约中的 split 函数 创建出自己的 “Child DAO”,这是一个小型DAO 智能合约;在创建成功之后,该投资者在原来 The DAO 智能合约中的代币被销毁,以太币将被转移到这个新建的小型 DAO 智能合约中;28天后,批准将该小型 DAO 智能合约中的以太币发送到某个地址。
1.2 The DAO 事件
1、The DAO 中的漏洞
分离退出机制中存在 “递归调用漏洞”:
(之后详细分析代码)
2、事件时间表
- 2016.04.30 The DAO上线,开启为期28天的全球众筹;
- 2016.05.10 10天时间,众筹得到的以太币的价值已达到3400万美元;
- 2016.05.15 众筹金额超过1亿美元;
- 2016.05.28 众筹结束,得到超过1150万个以太币,相当于超过1.5亿美元价值,成为全球历史上最大金额的众筹项目;The DAO 开始在各大数字货币交易所进行开放交易;
- 2016.06.09 以太坊开发人员 Peter Vessenes 指出 The DAO存在递归调用漏洞,;
- 2016.06.12 创始人之一的 Stephan Tual 宣布,他们发现了 The DAO 中存在一个 “递归调用 splitDAO 函数” 的漏洞,正着手解决,不过 The DAO 中的资金不会有风险;
- 2016.06.14 修复方案提交,等待 The DAO 成员审核;
- 2016.06.15 The DAO 上的漏洞尚未修复完成,发起攻击的合约就被创立了;
- 2016.06.16 递归调用问题再次被提及;
- 2016.06.17 黑客发起针对 The DAO 智能合约中多个漏洞的攻击,其中也包含了递归调用漏洞,不断地从 The DAO 中分离资产,向一个匿名地址转移了360万个以太币,受制于 The DAO 的28天锁定期原则,黑客需要等到 7.14 才能对这部分资产进行转移;当天,以太坊停止了对所有交易的验证,此行为被社区诟病为“中心化干涉”,违背区块链本意;同时,以太币币价大跌,由¥145元/以太币降至¥68元/以太币;为了挽回这一局势,V神在以太坊官方博客发布公告《紧急状态更新:关于DAO的漏洞》,解释了 The DAO 被攻击的细节,并提供了一个关于分叉的解决方案:(1)首先进行软分叉,使得从区块高度1760000开始,所有关于 The DAO、ChildDAO 的交易都将无效,以此来阻止黑客将以太币提出;(2)再进行一次硬分叉将这些以太币找回;
- 2016.06.18 开放交易验证后,社区号召大家发送大量垃圾交易以阻塞以太坊网络,从而可以减缓 The DAO 资产被转移的速度;
- 2016.06.19 黑客再次发起了攻击,不过这次只有少量的 The DAO 资产被分离;当天,Slock.it 的联合创始人兼首席技术官Christoph Jentzsch 发表博文,提出两条建议:(1)V神提出的软分叉,但是仅能冻结 The DAO 所有资产,黑客和其他投资者都不能提现;(2)硬分叉,可以将所有资金退回,投资者没有损失;
- 2016.06.22 白帽黑客通过使用与黑客同样的方法将剩余2/3未被盗取的资产转移到了一个安全的 ChildDAO 中;
- 2016.06.24 以太坊社区提交了软分叉提案;
- 2016.06.25 Felix Lange 指出软分叉提案存在 DoS 攻击风险;
- 2016.06.30 V神提出硬分叉设想;
- 2016.07.15 具体硬分叉方案公布,建立“退币合约”,但在 7.21 之后,黑客将可以进一步通过分离创造 ChildDAO ,造成所盗资金不受退币合约的影响,因此 7月21日 是硬分叉的最终期限;
- 2016.07.21 超过85%的算力支持硬分叉,以太坊硬分叉成功。
2 以太坊硬分叉
2.1 介绍
(待完善)
2.2 与 The DAO 相关的硬分叉
1、硬分叉
北京时间 2016年07月20日 晚9:30 左右,随着币网以太坊矿池挖出了第19200个区块,以太坊的硬分叉出现;随后,硬分叉后的第一个区块也在14秒后被币网挖出,标志着硬分叉的成功;
2、交易回滚
在第19200个区块进行硬分叉,回滚所有以太币,交易回滚后,此前的交易自动作废,交易被强制恢复到了原来的状态,由黑客转移的价值四千万美元的以太币被成功转移到了新地址,即:经过分叉回滚,黑客盗走的以太币被成功“召唤”回来;
3、部署新的退币合约
建立了“退币合约”,硬分叉之后的以太坊执行这个新的合约,以 100 DAO Token == 1 Ether 的兑换比例兑换回以太币,从而使得 The DAO 投资者可以从 The DAO 项目中取出资金;
The DAO 的原始监管人团队已经辞职,由新上任的团队对接下来 DAO Token 的提取和分发进行监管,并在分发完成后自动解散 The DAO 项目。
4、以太坊经典(Ethereum Classic, ETC) VS 以太坊(Ethereum, ETH)
然而,并不是所有人都支持这次硬分叉。
硬分叉之后形成了两条链:
1、原链——以太坊经典(Ethereum Classic, ETC),对这次回滚不承认的成员继续按照原始链走;
2、新的分叉链——以太坊(Ethereum, ETH),承认本次回滚的成员按照新的分叉链走。
3 The DAO项目相关地址
The DAO: 0xBB9bc244D798123fDe783fCc1C72d3Bb8C189413
The DAO、its extraBalance(0x807640a13483f8ac783c557fcdf27be11ea4ac7a)、all children of the DAO creator(0x4a57450c7014e4ae985403536074abe582adfc8)和 the extrabalance of each child 都被编码在区块1880000的一个 List L 中,L的内容为:https://gist.github.com/gavofyork/af747a034fbee2920f862ed352d32347
从区块1920000开始,L中所有账户的以太币都将转移到合约账户C(0xBf4eD7b27F1d666546E30D74d50d173d20bca754)中,合约C就是硬分叉之后建立的“退币合约”,从这个合约中,DAO代币持有者可以以 1 ETH == 100 DAO Token 的比率提取以太币。
黑客的子合约 The DarkDAO 地址:0x304a554a310C7e546dfe434669C62820b7D83490
参考:
https://www.cryptocompare.com/coins/guides/the-dao-the-hack-the-soft-fork-and-the-hard-fork
https://blog.ethereum.org/2016/07/15/to-fork-or-not-to-fork/