NONDUBITO

鑿構週期律 · 區塊鏈系列 06 / 21

The DAO

The DAO 事件把代碼執行、參與者意圖、節點選擇與市場命名拆成四套規則,也留下兩條繼續運行的鏈。

一 四套規則

這段歷史最常見的壓縮版本是一句話:一個智能合約被黑,以太坊為了退款回滾,然後誕生了 ETC。

這句話裡至少有三處不準確,後面幾節逐個處理。

而更要緊的是,它把一件事講小了。

2016 年那三個月真正做到的,是把四套此前被默認為同一件事的規則,當著所有人的面分開了。

EVM 會執行什麼。

The DAO 的參與者原本想要什麼。

以太坊的節點願意接受什麼新的協議規則。

市場願意把哪一條鏈叫做以太坊。

在此之前,這四個問題的答案被假定是一致的。此後再也沒有人能這樣假定。

而它們分開的方式很具體。同一段代碼,在同一個虛擬機上,按同樣的規則執行了;執行的結果,參與的人幾乎一致認為不是他們想要的;於是有人提議改一條協議規則去抵消那個結果;而改與不改,最後由幾群互不隸屬的人分別決定:寫客戶端的,挖礦的,開交易所的,以及買賣那枚幣的。

四件事,四批人,四種決定方式。

而餘項就在這四套規則的接縫裡。它不是任何一套規則沒有覆蓋到的東西,恰恰相反:它是四套規則各自覆蓋到了,而給出的答案彼此不同的那一塊。

先看它到底是什麼。

Christoph Jentzsch 那份白皮書的題目是自動化治理的去中心化自治組織。它首先描述的不是一家公司,是一套把組織決策規則寫進以太坊智能合約的實現。

它的核心問題意識也不是眾籌。是委託與代理:如何讓出資者直接決定共同資金的流向,從而減少管理人和資金所有者之間的距離;同時又為少數派準備一條不必服從多數決的退出通道。

這兩個目標本身是有分量的。前一個針對的是一個幾百年的老問題:把錢交給別人打理的人,沒有辦法持續知道那個人在做什麼。後一個針對的是另一個老問題:少數派在一個組織裡,通常只能服從或者退出,而退出往往要付出損失。

把這兩件事同時寫進合約,是一個相當大的抱負。

上一篇裡那個構,做的事情是給執行定價。

而這一次這個構,要做的事情是給決策定規矩。

給執行定價的那一套,後來被證明是這條鏈最耐用的部分之一,十年沒有出過原理性的問題。而給決策定規矩這一套,只運行了不到兩個月。

這中間的差別,是接下來七節要拆的東西。

二 三個權力節點

Slock.it 是這套抽象框架背後的具體商業力量。

它是一家德國的區塊鏈與物聯網創業公司,由 Christoph Jentzsch,Simon Jentzsch,Stephan Tual 等人推動。它的設想是把智能合約與真實物品連接起來,讓門鎖,車輛或者別的設備可以被自動出租和共享。

而它當時已經公開準備向 The DAO 提交自己的第一個重大融資提案。

所以這裡有一個必須限定的流行說法。

Slock.it 創建了它然後完全無關,不對。Slock.it 控制它,也不對。

材料能支持的較窄版本是:Slock.it 寫作,部署並推廣了代碼,經營主要的溝通渠道,挑選了首批 Curator,並且準備成為首批承包商之一;而在部署之後,Slock.it 本身沒有一把能夠任意把資金轉進自己賬戶的管理員私鑰。正常的資金撥付仍然要滿足合約裡的投票和白名單條件。

再看那三個權力節點各自是什麼。

提案這一頭。一個承包方想拿到錢,要先部署相應合同,再向 The DAO 創建提案,指定收款地址,金額,討論截止時間和描述,並支付一筆押金。正常提案至少有約兩周的討論期。只有條件滿足之後,執行函數才會按鏈上的投票結果轉移資金。

投票這一頭。它不是一地址一票。一個地址持有多少 DAO Token,就是它對提案的投票權重。而投過票的代幣在提案結束前會被限制轉讓。

這就產生了一個當時就已經被研究者指出來的激勵問題:投贊成票的人希望推動收益項目;投反對票的人會被鎖住代幣;而乾脆不投票的人保持著更大的流動性。

所以這裡不存在一個中性的,無成本的直接民主環境。一個人是否參與投票,本身就要付出代價,而代價的方向並不對稱。

