原文標題:《Compound 錯誤分發 8000 萬美元代幣,修復漏洞還要再等七天》
撰文:Azuma
9 月 30 日,頭部去中心化借貸協議 Compound 于官推表示,在今天通過并執行「治理提案 062」后,升級合約內發錯了一個 BUG,致使 COMP 代幣出現了異常分發情況。
具體來說,漏洞出現在升級后的「Compound : Comptroller」(0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B)合約內,原本應通過該合約緩慢分發給所有流動性提供者(借方、貸方)的 COMP 代幣被錯誤釋放,部分用戶收到了遠高于正常數量的 COMP,如下圖所示,僅 0x2e4ae 開頭的地址一個地址就從「Compound : Comptroller」合約內領取到了近 30000 枚 COMP,代幣,價值約 900 萬美元,
漏洞影響評估
首先需要強調的是,從漏洞影響來看,本次 Compound 事件只會直接影響到所有流動性提供者的預期收益,用戶的存款、借款及倉位情況理論上不會受到任何干擾,所以不必太過恐慌,
此外,根據 Compound 創始人 Robert Leshner 的說法,「Compound : Comptroller」合約內的 COMP 總量有限,用于挖礦分發的更多 COMP 代幣其實是存在另一個合約「Compound: Reservoir」(0x2775b1c75658Be0F640272CCb8c72ac986009e38)內,該合約仍在以每個區塊 0.5 枚 COMP 的速度正常分發。最極端的情況下,也就是「Compound : Comptroller」合約內的代幣被提空時,將有約 28 萬枚 COMP 受到影響,總價值約 8000 萬美元。
從鏈上狀況來看,當前「Compound : Comptroller」合約內已被提走了約 17 萬 COMP,還剩下約 11 萬 COMP,而「Compound: Reservoir」合約當前的運轉并未出現異常情況,與 Leshner 的說法相吻合,
事件發生原因
本次漏洞的起因在于前文提到的「治理提案 062」,該提案的目的旨在調節對不同流動性提供角色的 COMP 分配比例,
依照協議運轉規則,Compound 每天會向所有流動性提供者分發 2880 枚 COMP 代幣,這些代幣的一半將分配給借方,一半將分配給貸方,然而,在日常運行之中,Compound 發現這種一半一半的分配方式并未充分考慮到市場需求狀況,致使了市場出現了一些畸變(比如負利率),所以在 9 月 22 日,社區成員 Tyler Loewen 于 Compound 治理模塊內提交了改進提案,擬將這種一半一半的分配方式更改為依照利率狀況動態調節,
這一提案的出發點顯然是正向的,社區對于提案的態度也是以支持為主,大概一周左右,也就是今天上午,該提案順利通過并得到了執行,
遺憾的是,代碼層面的 BUG 往往就是這么難以預料。盡管社區內其他一些成員也審查過 Tyler Loewen 的升級代碼,且所有升級合約已在以太坊 Ropsten 測試網上順利運轉了一個月的時間,但 BUG 還是出現了。
解決措施及流程
關于補救工作,Leshner 本人在推特已表示:「沒有任何管理控件或社區工具來打斷 COMP 當前的異常分發,協議層面的任何更改都需要經過為期近一周的治理程式才可生效。Compound Labs 和社區成員當前正在評估修復發行版的可能方法。」
如其所說,Compound 有著一套既有的治理流程:
- 任何地址都可以鎖定 100 枚 COMP 來發起自治提議,當提議積攢夠至少 65000 枚 COMP 的委托后將升級為治理提案,繼而進入社區公投環節;
- 社區公投為期 3 天,當提案獲得了至少 40 萬枚 COMP (即 ≥4% 的供應量)支持,且多數人投票贊成之時,即可通過公投環節。
- 通過公投的提案將排隊進入時間鎖,并在 2 天的時間鎖后正式執行,
梳理治理的整個流程,可以看到,僅公投和時間鎖環節就要求了至少 5 天的時間,算上最初的提議以及流程過渡工作所需的時間,Leshner 所說的一周并不夸張,
關于「沒有任何管理控件來打斷 COMP 當前的異常分發」這一點,事實上,Compound 協議內存在一個用于處理極端情況的監護地址(Set Pause Guardian,0xbbf3f1421d886e9b2c5d716b5192ac998af2012c),該地址此前一直由 Compound Labs 持有,但在 8 月份的「治理提案 057」中已被轉變為多簽控制,不過,該監護地址的權限暫時僅規定了可在極端情況下暫停協議的存款、借款和清算,并未明確提及是否可用于當前發生的情況。
流程至此已厘清,但該采取什么樣的補救措施,目前沒有人給出具體方案。社區成員已在 Compound 治理論壇中建立了一個 主題討論帖,擬通過「治理提案 063」來執行修復,從已釋放出的資訊來看,大概率會先行暫停 COMP 的分發(可能通過監護地址執行?),直到可以測試完整的修復補丁。
經驗教訓總結
作為踐行去中心化理治模式的先驅之一,Compound 本次事件的起因及處理在一定程度暴露了 DAO 治理的 B 面,
我們的慣性認知中,去中心化往往意味著用效率來換取公平,在 DeFi 領域,當一款協議實現了完全的去中心化治理,沒有任何單一主體能夠隨意對合約進行修改時,調動社區整體來共同參與治理決策往往極大的組織精力及時間成本,這也是為什么 Compound 需要用七天的時間來修復一個明擺著會對協議造成極大負面影響的漏洞,實際上,在一眾頭部 DeFi 協議之中,Compound 七天左右的治理周期并不算慢了,Uniswap 走完全套治理流程(民意調查——共識檢查——治理投票——時間鎖)的時間周期至少需要半個月之久。
話說回來,既然明知事后的補救需要如此高的成本,那么在事件發生之前,是否需要對重大合約升級采取更加嚴格的評估標準呢?這是在本次事件發生后,Compound 社區所作出第一個的經驗總結——社區成員 Phaze Jeff 于治理論壇內發起了一個討論帖,主題為「對重大代碼更改執行更嚴格的審核」。
結合具體事件來看,在社區成員 Loewen 提交「治理提案 062」后,參與測試工作的社區成員數量過少(似乎是大部分 DeFi 協議的通病),最終導致 BUG 被遺漏和「放行」,因此,Jeff 認為在協議進行重大更新時進行更細致的監測,并鼓勵更多的社區成員參與到主網部署前的社區工作去。此外,Jeff 還提到了需要進一步明確多簽監護地址的具體權限,以允許其在出現類似緊急情況時快速相應,