一 四個對象
關於 2020 年3 月12 日那一天,同期材料裡同時出現過四個數:約 400 萬,450 萬,567 萬,832 萬美元。
它們並不一定互相矛盾。
因為它們量的是四個不同的對象。
這四個數在同期的報道裡經常被互換使用,而互換的後果不只是不精確。它決定了這件事被理解成什麼:是一次協議的虧損,還是一批人的財產損失,還是一場拍賣的定價失敗。三種理解對應三套完全不同的追問。
是協議虧了錢,那麼該問的是資本緩衝夠不夠。是一批人損失了財產,那麼該問的是他們能不能拿回來,找誰拿。是一場拍賣沒有定出價,那麼該問的是這個機制在什麼條件下會失靈。
三個問題都成立,而且指向的是同一批事實。區別在於它們把注意力放在哪一頭。
而這三個問題,後來分別走了三條不同的路。
協議那一條走完了,而且走得很快:一個星期之後就用新鑄的 MKR 把缺口補上了。
拍賣那一條走了一年多,改了參數,又整個換掉了機制。
而人那一條走到 9 月,在一次只有幾十個地址參加的投票裡,得到的答案是零。
三條路的速度差別本身就說明瞭一些東西。缺口是一個可以計算的數,補它有現成的機制,一星期就夠。機制要改,涉及參數和代碼,一年多。而人要不要被補償,是一個沒有現成機制的問題,於是它被交給了一次投票。
一個是 Vault 被觸發清算這件事本身。一個是拍賣的成交質量。一個是協議因此形成的壞賬。還有一個是 Vault 所有者沒有拿回來的那部分剩餘抵押品。
所以最需要避免的一句話是:Maker 在黑色星期四損失了 832 萬美元。
那 832 萬主要是被近零價拿走的抵押品價值。協議自己沒有收回的債務是另一個口徑。而 Vault 所有者失掉的剩餘權益,是第三個。
上一篇寫的是價格從哪裡來。
而這一次寫的是照著那個價格動手會發生什麼。
兩篇要連著讀,因為中間只隔一步:預言機給出一個數,清算合約照這個數把人的抵押品拿去賣。
而這一步是自動的。沒有人批准,沒有人復核,沒有一個環節可以說等一等。上一篇末尾說過,鏈驗的是有沒有人按規矩說過這句話,不驗這句話是不是真的。
這一次要看的是:當那句話被說出來之後,照它執行的那台機器會做什麼。
二 一次正常的清算
當時的 ETH-A 類型 Vault 採用 150% 的清算率。也就是說,當 Maker 採用的抵押品價格,使抵押品價值與債務之比低於 150% 的時候,這個 Vault 就進入了可以被清算的狀態。
而這裡最容易被誤讀的參數是 13% 的清算罰金。
這 13% 是加在需要從拍賣中收回的債務上,不是最多拿走使用者 13% 的 ETH。
如果債務是 D,拍賣需要籌回的目標金額大致是 1.13 倍的 D。
於是有一個可以推出來的理論上限。
假設一個 Vault 恰好在 150% 的時候被觸發,而拍賣又能按當時的價格無滑點賣出。那麼原抵押品的價值是 1.5 倍的 D,償還債務加罰金只需要 1.13 倍,理論上還剩 0.37 倍。
也就是原抵押品價值的 24.67%。
Maker 後來的賠償方案,採用的正是這個 24.67% 作為理論上限。
實際返回的比例可以更低,因為價格在清算之後繼續下跌,拍賣成交存在折價,執行存在延遲。
拍賣本身分成兩個階段。
創建拍賣的時候,合約記下本輪抵押品,目標金額,被清算 Vault 的所有者,當前出價,最後出價者,單次出價的計時器,以及整場拍賣的截止時間。
第一個階段裡,抵押品的數量保持不變,競拍者逐步提高自己願意付的 DAI。
一旦有人出到了目標金額,就轉入第二個階段。此後 DAI 固定不變,競爭者改為競相接受更少的抵押品。
拍賣結束之後,最終確定的那部分抵押品給勝者,而沒有被賣掉的部分返回給 Vault 的所有者。
第二個階段的存在,是全篇最要緊的一處。
合約專門設計了一個階段,用來把多餘的抵押品還給被清算的那個人。
這不是事後的解釋,是寫在代碼裡的設計意圖:清算既要保護協議的償債能力,也要保護 Vault 所有者的剩餘權益。
當時的幾個關鍵參數是這樣的。
最低有效加價約 3%,也就是新的出價通常至少要比上一次高出百分之三。
單次出價的計時器是 10 分鐘。一旦出現了有效的第一筆出價,十分鐘之內沒有更高的出價,拍賣就可以結束。
這是後來那件事的核心脆弱點之一。
每一場拍賣的抵押品規模,同期材料把 ETH 拍賣描述為最高或者典型 50 枚一場;事後很快就有提議把它放大到 500 枚。
至於整場拍賣的絕對最長時間,本次取得的一手材料不足以穩妥確認 3 月12 日生產環境裡的具體數值,所以不把後來的參數倒填成事發之前的參數。
零出價這個名字本身也要糾正。
代碼要求新的出價必須大於舊的出價;而初始出價是 0,所以從合約語義上說,字面意義的 0 DAI 無法成為第一筆有效出價。
學術重建也更謹慎地把這些拍賣描述為以接近零的 DAI 結束。
所以零出價應當理解成當時社區和媒體使用的一種簡寫,指的是經濟意義上的零價或者極小的正數,而不能僅憑標題斷言每一筆鏈上的出價字段嚴格等於零。
參與者在這個體系裡承擔兩個不同的職能。任何人都可以去觸發一個已經不安全的 Vault 的清算;而參與拍賣的人則拿 DAI 競購抵押品。
當時的系統並沒有後來那種明確的固定加比例的啓動獎勵,主要的經濟激勵來自以低於可變現市場價的價格取得抵押品。
所以參與者實際計算的是:抵押品的轉售價值,減去出價的 DAI,減去 gas,減去滑點,減去持有期間的價格風險,減去融資成本。
在市場正常,網絡暢通,參與者足夠多的條件下,競爭會把這個利潤壓薄。
而這正是這套設計對市場化清算價格的核心依賴。
所以一次正常的清算應當是這樣走完的:價格更新,Vault 跌破 150%,清算把債務連同罰金形成目標金額,拍賣開始,多個參與者爭相提高 DAI,最好籌足目標金額,第二階段繼續壓縮勝者可以取得的抵押品,結算,目標金額對應的 DAI 抵消系統債務,勝者得到僅夠覆蓋清算所需的那一部分,剩餘的返回 Vault 所有者。
而那一天真正失效的,是這條鏈上的哪一段,要說清楚。
不是 Vault 能不能被合約識別為低於清算線那一段。
是多個參與者會及時把拍賣價格競爭到合理水平那一段。
而這兩段的性質完全不同。前一段是代碼可以驗證的:抵押率算得對不對,是一道算術。後一段不是代碼可以驗證的,它是一個關於外面世界的判斷。
而兩段被寫在同一份合約裡,看上去是同一種東西。
三 九十六點八與二十九點六
下面的時間統一使用世界時。價格優先採用從鏈上日誌重建出來的小時級軌跡,因為它代表的是協議能夠看到的價格,而不是即時的交易所報價。
那份鏈上重建顯示,絕大部分清算集中在 3 月12 日中午到 3 月13 日凌晨六點的約 18 小時裡。作者還明確指出,市場先跌,而 Maker 的清算高峰約晚一小時,這與那個一小時的延遲設計相符。
八點到九點之間,ETH 已經從約 190 美元的區域明顯下行,而協議看到的仍是較高的滯後價格。後來賠償範圍的討論指出,最早的零返還拍賣已經可以追到約八點,而不是某些方案採用的中午起點。
九點起,大量實際上不可能被打包的待處理交易急劇增加,約三十五分鐘之後生成速率再翻一倍。這些交易多數只帶著約 5 Gwei,而市場當時要求 30 Gwei 以上。
十點到十一點,鏈上的價格圖仍處在約 160 到 170 的區域,而即時市場繼續惡化。
十一點到十二點,即時價格進入當日最陡的跌段。全日的 gas 均值接近 80 Gwei,約為平日的六倍;小時均值一度接近 200 Gwei。
十二點到十三點,鏈上價格開始從 160 多急落到 130 多。觸發條件開始批量越線。
而這裡要說准:並不是預言機始終沒有報價格,而是一小時的設計延遲疊加網絡更新不及時,讓風險集中到了離散的價格跳變上。
十三點到十四點出現了最尖銳的失真。Maker 的價格來源一度仍在約 166,而它所參照的即時市場價格約 130;等到更新交易入塊之後,協議看到的價格一次跳低了 20% 以上。
於是大量此前尚未滿足鏈上清算條件的 Vault,突然同時變成了可以被清算的。
那些依賴逐級價格閾值自動保護 Vault 的工具,也可能被這一次跳變一次越過觸發點。
十五點到十六點是最差的拍賣小時之一。鏈上重建顯示,這一個小時裡結束的拍賣接近 800 場,而成交的中位數接近零;按分位數判斷,至少約四分之三的成交處在接近零的水平。
十六點到十七點,同期的應急記錄稱,最初約兩三個小時裡幾乎只有一個參與者仍在正常觸發清算並以經濟上的零價競拍,隨後其他人才陸續回來。
這個兩三小時是同期的社區記錄,不應該被改寫成一個精確的分鐘數。
而這一句裡最要緊的是那個數量詞。不是競爭變弱了,是幾乎只剩一個。一場需要至少兩個人才能定出價格的拍賣,那幾個小時裡只有一個人在場。
十七點到二十三點,拍賣競爭一度明顯恢復,價格的方差下降,成交水平較為合理。
這一點要寫進來:系統不是整日完全停擺。
而 3 月13 日凌晨一點到兩點,第二波嚴重異常出現,成交中位數又一次接近零。
到早上六點前後,極端的集中失敗逐漸消退。
現在是那對數字。
在那兩天之前,約 96.8% 的拍賣能夠進入第二個階段,也就是能夠籌足目標金額,進而開始壓縮勝者可取得的抵押品。
而 3 月12 日到 13 日,這個比例是 29.6%。
同一份代碼。同一套參數。同一個第二階段。
變的是外面有沒有人來。
這兩個百分比是全篇最應該並排看的一對。它們不是兩個不同系統的對比,是同一個系統在兩個不同日子的表現。
gas 的統計也有幾個不能混的口徑。一家機構報的是全日均值近 80 Gwei,小時均值峰值近 200;另一家後來回看時給的是交易的分位數:那兩天裡出價最高的一半超過 60 Gwei,最高的百分之一超過 400。
這不是誰對誰錯的問題。均值,小時峰值和橫截面的尾部分位數,本來就是三樣東西。
四 六個原因
參與者為什麼沒能把價格頂上去,原始材料支持至少六個互相強化的機制。
第一,gas 估計嚴重滯後。同期分析稱不少自動程序以內存池中間分位數附近的 gas 為依據;而在 gas 瞬時跳升的時候,它們的競價交易排不到前面。
第二,以太坊交易序號的串行性,會把後續交易一起卡住。有機構事後觀察到,一筆早期的低 gas 交易一旦形成序號缺口,後面即使提高 gas 的交易也無法越過前一筆。
第三,DAI 會被併發的拍賣佔用。舊的機制裡,一筆出價在被更高者替換或者拍賣結束之前會一直佔用資金;而幾千場拍賣同時發生,就可能讓一個參與者不是看不到利潤,而是根本沒有足夠的 DAI 去覆蓋新的目標金額。
後來引入的全系統在拍債務總量上限,正是直接針對這個併發資本耗盡的問題。
第四,快速下跌讓拍賣本身形成巨大的逆向選擇與滑點風險。即使一個參與者有 DAI,從他提交競價到成交,再到把 ETH 賣回市場之間,價格可能再跌幾個百分點。同期的應急帖明確說過,有參與者因為滑點風險和長確認時間停下了活動。
第五,部分參與者自建的節點同步或者運行異常。而當時的應急會議把高 gas,節點同步和競爭不足一並列為一個尚未確認的簡單根因。
所以這一條應當保持它原文裡的不確認地位,不能改寫成已經查明的單一故障。
而這一條的不確認狀態本身值得留意。事情過去六年,那一天到底有多少參與者是因為自己的節點出了問題而沒能出價,至今沒有一份可核的統計。
第六,是後來最有爭議的那個解釋:有機構稱發現了大量低 gas,不斷替換,意在佔用內存池資源的交易,並稱此前幾天可能已經有過一次類似的測試。
而它沒有證據證明那一天的暴跌本身由這些行為製造。
能夠較窄地說的是:它的內存池數據支持一種解釋,即人為的流量可能加劇了已有的自然擁堵,並使某些高 gas,近零競價獲得了相對優勢。
把這六條放在一起,可以看出一件事。
沒有一條在合約裡。
它們分別屬於:一段自動程序對 gas 的估計方法,以太坊交易序號的排隊規則,參與者自己賬上有多少 DAI,他對再跌幾個百分點的判斷,他那台機器的同步狀態,以及內存池裡當時有多少別人的交易。
六樣東西,分布在六個互不相干的地方,而其中沒有一樣是這套合約可以規定的。
它們唯一的交匯處,是同一個十分鐘的窗口。
而那十分鐘是合約裡唯一一個可以被調的數。事後它被調到了六小時。
合約看不見其中任何一樣。它只看得見有沒有人在十分鐘之內提交了一個更高的出價。
而在它看來,沒有人提交更高的出價,和所有人都認為這個價格已經合理,是同一件事。
這一條是自動清算這類機制最深的一處結構問題。
一場拍賣之所以能定出合理的價格,靠的是有人不同意當前的報價。而合約能觀察到的只有沈默,它沒有辦法分辨這個沈默是同意,還是沒有人在場。
而這正是上一篇那道縫的另一側。那一側的問題是有人說了什麼而鏈不知道真假;這一側的問題是沒有人說話,而鏈不知道這個沈默意味著什麼。
兩側合起來,是同一件事的兩種表現:合約能處理的只有已經提交上來的東西,而它面對的世界裡,最要緊的信息常常是沒有被提交的那一部分。
五 七十四點三七
要看清損失到底是什麼,最好的辦法是拿一個可以逐項核對的個案。
有一位 Vault 所有者在公開渠道給出了完整的參數:抵押品 355.77 枚 ETH,債務 35,613.38 DAI,他自己界面上顯示的清算價格是 143.01 美元。最終返回 0。
按這些數字重算一遍。
目標金額等於 35,613.38 乘以 1.13,約 40,243.12 DAI。
如果按 143.01 一枚無滑點成交,需要賣出約 281.40 枚。
理論上應當剩下約 74.37 枚。
所以他因為拍賣失敗而多損失的,不是 355.77 枚。
是那 74.37 枚。
這個例子是理解 13% 罰金最好的一個。他的 355.77 枚不是本來只會損失其中的 13%;那個 13% 乘的是 35,613.38 的債務。即使按他自己給出的清算價格參數,正常的拍賣也要賣掉約 281.4 枚,只應退回約 74.4 枚。
近零成交帶來的額外傷害,是這約 74.4 枚的剩餘權益也沒有回來。
而不是相比完全不被清算損失了 355.77 枚。
這個區分不是替誰開脫。它決定的是賠償如果要做,該按什麼數做。而後來的方案確實是按後一個口徑算的。
這也解釋了為什麼那 832 萬美元和賠償規模不能畫等號。
前者包括了本來就應該被賣掉,用於消滅借款和罰金的那一部分抵押品。後者如果按恢復到正常清算結果來算,只涉及正常拍賣之後本應返還而沒有返還的那一部分。
Maker 後來的賠償分析給出的最高理論規模約為 288 萬 DAI,而不是 832 萬美元。
同期的論壇上專門建立了受影響者的登記帖。下面這些是公開可查的當事人自述,其中 Vault 編號和抵押品可以進一步在鏈上復核,而生活背景,本應收到多少這一類主張不能自動升級為協議或者法院的認定。
一位所有者寫下 109 枚 ETH,清算之後返回 0。他說自己經營一個小型的 GPU 挖礦生意,當時失業,其中一部分 ETH 並非完全屬於自己,原本計劃參與後來的質押。
另一位寫下約 1,000 枚,只返回 2.99 枚。
另一位寫下 118 枚,返回 0。
另一位寫下約 600 多枚,清算之後餘額為零。
另一位寫下 52 枚,返回 0,並說此前還追加過 10 枚。
還有一位寫下 105 枚,返回 0。他說自己曾經嘗試償還 1,200 DAI,而那筆交易長時間沒有確認。
這最後一條不能被用來證明,如果那筆交易及時入塊就一定不會被清算。
而它記錄下來的是那一天在鏈外發生的事情:一個人試圖救自己的倉位,而他的交易沒有進區塊。
這一句要停一下,因為它是這一整段材料裡唯一一處能看見人在做什麼的地方。
鏈上留下的是抵押品數量,債務金額,拍賣編號和成交價格。而鏈下發生的是有人在那幾個小時裡盯著屏幕,湊錢,發交易,然後看著它一直不確認。
後面那一樣,鏈上沒有一個字段可以記。
還有兩位給出了自己的估算。一位約 579 枚,自述清算價格約 178,最後拿到 55 枚,他估算正常情況下至少應該得到 234 枚。另一位 262 枚,自述清算價格約 173,拿到 13 枚,估算至少應得 63 枚。
這些都是當事人自己的算法,而這些帖子沒有給足債務字段,所以這裡不從抵押品數量硬算理論剩餘。
現在追另一頭。
近零價的贏家收到的是拍賣最終確定的那部分 ETH,而它向系統支付的 DAI 在經濟意義上接近零。
按代碼,第一筆有效出價必須是正數,所以不能籠統寫成鏈上嚴格支付了零。
而它還必須支付 gas,並且為了搶過堵塞的交易,那個 gas 通常必須足夠高。
所以那幾個小時裡能贏的條件其實很具體:手上有 DAI,程序沒有卡住,而且願意為一筆交易付出遠高於平日的手續費。滿足這三條的人當時很少,而正是這個少,讓它能以那個價格成交。
本次可取得的材料沒有形成可靠的贏家地址級 gas 總成本,所以不能把免費理解成零成本。
而贏家到底是誰,現有材料只支持一個相當窄的說法。
Maker 當天說最初只有一個參與者。一家機構隨後說出現了模仿者。訴狀則主張有兩套自動程序大量獲勝。另一家機構用複數描述那 1,462 場拍賣。
四種描述,四個不同的時間窗和主體口徑。
本次沒有取得逐場拍賣到贏家地址到抵押品數量到支付成本的完整原始導出表,所以不把某一個地址寫成唯一的攻擊者,更不把地址歸為具體的自然人。
這不是措辭上的小事。
鏈上的地址獲利是可以驗證的事實。
而那是一個人,一個機器人,還是幾批人,屬於另一層命題,需要另一層證據。
六 三十八個地址
協議的壞賬和 Vault 所有者的剩餘權益損失,最終走了兩條完全不同的路。
先看壞賬這一條。
白皮書原本就規定:抵押品拍賣不足以覆蓋 Vault 義務的時候,缺口成為協議債務;先與協議盈餘抵消,如果仍然不足,就進行債務拍賣,由系統新鑄 MKR,競拍者用 DAI 買入,收到的 DAI 用於消除壞賬。
也就是說,MKR 在設計裡本來就是協議的尾部資本緩衝。
3 月12 日當天,應急會議明確選擇不立即啓動緊急關停,一個重要理由是:關停可能把損失直接施加給 DAI 的持有人,而社區所理解的默契是壞賬應當首先讓 MKR 持有人承擔稀釋。
這是治理參與者的規範性論證,不是法律上的債權優先順序認定。
債務拍賣從 3 月19 日上午開始。每一場固定讓競拍者向系統支付 50,000 DAI,競拍者競爭願意接受的 MKR 數量越來越少。最終共完成 106 場,合計 530 萬 DAI,賣出約 20,980 枚 MKR。
這裡有一個數字口徑陷阱。一篇二手報道給出的平均價是每枚約 279.93 DAI;而用總額直接算,530 萬除以 20,980 約等於 252.62。
前者可能是 106 場清算價格的簡單平均,後者是按全部賣出量算出來的加權總均價。兩者不是同一種平均,不能只列一個而不寫算法。
資金的另一頭也很清楚。一家投資機構公開稱自己贏了 106 場中的 72 場,約 68%,向系統送回 360 萬 DAI。
它在這裡是資本提供者和拍賣買家:它少了 DAI,多了新鑄的 MKR;而原有的 MKR 持有人因為總供應擴大而承受稀釋。
不能把這 360 萬說成賠償了 Vault 所有者,因為這筆錢進入的是協議再資本化的路徑。
再看賠償這一條。
支持賠償的一側認為:正常拍賣的意圖顯然包括把多餘抵押品返還給所有者;那一天的參與者市場,gas 參數和十分鐘窗口沒能做到這一點,所以治理資本不應只補 DAI 的支撐,也應承擔異常拍賣給使用者造成的剩餘損失。還有人強調,界面長期突出那個 13% 的罰金,容易讓人理解為清算損失是有界的。
反對的一側則提出:所有者自己選擇了高槓桿並讓倉位到達清算線;市場價格仍在快速變化,不能假定每一個倉位一定可以在理論清算價成交;而協議從來沒有承諾拍賣必須返回某一個固定百分比。賠償還會把市場風險事後轉給當時的 MKR 持有人,並建立未來極端事件中的救助先例。
也有折衷的論點認為,治理,參與者的基礎設施,以太坊網絡和所有者本人各負有不同程度的責任。
四月初的一次信號投票曾經支持繼續走賠償方向,方案文件記載約有 62,000 枚 MKR 支持,33,000 枚反對。
而這只是支持制定賠償這個方向,不是資金已經發放。
後續方案把理論上的完全恢復定為那個 24.67%,並按不同賠付比例列出所需資金。最高檔的測算約為 2,880,324 DAI,按方案假定的匯率相當於 11,522 枚 MKR;更低的幾檔依次減少。
這些是提案的情景測算,不是實際支付額。
而最終在 2020 年9 月8 日到 22 日舉行的正式補償選擇投票中,選項包括多檔賠償以及零。
約 65% 的投票權選擇了零。
參與者只有 38 個獨立投票地址左右。
這個數不加評論。它只是說明,決定幾百個人能不能拿回抵押品的那次表決,實際到場的是這個規模。
而這不是有人操縱了投票。鏈上治理的參與率長期就是這個量級,那一次並不特別低。
所以治理最終沒有從協議層向那批 Vault 所有者發放這筆補償。
訴訟是另外一件事,必須分開。
2020 年,一位 Vault 持有人對相關實體提起了擬議集體訴訟,主張 Maker 對那個 13% 罰金等風險作了誤導性表述,並主張預言機,參與者的參與程度和拍賣設計等問題導致自己和其他持有人損失全部抵押品。
這些是原告的主張,不能寫成法院認定 Maker 有設計缺陷。
2023 年2 月22 日,聯邦地區法院批准了被告針對第二次修訂起訴書的駁回動議,同時允許原告再次修改。法院的理由涉及訴狀未充分滿足相關請求權的形式要求。
也就是說,這個裁定不是法院證明黑色星期四沒有缺陷,也不是法院認定 Maker 有責任。
案件後來轉為和解。2024 年2 月,聯邦法官批准了約 116 萬美元的集體和解。
這意味著治理層面的零賠償,並不等於所有受影響者在現實世界裡最終一分錢都沒有拿到。
而這 116 萬美元是鏈外的訴訟和解資金,不是治理後來推翻了 2020 年的投票,也不是債務拍賣對 Vault 所有者的賠償。和解本身通常也不等同於法院對責任事實作出實體認定。
所以損失最終由誰承擔這個問題,答案必須分成五層賬。
正常清算本來就應當賣掉的那部分 ETH:少的一側是所有者的抵押品,多的一側是拿到 ETH 的競拍者,而他付的 DAI 用於消滅債務。
異常拍賣造成的額外剩餘損失:少的一側是被近零價拍走的那些所有者,多的一側是那些贏家,而治理後來沒有普遍補回。
沒有從抵押品拍賣收回的系統債務:少的一側是協議的資產負債表,補洞的先是盈餘,然後是新鑄的 MKR。
債務拍賣本身:少的一側是既有 MKR 持有人承受的供應稀釋,多的一側是新買家用 530 萬 DAI 換到了約 20,980 枚。
鏈外的訴訟和解:付錢的是被告實體,拿到的是符合條件的集體成員,而這不是鏈上的治理轉賬。
所以是 Vault 所有者還是 MKR 持有人承擔了損失,這是一個偽二分。
兩者承擔的是不同層的損失。
所有者首先承擔的是異常拍賣沒有返還剩餘權益的那一部分;而 MKR 持有人通過新增的兩萬多枚,承擔的是協議壞賬再資本化的稀釋。
DAI 的持有人當時沒有通過緊急關停被直接削減。而近零價的贏家獲得的,是抵押品成交價與市場價值之間的異常收益。
真實世界那一側的材料明顯比鏈上材料稀少。除了上面那些自述,以及那場集體訴訟和最後的 116 萬美元和解,本次檢索沒有發現能夠可靠量化這一天對就業,某個地區的消費,企業成本或者金融可及性的系統性研究。
這裡應當保留為證據缺失,而不是從若干條自述推斷宏觀影響。
七 每一項改動
事後的改動不是把最低出價從零改成一那麼簡單,因為真正的問題涉及拍賣窗口,交易吞吐,參與者資本,參與者激勵,拍賣形式和治理暫停能力多個層面。
單次出價的計時器從 10 分鐘大幅延長到約 6 小時。它修的是:一筆低價出價之後,十分鐘裡因為區塊堵塞沒有第二個出價,就能用經濟上的零價贏走抵押品。
每場拍賣的抵押品規模從約 50 枚放大到約 500 枚。它針對的是幾千個清算同時造成的交易風暴;而代價是每一場所需要的參與者資本更高,可能進一步讓參與者集中。
引入全系統同時處於拍賣狀態的債務總量上限。它直接針對參與者的 DAI 被同時鎖在太多拍賣裡,資本耗盡的問題。
擴大可接受的抵押品範圍。它針對的是單一資產衝擊和 DAI 流動性不足,而不是直接修復拍賣競爭;同時它引入了發行人,凍結和托管這一類新的中心化風險。
這一條值得單獨看:它是這一整批改動裡唯一一個把新的鏈外依賴引進來的。為了讓一個系統在極端行情下更穩,它接受了一些必須信任發行人的資產。
所以抵押品擴張提高安全性這個說法,需要這一層限定。
而最根本的改動是用荷蘭式拍賣取代原來的兩階段競價。
配套的還有幾項:內置的四檔停機狀態,可以逐級禁止新拍賣直到完全阻止購買,使治理在預言機異常或者拍賣明顯錯誤定價時可以暫停局部清算,而不必馬上使用全系統的緊急關停;全局與單一抵押品的吞吐限制,把參與者與市場可吸收的能力作為顯式參數,而不是假定無限深度;固定加比例的啓動與維護獎勵,直接解決舊系統高度依賴外部參與者,而啓動和維護拍賣的獨立經濟激勵不足的問題;以及起拍價可以在基準之上加緩衝,拍賣隨時間自動降價,超過最長時間或者價格下降閾值可以重置。
最根本的變化,是從多人不斷上鏈競價,轉成價格函數自己下降,任何人在自己願意接受的價格上直接買走。
這降低了那一個特定的假設:必須在十分鐘之內,至少有兩名參與者的交易都及時上鏈。
配合可以在同一筆交易裡拿到抵押品,賣出或融資,再償付的結算方式,參與者還可以不必先持有大量閒置的 DAI。
而這一整套並沒有消滅底層的網絡與預言機風險。
如果以太坊完全沒有足夠的區塊空間,買單一樣上不了鏈。
如果基準價格本身嚴重錯誤,那個緩衝只是圍繞一個錯誤的基準報價。
如果市場沒有足夠深度,荷蘭式的價格最終只能持續下降,直到有人願意接。
所以後來加進去的,是讓故障更可控和可暫停,而不是證明自動清算從此不再依賴市場與網絡。
這個區別對於理解機制演進很要緊。
而把這一整節的改動排開看,它們其實分成兩類。
一類是放寬約束:把十分鐘拉長到六小時,把五十枚放大到五百枚,給參與者加上啓動獎勵。這一類做的是讓那個假設更容易成立。
另一類是承認約束:限制同時在拍的債務總量,設置吞吐上限,加上可以逐級停機的斷路器。這一類做的是另一件事預先承認參與者和市場能吸收的量是有限的,並且把這個有限寫成一個參數。
後一類比前一類要緊。前一類仍然在指望那個假設,而後一類第一次把它當成一個需要被聲明的東西。
八 寫不進去的那一句
那一天暴露的並不是某一個協議獨有的清算會虧錢。
是自動清算系統對幾個外部條件有共同的依賴。
第一是市場深度:它假定在需要出售大量抵押品的時候,外部市場仍然有人能以接近報價的水平把它吸收。
第二是結算資產的流動性:它假定參與者可以迅速獲得足夠的 DAI。
第三是網絡容量:價格更新,補充抵押品,償債,觸發清算,競拍,這些交易必須在有經濟意義的時間窗口裡進入區塊。
第四是價格的新鮮度:觸發清算的價格不能在幾個市場狀態之間長時間停住,然後突然跳躍。
第五是參與者的多樣性與理性:他們不能都使用類似的 gas 估計,同一個軟件缺陷或者同一個資金來源。
第六是市場風險與執行風險不高度相關。
那一天恰恰讓這六個假設同時朝壞的方向移動。
而它們之間還互相加強。價格跌得越快,清算越多;清算越多,網絡越堵;網絡越堵,價格更新和參與者越慢;越慢,DAI 越稀缺,拍賣折價越深;折價越深,協議和所有者的損失越大。
這條鏈上每一步都是別的步驟的後果,而沒有一步是設計者意圖的一部分。
後來的事件說明,自動清算失靈也不只有一種模式。
2020 年11 月另一個借貸協議出現的異常清算,與它所參照的價格源大幅上衝有關,報道統計約 8,800 萬美元。那更接近抵押或者債務資產的價格源異常導致健康賬戶突然越線,而不是拍賣沒有競爭。
兩個事件都涉及價格來源,而失效的位置不同。
2021 年5 月另一個協議經歷的那一輪大型清算,事後研究顯示當時的 gas 環境甚至比 2020 年那一天更激烈:出價最高的一半超過約 100 Gwei,最高的百分之一經常達到 1,000 到 4,000。
而它沒有產生同一類結果。
兩次的差別不在行情,也不在網絡,而在機制本身:一個要求在短窗口裡反復提交互相覆蓋的出價,另一個不要求。
這個比較說明,gas 比當年更高本身,並不足以推出必然會產生近零價的拍賣。
還取決於清算機制是否要求長時間,多輪的競爭交易,以及參與者的資金與執行設計。
本次檢索沒有得到一個足夠乾淨的,逐協議統一口徑的同日清算與壞賬面板,所以不把後來材料裡的零散數字拼成一個看似可比的排行榜。
尤其要區分清算的名義規模,清算者的利潤,協議的壞賬,以及借款人的剩餘損失。這四樣在數據集裡經常不是一回事。
而把它們混起來,恰恰是開頭那四個數字之所以互相打架的原因。
現在回到第二節那個第二階段。
那個把多餘抵押品還給被清算者的階段,是寫在代碼裡的,誰都可以讀,而且它此前一直在正常工作。
那兩天,它有七成沒有走到。
而沒有走到的原因,不在它自己身上。要走到第二個階段,前提是先有人把出價抬到目標金額;而那兩天,大多數拍賣連這一步都沒有發生。
第一個階段就停住了,於是第二個階段根本沒有機會開始。
合約那一段完全正常。識別,觸發,計算,開拍,結算,每一步都按代碼執行,沒有一處出錯,沒有一處被繞過。
失效的是代碼之外的那個假設。
會有人來。
餘項在這裡的位置因此很清楚。
它不是一筆沒有被記下來的錢。那 832 萬美元的每一枚 ETH 都在鏈上,可以逐筆追到今天。
它是一條無法被寫進合約的前提。
這是這個系列到現在為止,餘項最純粹的一種形態。
前面幾篇裡,餘項是被標準留在管轄之外的,是沒有進代碼的,是沒有人被派去量的,是算得出來的時候還沒發生的。而這一次,它是一句在語法上就寫不出來的話。
你可以寫拍賣持續十分鐘。
你寫不了十分鐘之內會有第二個人來出價。
而整套設計依賴的,正是後面這一句。
這一句之所以寫不出來,不是因為語言不夠精確,而是因為它描述的不是這個系統內部的狀態。它描述的是這個系統之外的一批人在那一刻會不會動手。
合約能規定的是自己的行為。它規定不了別人的。
那兩天裡,合約執行了四千多次。每一次都算對了,每一次都按規矩走完,每一次都在十分鐘之後正確地把抵押品交給了出價最高的那一個。
它不知道那個出價最高的,是唯一一個來了的。
鏈還在結算,而結算什麼還沒有共識。
本文依據公開協議文檔、鏈上記錄、法院文書、監管文件與同行評議研究寫成;文中的數字均保留其統計口徑。系列資料截至 2026 年 8 月。