Curator 這一頭是第三個,也是最容易被誤解的一個。

白皮書沒有假裝 Curator 沒有權力。它明確寫著這個設計給了 Curator 相當大的權力。

Curator 控制的是一份白名單:哪些地址有資格成為 The DAO 的收款方。它的用意是驗證提案背後是否存在可識別的承包方,並防止某些惡意的合約結構。在實際運行中,單個 Curator 地址又被做成了多簽安排。

首批公開的 Curator 有 11 名,是 Slock.it 在形成 The DAO 時挑選的,同期公告把他們介紹為以太坊生態中的高知名度人士。

而 Gavin Wood 在攻擊發生之前的 2016 年5 月已經辭去了這個身份。所以那份 11 人名單是初始名單,不是攻擊當天的名單。

SEC 後來對 Curator 權力的描述,比當時的推廣材料更重。它認為 Curator 不僅驗證承包方的身份和代碼,維護白名單,而且實際上能夠決定某個地址是否有資格進入可以被支付的集合;它還引述過一位 Curator 把這種權力描述為對白名單擁有完全的控制。此外,Curator 還有逐步下調法定人數門檻的特殊權限。

而反過來,Curator 也不是傳統意義上的基金經理。白名單本身不會把任何一枚 ETH 轉出去;正常提案仍然需要代幣投票達到合約條件。

所以更準確的結構是這樣的:

代幣持有人提供是否批准的資本權重。Curator 提供誰有資格被支付的入口控制。合約提供最終的執行。

三者都不等於單獨的任意支配權。

而這正是後來 SEC 不接受代幣持有人有投票權所以不依賴他人這一抗辯的關鍵。

最後是那個後來出事的機制。

分割本來是一種少數派退出機制,不是普通意義上成立一家受母公司控制的子公司。持有人可以對一個指定了新 Curator 的分割提案投贊成票;之後願意退出的人,帶著自己按比例對應的 ETH 和與歷史獎勵權利有關的賬目,進入一個新的 DAO。

換句話說,子 DAO 是一個拿著我的比例資產離開當前治理共同體的技術容器。它的設計意圖,恰恰是不讓多數持有人和原 Curator 把少數派的資本永遠困住。

這也說明瞭白皮書理想與實際之間真正的距離在哪裡。

距離不是白皮書完全去中心化而現實突然冒出一個 Curator。白皮書本來就承認了那個權力節點,也用分割作為制衡。

真正的差異是:現實中的 The DAO 又疊加了一層鏈外的事實。代碼的作者身份,網站和溝通渠道,首批 Curator 的選擇權,以及自己準備成為首批大額承包商。

三 多付的那部分不給票

眾籌的窗口是 2016 年4 月30 日到 5 月28 日。

SEC 的口徑是:期間約售出 11.5 億枚 DAO Token,共收到約 1,200 萬 ETH,按發售結束附近的估值約為 1.5 億美元。

而美元數字尤其不能脫離價格時點。

同期一篇安全論文在眾籌末期稱約 1,150 萬 ETH,1.5 億美元;而後來一項民族志研究寫過眾籌結束附近約 2.5 億美元。

這並不意味著合約憑空多收了一億美元。它說明的是同一批以 ETH 計的資產,被用不同日期的市場價格重估過。

所以研究這件事的募集規模,最穩定的計量單位是 ETH 的數量,不是回看時的美元市值。

價格曲線也不是固定的 1 ETH 換 100 DAO。

部署的代碼先以基準比率創建代幣,此後創建比率按天上調,最終達到約 1.5 ETH 換 100 DAO。SEC 因此把銷售期的價格概括為約 1 到 1.5 ETH 換 100 枚。

而這裡有一個幾乎從不被提起的會計細節。

後期加價的那部分 ETH,並不等比例地給買家增加投票權。

代碼把按基礎兌換率對應的那一部分轉化成 DAO Token,而價格曲線裡多出來的溢價,進入一個叫做額外餘額的池子。

也就是說,多付了多少 ETH,和獲得多少投票權重,不是同一個變量。

這一句要停一下。

晚買的人付得更多,而他拿到的投票權,並沒有按他多付的比例增加。

這也解釋了為什麼後來的退款必須區分主 DAO 那個 1 比 100 的基礎兌換,和額外餘額的權利。

而募集總量這個數字本身,至少有三個互相不同的口徑。

約 1,200 萬 ETH,是 SEC 對整個發售募集額的約數。

約 1,150 萬 ETH,是同期經常被引用的眾籌規模近似值。

