你可能聽說過區塊鏈初創企業Compound。他們基于以太坊創造了compound.finance,個人可以在該市場中出借所持有的 ETH,DAI,USDC 及一些其他ERC20數字資產并以此賺取利息。
Today, the interest rate offered to DAI lenders is 10%, which is high enough to turn EthHeads’ heads (see cover photo)。
如今,DAI出借方的利率是10%,足以讓 ETH 持有者側目。
作為SpankChain的CEO,管理包括近50萬DAI的公司儲備是我的職責。如果不把我們的DAI放到Compound平臺上,按照10%的年利率,那么我們將每個月損失近 4000 美元。這是相當大的一筆機會成本。但是投資需要牢記的是:天下沒有免費的午餐。所有的投資都有風險,在 Compound 平臺上放貸也不例外。
上個月,我花了一些時間對通過 Compound 平臺放貸存在的幾類風險進行了評估:
1. 智能合約安全風險
2. 中心化單點故障
3. 銀行擠兌風險
我將調查研究分成了以下幾類,但是在此之前首先需了解的最重要的事情是:
1. 智能合約安全近乎完全沒問題。
2. Compound 是一個托管系統,如果借貸池管理員的私鑰泄漏,則所有借貸池中的資產將都可能被盜走。
3. 在 Compound 上放貸不保證能隨時提取資產。如果您嘗試提取您的資產,但是當時所有資產都鎖定在未償還的貸款中,那么您的提款交易將失敗。
合約安全
已有多家知名的智能合約安全公司對 Compound 進行了審計。
OpenZeppelin 審計報告
Trail of Bits 審計報告
Certora 審計報告
此外,Compound 還為嚴重漏洞專門提供了上限為 25 萬美元的懸賞(賞金為被盜資金的 1% 或者是凍結資金的10%),據我所知,目前還沒有獨立安全研究人員獲得這筆賞金。
該合約保存的資產至少有六個月超過 2000萬美元,至少有兩個月超過 5000萬美元,當前該合約里保存的資產超過 1億美元。對我個人而言,合約安全最重要的指標是 合約持有總資產×合約保存資產時間,到目前為止,Compound 的安全性已經得到了大量公共資產的證明。
基于以上因素,我目前認為 Compound 智能合約是安全的。
中心化單點故障
由于我自己并不是一名智能合約安全專家,因此我向 samczsun 尋求幫助——samczsun 以發現了 0x 合約中一個關鍵 bug 而出名(當時 0x 合約已經接受過頂級公司的多次審核) ,他也因此獲得了 10萬美元的報酬。關于 Compound 的中心化單點故障(我關注的重點),他提供的報告如下:
Compound v2 有四種不同的管理職能,由三個地址分別承擔:
· 每種 cToken 都有一個管理員。目前,所有 cToken 的管理員都被設置為 0x8B8592E9570E96166336603a1b4bd1E8Db20fa20
· 每種 cToken 都有一個監察員(comptroller),目前都被設置為 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B。Unitroller 也有一個管理員,目前被設置為 0x8B8592E9570E96166336603a1b4bd1E8Db20fa20
· 當前的價格預言機都有一個錨點管理員和一個 poster,分別為設置為0xF06e41aDD8A7E7A8aD81a07C0ACA291E4573ca50 和 0x3c6809319201b978D821190Ba03fA19A3523BD96。
只要能獲得一種 cToken 的管理員資格,攻擊者就可以替換監察員實現,然后執行以下一項或者多項操作:
· 通過 transferAllowed 函數返回 false 防止轉移現有 cTokens
· 通過 transferAllowed 函數返回 true 轉移作為抵押品的 cTokens
· 通過 mintAllowed 函數返回 false 防止生成新的 cTokens
· 通過 redeemAllowed 函數返回 false 防止贖回已有 cTokens
· 通過 repayBorrowAllowed 函數返回 false 防止償還現有貸款
· 通過 liquidateBorrowAllowed 函數返回 false 防止清算貸款
· 通過 seizeAllowed 函數返回 true 竊取用戶 cTokens
· 通過 borrowAllowed 函數返回 false 防止借入底層資產
· 通過 borrowAllowed 函數返回 true 來吸干所有底層資產
通過 cToken 的管理員資格,攻擊者還可以替換利率模型,從而實現:
· 將借貸成本(即:塊利率)提升至 0.0005% /區塊
若能獲得 Unitroller 代理的管理員資格,攻擊者可以:
· 對于所有使用 Unitroller 的 cTokens (當前是 100% 占比),通過替換 Unitroller 實現與替換 cToken 監察員一樣的攻擊
· 通過更改清算激勵機制,在清算時獲得更多的代幣
· 通過更改價格預言機,以低于實際的價格進行 cTokens 借貸(例如:ETH、WBTC 等)
· 通過更改某種 cToken 的質押信息,結合新增 cToken 以及更改價格預言機的能力,攻擊者可以通過他們創造的代幣進行抵押借款,實現竊取系統全部資產。
若能獲得價格預言機的錨點管理員資格,攻擊者可以:
· 使得某一資產的價格偏離其真實價格的 10%
若能獲得價格預言機的 poster 資格,攻擊者可以:
· 每個小時都讓資產價格偏離其存儲價值的 10%
若能同時取得對價格預言機的管理員資格和 poster 資格,攻擊者就可以:
· 將資產價格設為任意值
總結一下 samczsun 的報告:Compound 合約被設計為可以通過中央管理員進行適當的升級。最重要的合約是代理合約,其指向包含了邏輯實現的邏輯合約地址,管理員擁有隨意修改地址指針的權利。由于所有的 cTokens 使用相同的管理員 ,如果管理員私鑰泄露了,那么所有質押在 Compound 中的資產都可以被輕松竊取。
sam 的報告中也提到了一些更為狡猾的攻擊,如果攻擊者有這樣的機會——比起實施更為復雜的攻擊,這樣可以更快的卷走所有錢。
OpenZeppelin 在他們的 Compound 審計概要中進行了有效總結。
然而,惡意管理員或者被竊取私鑰的管理員手中擁有凍結市場、審查交易甚至從系統中竊取全部資產的能力。類似地,控制資產價格預言機即便不能竊取系統的全部資產,也可以竊取大部分。當前,所有實時市場的管理員都是同一個外部賬戶。
但是有趣的是, Trail of Bits 團隊沒有在任何相關材料中提及這一點。此外,Compound 的 FAQ 還低估了管理員特權,并沒有提供任何關于管理員有可能竊取所有資產的警告:
協議的開發者 Compound Lab,Inc,目前控制著以太坊地址:0x8b8592e9570e96166336603a1b4bd1e8db20fa20 ,即管理員地址。管理員地址擁有新增資產、更新價格預言機、更新利率模型以及更新協議風險模型的權利。
另一件需要注意的事情是, Compound 當前的托管設置本身并不會導致系統的不安全。他們會極力維護管理員密鑰安全,并且很有可能(希望如此)他們正在與 820 萬美元種子輪融資可以買到的最好的托管供應商合作。不過毫無疑問,在決定存入 50 萬 DAI 時,我會將這一點放在心上。
銀行擠兌風險
Dharma 首席運營官之前的的這條關于競爭性貸款平臺的推特,帶我打開了新世界的大門,讓我明白了 Compound 這類平臺的銀行擠兌風險。
上述推特中顯示的利用率高達 98.62%,這意味著在當時,出借方存儲的 98.62% 的 DAI 都已經借出。只有 1.38% 的 DAI 還可取出,所以,在當時,只有相當小一部分出借方可以隨自己心愿收回其存入的 DAI。
如果有足夠多的 DAI 債權方(cDAI 持有者)在同一時刻想要收回他們存入的 DAI,他們的提款操作將耗盡所有可用 DAI,并使得 DAI 利用率提升至 100%,從而阻止進一步的提款操作。試圖提款的出借方將只能看到交易失敗,并且不得不等到更多的借款方歸還貸款后才能進行提款。
由于存在 cDAI 提款卡殼的可能性,人們將會對此有所顧慮,并且他們的擔憂可能會自我實現。就是說,當一部分 cDAI 持有者試圖一次取出其存入的全部 DAI 時,銀行擠兌將有可能發生,因為有很多 cDAI 持有者都擔心這種情況的發生。
陷入 cDAI 銀行擠兌的出借方可以選擇等之后再取出其 DAI,也可以通過出售 cDAI 以獲得 DAI,但是這樣會產生手續費,而且,如果有許多其他出借方也在出售 cDAI ,那么價格可能會更差。 如果出借方選擇等待危機結束并繼續持有 cDAI,在此期間他們仍可以享受到出借資金所得的利息。
Compound 是如何解決這個問題的?
Compound 團隊對這種流動風險的處理都很直接,他們在白皮書中進行了相關介紹:
該協議不保證流動性;相反,它依靠利率模型進行激勵。在資產需求極度旺盛的的時期,協議的流動性(可用于提款或出借的代幣)將減少;在這種情況下,利率會上升,從而刺激供應并抑制借貸。
Compound 基于 cToken 特定的 “利率合約” 為每種 cToken 確定借款人的利率。該合約目前實現了 cDAI 的利率模型。公式為:
借款人年利率 = 基本利率 +(乘數 * 利用率)
對于 cDAI 而言,基本利率 = 5%, 乘數 = 15%(這些值都被硬編碼到了合約中)。利用率 為 100% 時,借款人支付的利息為20%。這意味著當 DAI 利用率最大時,借款人的資金成本也只是 20%——因此,如果他們相信 ETH(貸款抵押品)這一年的漲幅會超過 20% 的話,他們就沒有動力償還貸款。 這可能會導致很多 cDAI 持有者在很長一段時間內還將繼續持有 cDA。
Compound 唯一能處理這一問題的工具就是使用中心化管理員升級利率模型,這就是 6 周前,利用率升到 99% 時他們所采用的方案(與上面引用的推文屬同一時期)。
綜上所述,利用率達到最大時存在流動性危機以及迫在眉睫的銀行擠兌風險,而出借方唯一能做的事就是希望 Compound 使用管理員特權更新并且增加利率,從而激勵借款方償還貸款進一步提高想要退出的出借方所需的流動性。
結論
像 Compound 這樣的協議在中心化和去中心化中保持著微妙的平衡,它需要權衡快速升級的能力和由此必然引入的中心化單點故障。
我不覺得 Compound 選擇中心化的方式引導其產品是錯的(因為這種方式顯然是有效的,要不然我也不會寫這篇文章),但是我確實希望智能合約中包含 1000 萬~1 億美元的項目能夠按照最高標準進行,尤其是在向用戶傳達風險和提供警告方面。
基本上,我們應該支持、鼓勵項目做與 Robert Leshner(Compound 的首席執行官)相反的事情:
中心化在技術上可能是正確的,但是我們都知道攻陷管理員的辦法有很多。..
現在我依舊沒有想好是否要將我管理的 DAI 存儲到 Compound 中。可能我會先用 10 萬個 DAI 試試水?會出什么問題呢。..In Compound We Trust!
來源: 以太坊愛好者?
評論
查看更多