編輯 | 白丁,極客 web3
吳說獲授權轉載
摘要
TheDAO 是一個旨在創建去中心化自主投資基金的智能合約項目,於 2016 年由 Slock.it 團隊開發並在以太坊上部署。TheDAO 的設計願景是通過智能合約實現資金管理和投票決策,以社區自治的方式管理資金和項目本身。該項目吸收了大量的 ETH 投資,成爲了當時以太坊上最大的智能合約項目之一。
然而,TheDAO 的合約在推出後不久就被發現了安全漏洞,黑客利用這些漏洞進行攻擊並竊取了大量 ETH。這一事件引發了整個區塊鏈社區的轟動,促使以太坊社區就如何解決這一問題進行了廣泛討論和投票。
最終,以太坊社區通過硬分叉的方式來解決 TheDAO 事件,以拿回被盜取的資金,解除了黑客對資金的控制。這一事件成爲區塊鏈社區討論和思考智能合約安全性、去中心化治理和社區共識等問題的重要案例。
本文爲播客節目(Forkit)於 2018 年 12 月 6 日以 TheDAO 事件爲主題的討論紀要,在原文基礎上有所刪減。該期節目的主持人是 Daniel,嘉賓是 Jan,二人皆爲 CKB/Nervos 公鏈的聯創。
雙方以參與者的視角,對 TheDAO 事件的來龍去脈進行了梳理,並據此對硬分叉、社區治理以及 CodeisLaw 等熱門問題展開了深入討論,時至今日仍然值得大家學習。
正文:
Danial:我們來聊聊大家比較熟悉的以太坊史上最大的一次分叉,即 “TheDAO 事件”。關於 TheDAO 事件,其實我們兩個人都是親歷者。Jan 能不能簡單回顧一下你對 TheDAO 事件的感受?在你講之前,我要先簡單介紹一下 TheDAO 事件。首先的話是德國有一家當時非常知名的區塊鏈公司,叫 Slock.it。
在 2016 年,那個時候區塊鏈行業的環境跟現在有巨大差異,當時一家區塊鏈初創公司是很難得到傳統資本的支持,很難進行融資,因爲你不是股份制公司,沒有辦法在現行的法律架構、監管機制下去監督和管理你的商業行爲和收益,這些在當時都沒有形成邏輯和框架。
當時雖然已經有了 IC0 這個概念,但還特別早期。IC0 的熱潮發生在 2017 年的年中,那麼在 IC0 熱潮一年之前的區塊鏈公司該怎麼去做早期融資?Slock.it 提出了一個想法,就是用區塊鏈的智能合約技術,做一個鏈上版 VC,由大家用加密貨幣爲這家公司衆籌,再去投資區塊鏈上的一些項目,share 共享收益。這種利用智能合約即時清算的能力來共享分紅的做法顯然是非常棒的 idea。
在當時,全世界超過 15% 的可流通以太坊,都投入到了 TheDAO 這個合約中。
然而,TheDAO 的合約有一個 bug 被黑客發現並加以利用了。這個 bug 其實非常簡單,是技術的大牛的話,如果看過代碼,可以發現有一個可被循環攻擊的 bug,黑客可以利用 bug,無限次地從 TheDAO 的合約中提款。比如黑客本來只能提 10 個 ETH,但提款的行爲可以循環一千次,那麼他就可以提出一萬個 ETH。
就是這樣一個問題導致 TheDAO 合約裏面超過 30% 的 ETH 流到了黑客控制的一個 TheDAO 子合約裏,雖然不能立刻提走,要鎖定 28 天。
當時整個社區一片譁然,我們都是這件事的親歷者。那一天,我記得我在 imtoken 的辦公室裏,還在做 imtoken 的手機錢包開發。當天下午,整個辦公室裏是一種凝固的氣氛,因爲 TheDAO 是我們每個人都特別看好且或多或少參與的項目,所以當時大家都特別緊張。Vitalik 領導的以太坊核心團隊,把全部的力量全部都集中在處理 TheDAO 黑客事件中。
Vitalik 當時做了一個判斷,說大致上有三條路可以解決這個問題:
第一條路就是認輸,這些錢到時間就被黑客提走,然後我們想辦法把 TheDAO 給停掉,把所有剩下的錢全部還給投資人;
第二條路就是完成一次軟分叉,鎖定黑客的錢不讓他把這些錢全部拿走,但軟分叉只是保證黑客不會獲益,不能找回投資人的損失;
第三條路就是在軟分差之後再執行一次硬分差,可以把黑客盜走的錢全部還給投資人。第三條路從經濟角度來說顯然是最好的,但問題是,這次硬分叉不是爲了技術上的協議升級,而是爲了解決黑客攻擊,並不 “名正言順”。
對於這個分叉的正確性,當時整個社區展開了一次非常激烈的討論,持續了很長一段時間。我記得我們每個人都是那場討論的參與者,Jan 你還有印象嗎?
Jan:是的。TheDAO 這個事情發生的時候,我記得我是在路上走着,然後印象中應該是少平來找我,因爲那個時候我們在做 EthFans,
Danial:對,少平當時是 EthFans 的運營負責人。
Jan:對,他當時微信告訴我說,好像是 TheDAO 出事了,然後我就去看,隨後意識到這是一個很嚴重的安全事故。我馬上就跟少平講要拉個羣,把大家社區裏的人,至少中國社區這邊給集中起來,方便商討,也方便整個中國社區跟以太坊基金會的進一步溝通。這個事情既然是一個安全事件,就一定會有後續的措施,社區的溝通是必要的。
我們當時和大家討論,說這個攻擊到底怎麼回事?因爲那個時候大家只知道出事了,但黑客是怎麼把 TheDAO 合約裏面的幣弄走的,還不知道。全世界所有人都在分析,沒人知道到底怎麼回事。最後說是黑客連續發現了兩個漏洞。第一個應該是 SplitDAO 的一個 Proposal。但是這是不夠的,因爲這個漏洞只能被利用一次,只能偷走 100 萬美元,那要怎麼樣做才能把所有錢都偷走?
這個時候就需要用到第二個漏洞,也就是最著名的那個重用攻擊漏洞。把這兩個漏洞組合起來的話,黑客就可以把所有的錢都偷走。所以說黑客實際上盜走了非常多的錢。
Danial:你可能對第二個漏洞的具體細節有點記不清了,但是我還記得另外一個事情,就是你當時是第一個在中文社區,我不知道是不是在全球,發現了兩個漏洞組合用法的人,你馬上就對此寫了一篇文章。
你的文章寫出來之後,我把它編輯到社區裏面去的。我對這篇文章做了一個小小的貢獻,就是起了一個叫 “古爾丹之手” 的名字,這篇文章特別有學習價值,包括你完整的分析過程,都特別好。
我覺得 TheDAO 事件特別跌宕起伏。之前我們公司有一個內部訪談,討論 TheDAO 發生的這個攻擊和最後爲了硬分叉,怎麼達成社區共識。我在裏面還扮演了一個小小的、相對重要的角色,就是受到幣乎創始人咕嚕當時給我的一個 idea 的啓發,做了一個投票網站叫 CarbonVote。
然後我們用這個網站去搜集了所有 TheDAO 中還沒被盜走 ETH 的投資者,用他們手上持有的 ETH 來去做一次安全的投票,決定要不要做這次硬分叉。
然後比較幸運的是,以太坊官方團隊看到了我做的這個網站,他們認爲我這個 idea 具有可操作性,最後把這個網站作爲了決定要不要去硬分叉的投票主網站。這個是對我來講深入參與到這個事件當中的有趣經歷。
Jan:對,我覺得這個是當時中國的以太坊社區做的一個比較有意義的事情。我記得當時咕嚕和 Vitalik,關於這個 CarbonVote 也是交流了很多,最後由你親手把它實現出來。確實當時整個社區都在看這個,因爲最後(以太坊)基金會那邊就說這裏有個投票網站,大家如果有什麼意見我們可以投票來試試。
我覺得這個東西非常有意義,因爲它其實顯示了很多問題,一個是很多人來投票,可以看到社區一個大致的意見,但是也凸顯了區塊鏈上投票,甚至可以說是區塊鏈治理一個很明顯的問題 — — 參與投票的人太少。
Danial:現在我想表達一下 TheDAO 事件之後,我的兩個感觸。第一個感觸就是在 TheDAO 事件之前,我們做區塊鏈開發,不管是底層還是應用,缺少那一根 “安全神經”。TheDAO 事件之前我們對安全這個事是沒有 sense 的,但是 TheDAO 事件之後,我們每個人都把安全放在了一個舉足輕重的地位。
我們知道每一步都可能產生無法挽回的損失,必須把安全放到一個非常重要的位置,任何時候都要有安全的 sense。這是 TheDAO 事件前後,大家在做區塊鏈的技術開發當中最大的改變。TheDAO 之前,我們沒有真正重視安全,TheDAO 之後,我們覺得安全太重要了。
Jan:沒錯。我覺得 TheDAO 事件之前,寫智能合約的程序員可能心理狀態就是:不就是一個程序嘛。TheDAO 之後才意識到:我們現在在寫智能合約,這裏面存着錢呢!
這其實是非常有教育意義的事情。你也可以認爲 TheDAO 事件的發生是必然的,因爲即使最後被偷錢的不是 TheDAO 這個合約,一定也會有另外一個 ADAO 或 BDAO 出來,因爲大家的安全意識沒有跟上。所以必須通過這種血的教訓讓大家建立安全觀念。雖然很遺憾,TheDAO 事件後面還是發生了無數的安全事件。
我記 TheDAO 後面就是在上海舉行的 Devcon2,那屆 Devcon 就冒出來非常非常多的關於形式化證明,還有智能合約安全的 talk,大家對安全的關注度非常高。
我記得當時有一個很有意思的事情,應該是 TheDAO 事件發生之前,我在某一個羣裏面說,其實智能合約是非常需要形式化證明的。但是那個時候大家對形式化證明的前景非常非常的悲觀,有一些人就是研究形式化證明的,他們在羣裏面說形式化證明好像能用到的地方很少,有很多事情不能做,可能還要很久形式化證明才能跟智能合約結合上,或者被廣泛應用。
但很神奇的就是,就過了半年時間,對於形式化證明的研究就已經遍地開花,有非常多做形式化證明的人立刻進入了這個領域,就像區塊鏈把很多做密碼學的人帶到了這個領域,TheDAO 事件把很多做形式化(證明)的人帶到了 Crypto 裏。從這個角度看,TheDAO 事件對於學術研究其實是非常有推動意義的。
Danial:因爲 TheDAO 事件之後,他們更容易拿到一些資源去支持他們在這條路上去研究,這會產生更好的進展。我覺得每過一段時間,在形式化證明領域就會有一些有趣的新東西出現,這是在安全這個角度上 TheDAO 事件給我們帶來的最大意義。
另外我還想說的就是 “難”,這個難指的是達成共識真難。在當時大家已經都是受害者,15% 這麼大量的 token 都已經被鎖定,一片哀鴻遍野的情況下,依然很難達成硬分叉的共識。而且到最後即使我們認爲通過投票網站都已經達成了一致,基本上沒有什麼爭議了,但實際上並不盡然。
我可以給大家講一下,就是投票後大家都知道 TheDAO 事件最後還是決定去做硬分叉,但是硬分叉之前吵了很久。大家都非常理性,但雙方各執一詞,因爲這件事牽扯到了 “CodeisLaw” 這個這條 “法規”,在區塊鏈裏面到底是結果爭議還是過程爭議這種形而上的討論,它本身就很難產生最終一致的結果。
雖然投票來說,大家還是理性地選擇拿回損失,而且投票結果是一邊倒,絕大多數的人贊成分叉而很少的人反對分叉。但即使這樣,最後艱難達成共識之後還是多數人選擇朝往左走,少數人選擇往右走,也就是 ETC 的出現。
以太坊最後在 TheDAO 事件之後完成了分叉,形成了兩條鏈,依然有很多人沒有放棄 “原來的以太坊”。
Jan:哎對了,那我其實想問你一個問題:你覺得大部分人選擇支持分叉,是不是說明了大部分人可以爲了利益放棄信仰,哈哈?
Danial:實際上我覺得其實當時是少部分人選擇了支持分叉,而不是大部分。我給你解釋一下是爲什麼。當時在整個以太坊裏面,ETH 總的流通量是 7000 萬。那麼我給你算一筆賬,7000 萬的 token 裏面,15% 被 TheDAO 鎖定,實際上只有這 15% 的持有者是利益相關方,而且我認爲他們願意參與 TheDAO 這個項目中,本身就屬於社區中頭部、活躍的一批人。
這些人的 token 全部被鎖了,那隻能是剩下的人來投票決定怎麼去分叉,因爲我當時沒有做到讓那些把自己的 token 鎖在 TheDAO 合約裏的人也能參與投票,如果做到了才叫公平,他們纔是當事人。
所以其實是那些沒有被鎖的 token 的人決定了那些被鎖掉的 token 的命運。而沒有被鎖的 token 裏面,從投票率來看,最終參與的總數量其實佔比是非常少的。具體數字我記不太清楚了,感覺也就是百萬級別。所以只有少部分人蔘與了投票,而這少部分人大都是支持分叉的,最後才做了這麼一個硬分叉的抉擇。
你剛纔問我說是不是大家都願意選擇利益而怎麼樣,我只能說即使這件事情都已經鬧得轟轟烈烈了,但是願意參與政治討論或者願意參與民主決策的人永遠是人羣中的少部分,而不是絕大多數。
Jan:我覺得你剛纔的回答很好。其實你剛纔正好說明了我的那個觀點不是那麼站得住腳,因爲其實利益相關人的幣都被鎖住了,參與投票的其實是沒有直接利益相關的。我覺得他們投票可能真的是更多地爲了以太坊的未來着想。
Danial:我覺得是的,我相信他們是的。假如我們給所有被 TheDAO 鎖 ETH 的用戶分發某種 token,讓該 token 也能當做票來投的話,那情況肯定就是一邊倒,參與者全部會投贊成分叉。但是當時的條件和技術以及項目的複雜度沒有允許我去做這樣一次複雜的投票設計。
Jan:但其實另外一方的觀點又可以說,那你怎麼知道參與了 TheDAO 的人,他的幣全部被鎖住了,也許他只投了 1/10 的幣到 TheDAO,還有 9/10 的幣可以用來投票。
Danial:是的是的,這就很難說了嘛。但是總而言之,結果就是除掉 15% 被鎖掉的 token,剩下的 token 中,只有少部分參與了這次投票。
Jan:還有一種說法,就是說以太坊的這次分叉顯然反映了所謂的 CodeisLaw,就是鬼扯,也改變了區塊鏈不可篡改的這個性質。你對這個說法怎麼看?
Danial:我特別糾結。這件事情,從理性上來講的話,我是願意堅持 CodeisLaw 的,我不想打破一個像思想鋼印一樣的鐵律。但是從當事人角度來講,我也很在乎自己的經濟損失,而且說實話當時投的還蠻大的。
如果你要是讓我站在行業的角度來講,其實我會理性一點,去恪守 CodeisLaw,如果讓我重新選擇一次的話,我會願意捍衛或者說遵循 CodeisLaw 去重新考慮。因爲最難的不是提出一個觀點或者信仰,而是去堅持一個信仰。
如果我們當時提出了 CodeisLaw,但最後沒有去堅持,那你以後再提出的任何一個觀點或信仰,其分量是都是有待商榷的。
所以現在可以從這個角度去思考,我覺得即使付出再大的代價也要去堅持某種東西,那個堅持本身是非常有價值的。只是當時受限於一些比較狹隘的經濟上的考慮,我沒有那麼堅持,但是現在我會堅持。
Jan:哇,我明白了,我覺得這是一個很有意思的觀點。其實我對 CodeisLaw 一直是有一些懷疑的,因爲作爲開發者很容易理解,寫出沒有 bug 的代碼,就是不可能的。尤其是當你的 APP 越來越大的時候。
所以說如果嚴格遵循 CodeisLaw,那意味着代碼寫了就不能改,換句話說第一次寫代碼就不能出 bug,這個事情好像沒法實現,對吧?所以至少對於這個觀點會有一些猶豫。然後從另外一個角度,我也想爲以太坊辯護一下,我覺得以太坊並沒有打破區塊鏈不可篡改這個性質,爲什麼這麼說呢?
雖然在 TheDAO 事件裏面,以太坊做了硬分叉,但是硬分叉改變的是當前的狀態,並沒有改變歷史。這二者的區別在於什麼地方呢?
我們可以認爲區塊鏈裏面的數據分爲兩種,一種是積累的歷史,一種是當前的狀態。拿比特幣來說,積累的歷史是什麼呢?是過去發的所有交易裏面被花掉的那些 Transaction output,對吧。它們已經被花掉了,不再有效了,但是它們永久地存在於區塊鏈網絡裏,包含它們的交易也永久地存在於區塊鏈裏,這是歷史;
還沒有被花掉的輸出,也就是 UTXO,這是當前的狀態。那麼其實當你去觀察區塊鏈的時候,你會發現歷史是不會變化的,把交易打包變成區塊放在那以後,歷史就永遠在那,但是當前狀態是在不斷改變的。
在正常的情況下,我們是通過發起交易的方式改變狀態的,比如我去花掉兩個 UTXO,這兩個 UTXO 就變成歷史了,然後產生兩個新的 UTXO,這兩個 UTXO 是新的狀態,那麼當前的狀態也就隨之改變了。
所以說在區塊鏈裏面不可篡改的是歷史,狀態是在不斷改變的。我們從這個角度去審視 TheDAO 硬分叉這個事件的時候,你會發現其實這次硬分叉是修復當前狀態,而不是抹掉歷史。
因爲歷史是指黑客發送的那些偷走 TheDAO 裏面資金的交易,這些交易記錄會永遠地留在區塊鏈上。這個是我認爲的區塊鏈最重要的性質,即所有發生過的事情都會被記下來,所有後面的人可以看見它原來的樣子。
Danial:你這個講法非常 makesense,我非常認同。確實是如此,它改變的是狀態。而且這次狀態也是通過社區的共識去改變的,而不是說被被任意地篡改。
Jan:確實,這次硬分叉與所謂 “任意的篡改” 區別非常大,因爲整個社區共識的過程其實花費了非常大的精力,你甚至可以把它看作是人肉的 Pow。
Danial:但是你問我的問題 — — 是否有些人會爲了利益而選擇分叉或者選擇不分叉?我覺得分叉後面的事情就算是給了你一個答案。當社區達成共識,完成了 ETH 分叉之後,其實很快就出現了一個例外。
大概在兩天之後,有一家交易所官方宣佈,他們認爲兩個分叉都有存在的意義,所以決定去維護老的那條鏈(ETC)。然後你知道發生什麼事情嗎?交易所規定如果用戶擁護交易所的這個決定,那麼可以根據當前交易所中 ETH 的數量得到等額的 ETC,即一份錢可以變成兩份錢,基於利益的驅使,ETC 馬上就起來了,而且甚至一度在社區裏產生了一個新的大範圍討論:
ETH 還是不是應該叫 ETH?或者說 ETC 纔是真正的 ETH,因爲它纔是原來的那條鏈。也就是說因爲利益的驅使,該交易所中的用戶傾向於認可會給大家送幣的,原來的這條鏈。
Jan:對,不過這樣的話,我剛纔其實說錯了,其實人們第一次意識到一份錢會變成兩份錢是在 TheDAO 這個時候,不是 BCH 的時候。
Danial:是的,TheDAO 其實是在 BCH 之前。
Jan:對對,沒錯沒錯,不過我覺得這個也不完全是利益驅使。因爲這裏面確實涉及到 “你認爲誰是對的 “ 這個問題。你如果確實認爲 ETC 是對的,那你可能很自然的就會去做這件事。當然當時也有很多陰謀論,比如說 TheDAO 事件或者說 ETC 事件就是這個交易所鼓動的,但是這個無從查證。
Danial:這可能也印證了一開始我在問你分叉的意義時,你提到的:在區塊鏈世界裏面,絕大多數人認可了一個方向,比如說向右走時,有一小部分人不認可,他們仍然保留向左走的權利。
Jan:沒錯。
Danial:所以用戶仍能堅持原來的那條路。我們不去討論動機,只討論可能性,區塊鏈永遠把可能性留給了它的用戶。用戶願意的情況下永遠都有這樣的一種可能性存在,這一點可以杜絕掉那種 “民主暴政”。少數一定要服從多數嗎?不一定啊。你可以不服從,分叉就可以了。而且說不定,這個分叉的結果到最後會走出一條完全不一樣的路。
嚴格地說我們每個人也都是 ETC 的受益者,因爲 ETC 使我們確實多了另一份錢,哈哈哈。ETC 發展到現在也很難說它被蓋棺定論。但是總體來說,整個以太坊的生態還是集中在分叉後的 ETH,包括 Vitalik 核心團隊、基金會,還有所有的工具,周邊社區等等。
其實過去的一兩年中,我很少聽到 ETC 相關的事情,只知道它還存在,而且似乎還受到了蠻廣泛的支持,但是其發展並不讓我覺得會走出一條完全獨立的,並且非常 promise 的路。
Jan:其實我覺得 ETC 發展還不錯。甚至是好於 BCH。因爲不管怎麼樣,ETC 有一個社區,然後也確實在做一些開發以及其他很多的事情。而且當你考慮到以太坊未來要做 PoS 的時候,ETC 想要堅持 PoW,那麼這兩種完全不同的觀念其實會吸引不同的人羣。
還有一點,我覺得 Vitalik 一直對 ETC 非常友好,這是我非常喜歡以太坊社區的一點。相較來說,比特幣社區對於這種分叉的事情是有一定攻擊性的,比如說用算力去碾壓你。但是 ETC 分叉的時候,Vitalik 是非常包容的。
我記得當時社區裏也有人說因爲大家用的 Pow 算法都一樣,我們是不是可以去攻擊 ETC?我們要 51% 攻擊,把 ETC 搞跨,印象中 Vitalik 說過一些話,表示沒有必要這樣做。從那個時候到現在這麼長的時間內,Vitalik 也好,整個社區也好,對於 ETC 還是挺友好的。
大家覺得就是觀念不同的兩羣人,你們發展你們的,我們發展我們的,雙方還可以相互交流技術觀點。都是在搞區塊鏈,而且都是 EVM 生態中的區塊鏈,相得益彰也是一件挺好的事情。我對此非常欣賞。
Danial:嗯,非常非常有趣,ETH 對 ETC 的態度大家有目共睹,沒有主動去攻擊過,甚至沒有在言語上表達過對立,這是非常難能可貴的一件事情,在比特幣社區這很難想象,哈哈,其他我就不說了。我相信還有很多比特幣的 Holder 和用戶,所以我就不表達自己的政治傾向了。
Jan:哈哈,我覺得其實都挺有意思的吧。比特幣社區可能因爲中本聰很早就退出了,導致競爭的激烈程度會更甚一些;ETH 這邊因爲有一個比較核心的團隊在,所以能夠更加友好一些。這算是不同的流派吧。但是我認爲從長遠來看,最後成功的 L1 的區塊鏈一定會走向沒有核心的狀態,包括以太坊。
以太坊現在有基金會,有 Vitalik,這些可以認爲是以太坊作爲一個處於追趕位的區塊鏈網絡,爲了加快自己的發展,必須存在的設置。但未來如果以太坊真的成功了,做到很好了,不需要更多的、太大的改動時,我覺得 Vitalik 會慢慢的淡出,包括基金會也是如此。
Danial:我特別認同你的想法。而且我覺得你這個想法應該是在這個行業裏面很久,經歷過各種各樣思想的洗禮,並且觀察到很多的現象之後,真正意識到去中心化的本質和意義時,纔會發自內心地去認同的一點。