而 11,898,333.9787 ETH,是後來分叉退款代碼使用的一個狀態口徑,它把分叉時相關的主 DAO,子 DAO 和額外餘額狀態一並納入,不能直接當成眾籌合約累計收到的精確總額。

三個數並列,不互相覆蓋。

參與人數同樣沒有一個可靠的自然人數字。

SEC 明確說明認購是假名的:鏈上只看得到以太坊地址,沒有身份核驗,因此一個人可以有多個地址,一個交易所地址也可能代表許多人。

同期報道所說的超過 11,000 名投資者,應當被看作對地址或參與者的近似表達。而後來對分叉前狀態的鏈上快照,得到約 22,092 個非零 DAO Token 賬戶;另一項歷史整理給出 22,873 個持有賬戶。

兩個數字的口徑不完全相同,而它們都不是原始眾籌買家的人數。

集中度也只能給時間切片。2016 年5 月17 日,眾籌尚未結束時的同期統計稱,最大的單一持有人不到總量的 4%,前 100 個地址約佔 46%。

這說明並不存在一個地址擁有多數票。而它同時說明,沒有大股東不等於權力平均分布。

代幣持有人實際取得的,是由代碼界定的幾類權利:按餘額加權投票,符合條件時按比例參與獎勵,在市場開放後轉讓代幣,以及通過分割帶著比例資產退出。

它不是 Slock.it 的普通股。它也不自動賦予對 Slock.it 這家公司,對以太坊基金會,或者對某項物聯網知識產權的任何所有權。

現在把兩頭追一遍。

眾籌的時候:認購地址減少 ETH,主 DAO 與額外餘額增加 ETH;認購地址增加 DAO Token。

正常投資的時候:DAO 的資產減少,被列入白名單並且經投票批准的承包方增加 ETH;而代幣持有人得到的不是立即返還的本金,是項目合同約定產生的未來獎勵權利。

所以承擔項目失敗風險的,是代幣持有人的共同資金池。而承包方在提案條件達成之後就可以收到項目款。

這兩者不是同一個風險與收益的主體。

這是這個系列裡第三次遇到同一種形狀。第二篇裡,預售把難度上漲的時間風險轉給了買家,而廠商拿到了無息的營運資金。第四篇裡,提前完成讓賣家拿到週轉,而買家失去了托管保護。

這一次是:資金池承擔項目失敗,承包方在條件達成後收到項目款。

四 金額為零

這次攻擊常被改寫成一段教學代碼:先轉錢,後改餘額,順序寫反了,於是攻擊者反復提款。

這抓住了可重入的原則,而它不是實際的調用鏈。

真正危險的那條路徑是這樣走的。

第一步,分割函數根據調用者的餘額,分割快照裡的數據和總供應量,算出這個人應該搬走多少 ETH。

第二步,它先把這一比例的 ETH 放進子 DAO,並給調用者子 DAO 的代幣。

第三步,隨後進入提取獎勵的函數。

第四步,提取獎勵的函數調用獎勵賬戶的支付函數。

第五步,那個支付函數使用低級調用把錢發出去,因而會執行接收者的回退函數,而接收者就是攻擊合約。

第六步,攻擊合約的回退函數再次調用同一個分割函數。

第七步,此刻上一層的分割函數還沒有執行最下面那兩行:把總供應量減去調用者的餘額,以及把調用者的餘額清零。

於是第二層看到的還是那個舊的,沒有歸零的餘額,再一次算出同樣的搬運金額。

如此遞歸下去,同一份代幣餘額,因此可以在狀態更新之前多次觸發資產遷移。

違反的安全模式,就是今天所說的先檢查,再改狀態,最後與外部交互。更準確地說,不只是提取獎勵這個函數有問題,而是分割已經產生了資產效果,持有人的舊餘額卻還保持有效,然後獎勵那條路徑又給了攻擊者重新進入分割的控制流機會。

而這裡有一個反直覺的細節,它是整件事裡最值得記住的一處。

Slock.it 在攻擊之前曾經認為,獎勵賬戶裡沒有可以支付的獎勵,因此遞歸提取不會危及主本金。

這個判斷在算術上是對的。可以被提走的獎勵確實是零。

而以零金額發起的那次低級調用,仍然會執行接收合約的回退函數。

攻擊者需要的從來不是那筆獎勵。他需要的是控制流。

一個金額為零所以無害的判斷,漏掉的是另一件事:轉賬的金額確實是零,而控制權仍然被交了出去。

