DAO,英文全称是Decentralized Autonomous Organization ,去中心化自治组织,代码即法律。

在The DAO项目中,发行代币,以太币可以换取一定数量的代币。代币越多的人投票权重越大,项目资金的用途需要代币持有人投票决定,相关的提议由智能合约支撑。如果你觉得这个投资不符合你的预期你可以执行拆分出去,经过七天的拆分期,期间其他用户可以加入这个拆分。拆分之后在过28天的锁定期,锁定期一过你就可以提现了。

The DAO则是区块链公司Slock.it发起的一个众筹项目2015。1个月就筹集到1.5亿

重入攻击,一下是代码,从代码上可以看到,代码先把钱转给了个人然后再把thedao里面用户的钱清零。问题来了如果我在执行在清零的时候报错不让他执行清零,是不是我可以一直给自己转钱呢?

//totalSupply:当前代币总量
//rewardAccount:奖励账户,用于管理奖励的账户,奖励将分配给该 DAO 的 DAO 代币持有者
//paidOut:已支付到某个地址的奖励金额(以wei为单位)以太币
function splitDAO(uint _proposalID,
    address _newCurator) 
    noEther onlyTokenholders returns (bool _success) {
    	.........
    	// Burn DAO Tokens
           Transfer(msg.sender, 0, balances[msg.sender]);//把用户账户代币转给0,也就是销毁代币
           withdrawRewardFor(msg.sender); // be nice, and get his rewards;将你拥有的代币连同奖励一起给到你的新账户
           totalSupply -= balances[msg.sender];//将合约账户中的钱减少
           balances[msg.sender] = 0;//将合约账户中该用户金额置0
           paidOut[msg.sender] = 0;
           return true;
}
function withdrawRewardFor(address _account) 
    noEther internal returns (bool _success) {
        if ((balanceOf(_account) * rewardAccount.accumulatedInput()) / totalSupply < paidOut[_account])
            throw;

        uint reward =
            (balanceOf(_account) * rewardAccount.accumulatedInput()) / totalSupply - paidOut[_account];
        if (!rewardAccount.payOut(_account, reward))//转账到_account这个账户,同时这里会调用fallback函数
            throw;
        paidOut[_account] += reward;
        return true;
}

其实在被黑客攻击之前就有人发现这个里面的漏洞,但是Thedao社区还没有来的急处理

withdrawRewardFor调用过程最后转账的时候会调用fallback函数,黑客利用这个fallback函数再次调用splitDAO函数,就在这无限循环嵌套,永远没有办法将账户置0,黑客在程序嵌套流程中已经把账上的钱转走了,想追也追不回来了。这时就算黑客写了跳出循环的规则也没有用了。

如此熟悉The DAO代码与机制的人,全世界或许不超过100个。黑客利用这两个漏洞,进行了两百多次攻击,总共盗走了360万的以太坊,超过了该项目筹集的以太坊总数目的三分之一。

幸好有28天的锁定期,这就有了操作的空间了。thedao意识到赶紧把剩下的钱转走不能再被盗了,问题来了!怎么转走?合约里面没有写啊,又不能改合约(去中心化无法修改合约,或者说极其困难修改合约),只能用黑客的方式把剩下的钱转到一个安全的账户。到现在应该算是及时止损了吧。

这时以太坊社区闹翻了天了,一部分人觉得这个太严重了对以太坊可以说是一个重创,投资者损失太严重了,事实也证明以太坊市值也在该事件的影响下不断下跌,他们认为必须把黑客手里的钱还给投资者。另一部分人觉的黑客有没有犯法只是利用你们智能合约里面的漏洞,你不是说的代码即法律,退一万步将你THE dao只是以太坊众多合约里面的一个很普通的合约犯得着为他这样干吗!这不是自毁信用吗?说什么去中心化,说什么无法篡改,你们现在所做的就是强盗强行把别人的钱转走,你们已经背离了以太坊的初衷了。

不过玩归玩闹归闹别把Money开玩笑,以太坊还是做出了这个艰难的决定--分叉(软分叉)。以太坊升级了代码,代码规定所有有关这个黑客账户转账交易都不允许写到区块链中。因为是个软分叉以太坊中绝大部分人都把软件更新了。(软分叉:升级后的程序认为老程序执行的交易不合法,未升级的程序认为升级后的程序所执行的交易同样是合法的)

大家都以为这个事情就告一段落了,但是情况又有了新变化,以太坊出现了大量的关于黑客账户的转账交易,很多挖矿的节点执行这样的交易之后没有汽油费得,旷工发现这样下去吃力不讨好啊,很多节点由于不堪重负就回退了。现在离28天的锁定期没有几天了情况已经非常紧急了。

以太坊社区也没有很好的办法了只能硬分叉,然后就在社区里面举行投票,最后投票结果是决定硬分叉。将黑客所有的以太币强行转到一个特殊的合约账户,这个账户只有一个功能“退钱”,大多数节点都在192w个区块的时候执行这样的“非法的交易”。但是以太坊社区质疑的声音还是一直存在,有人说投票不能代表所有还有好多人没有参与投票,这样非法的交易已经违反了我们建立以太坊的初衷了,这就是强盗行径,别人把就算钱存在银行被扣留了我还可以去法院辩解,现在就你们投票就把我的钱给强行转走了。(硬分叉:未升级的程序认为升级后的程序所执行的交易是不合法的)

过了没多久有就发现还有人在沿着老版本在挖矿他们觉的自己才是正统是纯粹的。再后来有的交易所也在慢慢接受经典以太坊。以太坊社区发现硬分叉的后果已经无法挽回了但是分成两条链会出现双花攻击,于是将代码升级添加版本号,老版本成为经典以太坊ETC

自此以后以太坊社区再也没有为任何一个漏洞合约分叉过了,后果太严重了

Logo

为所有Web3兴趣爱好者提供学习成长、分享交流、生态实践、资源工具等服务,作为Anome Land原住民可不断优先享受各种福利,共同打造全球最大的Web3 UGC游戏平台。

更多推荐