DAO,英文全稱是Decentralized Autonomous Organization ,去中心化自治組織,代碼即法律。
在The DAO項目中,發(fā)行代幣,以太幣可以換取一定數(shù)量的代幣。代幣越多的人投票權(quán)重越大,項目資金的用途需要代幣持有人投票決定,相關(guān)的提議由智能合約支撐。如果你覺得這個投資不符合你的預(yù)期你可以執(zhí)行拆分出去,經(jīng)過七天的拆分期,期間其他用戶可以加入這個拆分。拆分之后在過28天的鎖定期,鎖定期一過你就可以提現(xiàn)了。
The DAO則是區(qū)塊鏈公司Slock.it發(fā)起的一個眾籌項目2015。1個月就籌集到1.5億
重入攻擊,一下是代碼,從代碼上可以看到,代碼先把錢轉(zhuǎn)給了個人然后再把thedao里面用戶的錢清零。問題來了如果我在執(zhí)行在清零的時候報錯不讓他執(zhí)行清零,是不是我可以一直給自己轉(zhuǎn)錢呢?
//totalSupply:當(dāng)前代幣總量
//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]);//把用戶賬戶代幣轉(zhuǎn)給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))//轉(zhuǎn)賬到_account這個賬戶,同時這里會調(diào)用fallback函數(shù)
throw;
paidOut[_account] += reward;
return true;
}
其實在被黑客攻擊之前就有人發(fā)現(xiàn)這個里面的漏洞,但是Thedao社區(qū)還沒有來的急處理
withdrawRewardFor調(diào)用過程最后轉(zhuǎn)賬的時候會調(diào)用fallback函數(shù),黑客利用這個fallback函數(shù)再次調(diào)用splitDAO函數(shù),就在這無限循環(huán)嵌套,永遠(yuǎn)沒有辦法將賬戶置0,黑客在程序嵌套流程中已經(jīng)把賬上的錢轉(zhuǎn)走了,想追也追不回來了。這時就算黑客寫了跳出循環(huán)的規(guī)則也沒有用了。
如此熟悉The DAO代碼與機(jī)制的人,全世界或許不超過100個。黑客利用這兩個漏洞,進(jìn)行了兩百多次攻擊,總共盜走了360萬的以太坊,超過了該項目籌集的以太坊總數(shù)目的三分之一。
幸好有28天的鎖定期,這就有了操作的空間了。thedao意識到趕緊把剩下的錢轉(zhuǎn)走不能再被盜了,問題來了!怎么轉(zhuǎn)走?合約里面沒有寫啊,又不能改合約(去中心化無法修改合約,或者說極其困難修改合約),只能用黑客的方式把剩下的錢轉(zhuǎn)到一個安全的賬戶。到現(xiàn)在應(yīng)該算是及時止損了吧。
這時以太坊社區(qū)鬧翻了天了,一部分人覺得這個太嚴(yán)重了對以太坊可以說是一個重創(chuàng),投資者損失太嚴(yán)重了,事實也證明以太坊市值也在該事件的影響下不斷下跌,他們認(rèn)為必須把黑客手里的錢還給投資者。另一部分人覺的黑客有沒有犯法只是利用你們智能合約里面的漏洞,你不是說的代碼即法律,退一萬步將你THE dao只是以太坊眾多合約里面的一個很普通的合約犯得著為他這樣干嗎!這不是自毀信用嗎?說什么去中心化,說什么無法篡改,你們現(xiàn)在所做的就是強(qiáng)盜強(qiáng)行把別人的錢轉(zhuǎn)走,你們已經(jīng)背離了以太坊的初衷了。
不過玩歸玩鬧歸鬧別把Money開玩笑,以太坊還是做出了這個艱難的決定--分叉(軟分叉)。以太坊升級了代碼,代碼規(guī)定所有有關(guān)這個黑客賬戶轉(zhuǎn)賬交易都不允許寫到區(qū)塊鏈中。因為是個軟分叉以太坊中絕大部分人都把軟件更新了。(軟分叉:升級后的程序認(rèn)為老程序執(zhí)行的交易不合法,未升級的程序認(rèn)為升級后的程序所執(zhí)行的交易同樣是合法的)
大家都以為這個事情就告一段落了,但是情況又有了新變化,以太坊出現(xiàn)了大量的關(guān)于黑客賬戶的轉(zhuǎn)賬交易,很多挖礦的節(jié)點執(zhí)行這樣的交易之后沒有汽油費得,曠工發(fā)現(xiàn)這樣下去吃力不討好啊,很多節(jié)點由于不堪重負(fù)就回退了?,F(xiàn)在離28天的鎖定期沒有幾天了情況已經(jīng)非常緊急了。
以太坊社區(qū)也沒有很好的辦法了只能硬分叉,然后就在社區(qū)里面舉行投票,最后投票結(jié)果是決定硬分叉。將黑客所有的以太幣強(qiáng)行轉(zhuǎn)到一個特殊的合約賬戶,這個賬戶只有一個功能“退錢”,大多數(shù)節(jié)點都在192w個區(qū)塊的時候執(zhí)行這樣的“非法的交易”。但是以太坊社區(qū)質(zhì)疑的聲音還是一直存在,有人說投票不能代表所有還有好多人沒有參與投票,這樣非法的交易已經(jīng)違反了我們建立以太坊的初衷了,這就是強(qiáng)盜行徑,別人把就算錢存在銀行被扣留了我還可以去法院辯解,現(xiàn)在就你們投票就把我的錢給強(qiáng)行轉(zhuǎn)走了。(硬分叉:未升級的程序認(rèn)為升級后的程序所執(zhí)行的交易是不合法的)
過了沒多久有就發(fā)現(xiàn)還有人在沿著老版本在挖礦他們覺的自己才是正統(tǒng)是純粹的。再后來有的交易所也在慢慢接受經(jīng)典以太坊。以太坊社區(qū)發(fā)現(xiàn)硬分叉的后果已經(jīng)無法挽回了但是分成兩條鏈會出現(xiàn)雙花攻擊,于是將代碼升級添加版本號,老版本成為經(jīng)典以太坊ETC文章來源:http://www.zghlxwxcb.cn/news/detail-419106.html
自此以后以太坊社區(qū)再也沒有為任何一個漏洞合約分叉過了,后果太嚴(yán)重了文章來源地址http://www.zghlxwxcb.cn/news/detail-419106.html
到了這里,關(guān)于The DAO事件始末的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!