這是這個域裡最貴的一次疏忽之一,而它的形狀值得記住:被檢查的是數量,被忽略的是權限。

上一篇寫過 gas 那套機制怎樣給執行的每一步定價。而定價管的是要花多少,不管這一步把控制權交給了誰。一次金額為零的轉賬,在收費上確實接近於零;而在控制流上,它和一次金額巨大的轉賬沒有任何區別。

攻擊者利用的具體位置,正是分割函數裡先把比例 ETH 給子 DAO,後燒毀原有餘額的那一段區間。

編號為 59 的那個提案,通常被記作孤獨,如此孤獨,提供了執行惡意分割所需要的路徑。攻擊者提前等過了分割提案的最短辯論期。

這說明它不是 6 月17 日臨時發現漏洞然後立即完成的偶發行為。

2016 年6 月17 日,攻擊開始。以太坊基金會當天在事件仍在進行時發佈緊急公告,說明攻擊者正在利用遞歸調用漏洞把 ETH 轉進子 DAO,並公佈了惡意子 DAO 的地址;公告同時指出,子 DAO 的時間限制使這些 ETH 當時還不能立即變成攻擊者可以自由支配的普通 ETH。

金額的第一個可靠量級是約 360 萬 ETH。

一封署名信後來宣稱精確到 3,641,694 枚,而這封信的作者身份從來沒有通過鏈上簽名之類的方式得到驗證。所以它只能作為自稱攻擊者的文本,不能當作對攻擊者身份或者權利的認定。

美元值則隨取價時點變化。那些五千萬,六千萬的標題,只是把約 360 萬 ETH 按 6 月17 日不同時間點的價格折算,它們不是第二個損失數字。而攻擊之後 ETH 本身迅速下跌,又使按攻擊前,攻擊中,攻擊後價格算出來的損失進一步分叉。

持續多久,分幾次這個問題,必須先定義什麼叫一次。

一筆外層交易之內可以發生多層遞歸的內部調用,而攻擊還使用了多個惡意合約和多筆外層交易。6 月17 日的最初抽取持續了數小時。

外層交易數,遞歸調用數,子 DAO 資產轉移數,是三個不同的單位。現有的一手材料並沒有共同使用一個權威的攻擊共執行多少次的數字。

至於攻擊前是否有過警告,答案要分三層。

2016 年5 月26 日,三位研究者發佈了對 The DAO 的系統性批評,討論投票冷漠,贊成偏向,以及提案和分割的機制設計攻擊,並主張暫緩開始投資。第二天其中一人又公開呼籲臨時暫停,而 Vitalik Buterin 公開表示支持。

而把那篇論文說成一個月前就準確公佈了最終的可重入攻擊,並不準確。它最突出的內容是機制設計和治理風險,不是那條完整的調用鏈。

6 月9 日,Peter Vessenes 公開討論了合約裡的遞歸調用問題:外部調用發生在餘額歸零之前,就可能讓接收方重新進入。這已經和最終攻擊的核心技術性質直接同源。

6 月12 日,Slock.it 公開回應了這個問題,稱框架的更新版本已經防護這一類調用,而同時作出了當前資金沒有風險的判斷。

所以這裡的歷史意義,不在於證明他們完全不知道可重入。恰恰相反:他們已經知道通用的遞歸調用風險。

問題在於,他們沒有識別出部署中的那一份合約,可以經由分割加獎勵的組合,把一個通用的缺陷變成主本金的抽乾。

五 六月二十八日

攻擊之後那一個月,最值得看清楚的不是硬分叉,是軟分叉為什麼死掉。

6 月17 日當天,以太坊基金會提出的第一個方案是軟分叉,而且明確標注著不回滾:從某個指定高度開始,讓那些會減少 DAO 及其子 DAO 餘額的相關調用導致整筆交易無效,以此凍結資金。

6 月21 日,一批志願者開始使用相同的分割弱點,搶先把仍然處於可攻擊狀態的大量 ETH 遷入他們控制的白帽子 DAO。歷史整理通常寫為保護了剩餘約七成的資金。

這次反攻的性質要說清楚。

它不是協議層的強行轉賬,也不是警方凍結。它使用的是與攻擊者同一類別的,已經部署的合約行為,在攻擊者取得剩餘資產之前把它們帶走。技術上更接近防禦性的利用。

