撰文: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 還提到了需要進一步明確多簽監護地址的具體權限,以允許其在出現類似緊急情況時快速相應。