而這也意味著,資金從所有代幣持有人共同控制的主 DAO,轉到了白帽子控制的子合約。他們承擔了保護資金和未來返還的操作風險,同時也取得了相當大的臨時事實控制權。

6 月23 日,Peter Todd 等外部開發者公開要求真正的持幣人表態,並批評把模糊的社區共識當成充分的授權。這是後來那場代表性爭論的重要前奏。

6 月24 日,基金會發佈軟分叉的投票安排。而這裡有一個細節:軟分叉的支持由礦工通過區塊 gas 上限信號來表達,不是由 DAO Token 投票表達。

然後是 6 月28 日,真正的轉折點。

客戶端實現被發現有一個高嚴重度的拒絕服務缺陷。

攻擊者可以構造一筆最終會觸及被凍結狀態的交易,使礦工先執行大量的運算,直到發現這筆交易因為軟分叉規則而無效。而無效的交易不支付相應的費用。

於是就形成了一個近乎免費讓礦工做計算的攻擊面。

基金會因此要求社區對軟分叉投反對票,或者關閉那個選項。

這一段值得和上一篇接起來讀。

上一篇寫過,gas 那套機制解決的正是資源必須有價格,執行必須有界這個結構問題。它的全部作用,就是讓每一步執行都被付費。

而這條為了凍結資金而臨時寫下的規則,恰好造出了一段被執行了卻沒有被收費的計算。

一條為了救火而加的規矩,自己變成了一個新的火源。而且是同一類火。

這件事在這個系列裡第一次出現,而它後面還會以別的形式回來:一個為了處理某次事故而臨時加上去的機制,自己成了下一次事故的入口。原因不複雜:臨時的東西沒有經過它所進入的那套系統原本要求的全部檢驗,而它卻和那套系統一樣具有全網效力。

基金會後來的復盤還披露,匆忙寫出的軟分叉實現另有潛在的數據競爭問題,那是普通的單元測試很難捕捉的;這件事後來直接推動了網絡級仿真測試工具的建設。

軟分叉退出主要路徑之後,討論集中到硬分叉或者不干預。

7 月15 日,基金會正式公佈硬分叉的規範:在區塊 1,920,000 的開頭,把名單上相關賬戶的 ETH 轉進一個退款合約。

同一份公告還宣佈,以 CarbonVote 在區塊 1,894,000 的結果,來決定 Geth 客戶端的默認分叉選項。

默認這兩個字要留意。它不是強制,而它在實際效果上決定了絕大多數不去改配置的節點會走哪一邊。

六 百分之五點五

CarbonVote 是一次按 ETH 餘額加權的表態,而圍繞它的數字,正好是口徑問題的教材案例。

一份被保存下來的 7 月16 日快照顯示:參與的總量約 4,542,416 ETH,佔當時約 8,205 萬枚供應量的 5.5%;其中約 3,964,516 枚,也就是 87% 支持分叉,約 577,899 枚,13% 反對。

而支持票裡,約四分之一來自一個地址。

這幾個數擺在這裡,不加評論。

要說的只有一句關於口徑的話:這是一次按餘額加權的表態,不是按人計票,也沒有任何機制阻止一個人使用多個地址,或者把幣臨時轉進來投一票。

後來廣為流傳的那個 97%,出現在 7 月19 日前後的標題裡,對應的是更晚的頁面和不同的參與票口徑。

無論採用哪一個,都不能改寫成 87% 或者 97% 的以太坊使用者投票支持分叉。更不能寫成 97% 的節點,或者 97% 的礦工。

7 月20 日,區塊 1,920,000 執行了那次狀態變更。基金會稱分叉平穩,最初約有 85% 的礦工在分叉鏈上出塊。

現在處理那個最容易講錯的技術問題:它是不是一次回滾。

在狹義的鏈狀態和協議工程意義上,不是。

以太坊沒有把鏈頭退回到 6 月17 日之前,刪除那些區塊,再從舊的高度重新出塊。攻擊交易至今仍然屬於兩條鏈共同的歷史。

發生的是:在區塊 1,920,000 引入一條特殊的共識狀態規則,把特定賬戶的餘額搬到退款合約。基金會自己用的詞是不規則的狀態變更。

而在經濟結果和政治論戰的意義上,回滾有更寬的含義:此前代碼執行已經讓惡意子 DAO 取得的資產效果,被後來的協議規則定向抵消了。

所以這兩個命題可以同時成立,而且並不矛盾。

它不是把整條區塊鏈倒帶。

以及,它以協議干預撤銷了攻擊在經濟所有權上的預期結果。

前者描述的是狀態轉換的技術,後者表達的是反對者所說的那種規範意義上的回滾。

兩個詞描述的是同一件事在兩個層面上的樣子。而後來十年裡絕大多數關於這件事的爭吵,都是一方拿著前一個層面的事實,去反駁另一方在後一個層面上的主張。

退款合約的原則是 100 枚 DAO Token 換 1 枚 ETH。

在分叉完成的當天,基金會稱約 450 萬 ETH 已經由退款合約發給了代幣持有人,另有約 46.3 萬枚當時處於 Curator 控制之下,等待額外餘額這類邊緣情況的退款工具完成安全審核。

所以追回了多少這個問題,至少需要三種口徑。

分叉時從相關狀態遷入退款體系的,基金會給的是約 1,200 萬 ETH,鏈上重算約 1,200.2 萬枚。而這不等於投資者已經提現。

分叉當天已經實際付給持有人的,約 450 萬枚。而這不是最終的累計退款。

以及後面第八節要講的那個數:到 2026 年仍然明顯沒有被原權利人領走的部分。

而不能拿第一個數減去第三個數當作最終的提現總額。因為主退款合約是另一個池子,而且申領至今仍然開放。

七 兩條鏈

在區塊 1,920,000 之前,今天所說的 ETH 和 ETC 沒有兩套不同的歷史。它們是同一條鏈。

分歧發生在:支持那次狀態變更的客戶端接受特殊的餘額遷移,不支持的繼續按原有的狀態轉換規則驗證區塊。

基金會的客戶端甚至明確保留了一個反對分叉的選項,並提醒繼續留在原鏈的人注意重放攻擊。

所以 ETC 是 7 月20 日新創建的一條鏈,只是命名意義上的說法。更精確的表述是:分叉的那一支後來保留了以太坊這個名稱,主要的開發團隊和多數算力;不分叉的那一支繼續原有狀態,後來採用了以太坊經典這個名稱。

ETC 後來那份獨立宣言,把 2016 年7 月20 日和區塊 1,920,000 視為自己政治身份的形成時刻,並把不可篡改,可替代性和賬本的神聖性放在論證的中心。

它列出的三條不滿是:軟分叉的黑名單,它認為沒有代表性的 CarbonVote,以及硬分叉的那次不規則狀態變更。

這一點很要緊,因為它說明反對方最初的論證並不只是攻擊者應該拿到錢。

它的主張是:即使某一次干預的受益對象值得同情,允許協議根據具體交易的價值判斷去定向改寫狀態,這件事本身就會損害可預測的賬本規則。

而支持一方的論證也不能被簡化成為了退款不擇手段。他們的說法是:攻擊利用的是實現缺陷,不是投資者的共同商業意圖;資金當時還被時間鎖困在子 DAO 裡;存在一個能讓原權利人按原有比率領取的狹窄修復;而整個社區,礦工,客戶端和基礎設施都可以公開選擇是否採用。

把兩邊並排看,能看出一件事:他們爭的其實不是要不要相信代碼。

支持分叉的一方可以說,協議本來就允許全體節點升級規則,而分叉本身也是代碼。

反對的一方則說,如果基礎層可以針對具體的歷史財產爭議制定例外,那麼應用層的不可逆承諾就被削弱了。

兩邊爭的是:哪一層的代碼,應該具有更高的承諾性。

這個提法比要不要相信代碼有用得多,因為它可以被繼續往下問:一份應用合約的承諾,是不是應該比運行它的那套協議規則更硬。

如果答案是不應該,那麼任何一份合約的不可逆,最終都依賴於運行它的那批人不去改規則。如果答案是應該,那麼這套協議就失去了修改自己的能力,包括修補自己的缺陷。

兩個答案各有各的代價,而這件事至今沒有一個各方都接受的回答。

而把理論上的少數分支變成可交易資產的,是交易所。

Poloniex 在 2016 年7 月下旬宣佈新增 ETC 的交易對。通行的歷史時間記作 7 月24 日,而 ETC 自己的歷史頁面按不同的時區記作 7 月23 日。這一天的差別應當作為時間戳口徑保存,不必強行抹平。

這個動作非常關鍵。在此之前,不分叉的那條鏈可以有節點和礦工,而它的區塊獎勵是否具有獨立的市場價格仍然不明確。有了交易對以後,礦工第一次能夠直接比較兩條鏈的幣價和挖礦收益;而原來的持有人也突然同時擁有了兩套可以交易的餘額。

算力方面,分叉當天基金會觀察到約 85% 的礦工在分叉鏈上。而這只能作為分叉初刻的量級,不能推導出 ETC 永久擁有 15% 的算力,因為礦工隨後可以隨價格和難度不斷切換。

此後還出現了一個根本性的口徑斷點:以太坊在 2022 年完成權益證明轉換之後,已經沒有可以和 ETC 直接比較的工作量證明算力。把今天的以太坊算力為零解釋成它沒有安全性,是一次錯誤的類別比較。

截至 2026 年8 月下旬,兩家挖礦數據商根據難度和近期出塊時間估算的 ETC 網絡算力,大約在 160 到 163 TH/s 之間。這是數據商的估算值,不是鏈上直接存在的一項總計數,所以應當報成區間。

市值則可以同口徑比較。在本次檢索的時點,同一家數據商給出的以太坊市值約 2,862 億美元,以太坊經典約 11.15 億美元,按同一方法計算相差約 257 倍。這是單一數據商在某一天的時點值。

開發活動沒有同樣乾淨的單一指標。把以太坊整個生態的貢獻者數量,和 ETC 一個核心客戶端倉庫的提交數拿來比較,會嚴重失真。

可以比較穩妥地說的是協議路線:以太坊此後繼續大規模升級並最終轉向權益證明;ETC 保留工作量證明,同時也有自己的一串升級歷史。所以它並不是 2016 年代碼凍結之後沒有人再開發,而它也沒有跟隨以太坊的全部路線。

而小算力的工作量證明鏈,後來付出了它的代價。

ETC 的官方歷史記錄了 2019 年1 月的一次成功的大規模重組與雙花;2020 年7 月31 日,8 月上旬和 8 月29 日又發生了三次成功的多數算力攻擊。

Coinbase 對 2020 年前兩次做過節點級的復盤:第一次識別出約 800,000 枚 ETC,當時約 580 萬美元的雙花交易;第二次約 460,000 枚,約 320 萬美元。它明確說明自己不是受害者,而因為檢測到極大的重組,大幅提高了 ETC 的入賬確認要求。第一次攻擊還暴露出不同客戶端對極深重組的處理方式不同,造成了臨時的網絡分裂。

8 月29 日的第三次又重組了 7,000 多個區塊。這個數字來自礦池與媒體的二手記錄,口徑與前兩次的雙花金額不同。

後果不只是幣價。交易所需要提高確認數,資金的可用性因此變慢;ETC 的開發者隨後討論並部署了增加深度重組成本的客戶端規則。

這裡不替讀者裁決,只把事實擺出來:一條以反對主觀改賬作為政治身份來源的鏈,在面對多數算力的深度重組時,同樣必須去研究客戶端層面應當如何定義一條過深的競爭鏈要受到何種額外阻力。而這套規則在 ETC 社區內部也引起過爭論。

八 沒有人來領

2017 年7 月25 日,美國 SEC 依據交易法第 21 條 a 款發佈了對 The DAO 的調查文件。

它的核心法律判斷是:The DAO 發售的代幣,屬於美國聯邦證券法意義上的證券,具體是投資合同。因此通過虛擬組織,智能合約,用 ETH 而不是美元購買,在區塊鏈上發行這些形式,並不能把一個滿足證券定義的融資安排移出證券法。

其中關於依賴他人努力的那一部分最要緊。

SEC 認為購買者合理地依賴了 Slock.it,其共同創始人以及 Curator 的重要管理努力:Slock.it 創建,推廣,維護溝通渠道,篩選首批 Curator,並公開準備自己的第一項重大提案;而 Curator 控制承包方白名單,對提案能否真正進入可執行狀態具有很大裁量。

至於代幣持有人明明有投票權為什麼仍被認為依賴他人,它的理由是:持有人分散而且人數眾多;他們的投票只能在事先寫好的協議框架內,以及 Curator 准入之後的候選提案之中進行。

而 SEC 沒有做的事情,同樣必須列全。

它不是針對任何人作出的法院判決,也不構成對任何人證券違法的事實裁判,文件本身明確強調了這一點。

委員會明確表示,基於當時已知的行為,決定不提起執法行動,而沒有給出一套可以拆解的免責理由。

它沒有最終認定 The DAO 是否屬於投資公司法意義上的投資公司。

而它的主要功能是市場告知與法律解釋:聯邦證券法適用於符合其定義的數字資產發行和交易,不因為一個組織被稱作 DAO 就改變。

所以那句 SEC 認定 The DAO 是非法證券騙局,需要重大改寫。材料真正支持的是:SEC 認定這些代幣在該事實結構下屬於證券,而委員會本次沒有提起執法行動,也沒有作出法院式的違法事實裁判。

現在到了真實世界的那一節。

而這一節寫不下去。

可以明確識別的組織有德國的 Slock.it,瑞士的合作方,以及圍繞幾個鏈外協調主體的社群。可以明確觀察到的市場影響,是 ETH 在攻擊消息公佈後數小時內急跌,以及交易所此後必須處理分叉,ETC 上幣,重放風險和更複雜的資產歸屬。

而沒有任何可靠數據能夠回答下面這些問題:多少人因此失業。哪個國家有多少自然人受損。家庭財富減少了多少。融資的可及性因此變化了多少。

根本原因就在設計本身。

認購是假名的,沒有身份核驗,地址不能可靠地映射到人,企業或者地區。而 The DAO 自己也沒有傳統意義上的僱員名冊。

SEC 的調查可以確認 Slock.it 的企業角色,卻沒有辦法從鏈上還原全球最終受益人的地理分布。

所以不應該用 11,000 或者 22,000 個地址乘以一個平均損失,去製造受害人數或者地區影響的估計。

而這個缺失也是歷史證據的一部分。

一個號稱全球,無許可,假名參與的資本池,在發生危機之後,鏈上的資產流極易被精確追蹤,而鏈外的社會損失異常難以識別。

第二篇的結尾說過,記電的是電力公司,記錢的是企業,而沒有哪一個機構的職責是記人。

這裡更徹底一層:錢記得精確到最小單位,而人根本無法被識別。

而這不是疏忽。這是設計。

匿名是這套東西承諾過的東西之一,而且是它最被看重的承諾之一。它兌現了。代價是當出事之後想要知道誰受了損失的時候,沒有任何人有辦法回答。

這兩件事是同一件事,不能只要一半。

最後回到那筆錢。

到 2026 年,這件退款工作在技術上仍然沒有關賬。

約 70,500 枚 ETH 仍然留在歷史上的額外餘額退款合約裡,另有約 4,600 枚等值的資產位於 Curator 多簽和歷史邊緣賬戶。2026 年,合計超過 75,000 枚的長期無人領取資產被重新組織成一個安全基金,主要用於質押,其收益資助以太坊的安全工作。

而原來的主退款合約不屬於這筆基金,仍然維持 100 枚 DAO 換 1 枚 ETH 的兌換權;額外餘額的申領也繼續開放。該項目稱自 2026 年啓動以來,又向申領者返還了 738 枚。

十年了,還有人在來領。

而更多的人不會再來。

這就是餘項在這裡的形狀。

不是被漏掉的,不是被壓平的,也不是沒有被記錄的。它是那些永遠不會來領的人。

他們的錢在鏈上,可以精確到最小的單位,任何人都查得到。而他們是誰,在哪裡,還在不在,這條鏈不知道,也沒有辦法知道。

這和第三篇裡那一處正好相反。那一次是數據一直在,而沒有人去讀。這一次是錢一直在,而沒有人來領。

兩件事有一個共同點:缺的那一樣都不在鏈上,而鏈本身運轉得毫無問題。

於是一次為了退款而做的干預,十年之後還沒有結完,並且自己長出了一個新的治理問題:怎麼處理永遠不會有人來領的鏈上財產,同時又不取消任何人的權利。

回到第一節那四套規則。

EVM 會執行什麼,那一天它執行了。

參與者原本想要什麼,那件事從來不在代碼裡。

節點願意接受什麼新規則,那是由投票,默認值和升級決定的。

市場願意把哪條鏈叫做以太坊,那是由交易所和使用它的人決定的。

四個問題,四套規則,四種決定的方式。

而 2016 年7 月20 日,沒有消滅其中任何一個答案。

它把不同的答案,各自變成了一條可以繼續運行的鏈。

兩條鏈今天都還在出塊。一條上面那筆錢被退了,另一條上面沒有。

鏈還在結算,而結算什麼還沒有共識。

資料說明

本文依據公開協議文檔、鏈上記錄、法院文書、監管文件與同行評議研究寫成;文中的數字均保留其統計口徑。系列資料截至 2026 年 8 月。

Where next

沿著問題繼續讀