用一句話來總結,這些攻擊非常“華麗”。每次攻擊中,攻擊者不用花費一分錢立即借到數十萬美元的ETH,然後透過一系列脆弱的鏈上協議,賺取數十萬被盜資金,最後歸還借來的數額巨大的ETH貸款。所有這些都是瞬間發生的。也就是說,在單個以太坊交易中完成。
我們不知道這些攻擊者是誰或他們來自哪裡。他們進來時兩手空空,離開時拿走數十萬美元的價值,且都沒有留下痕跡。
在這些攻擊之後,我一直在思考閃貸及其對DeFi安全的影響。我認為這值得公開思考。簡言之,我認為閃貸對DeFi是巨大的安全威脅。但是,閃貸並不會消失,我們需要仔細思考它們對未來DeFi安全的影響。
什麼是閃貸
閃貸的概念最初由Marble 協議的建立者Max Wolff於2018年提出。Marble在市場上將自己宣稱為“智慧合約銀行”,其產品非常簡單,但極具DeFi創新:透過智慧合約進行零風險貸款。(藍狐筆記:關於什麼是閃貸,可以參考之前的文章《加密閃貸:網際網路貨幣的神奇新發明》《閃貸策略:攻擊者能取走Maker的7億美元抵押品嗎?》《bZx事件的啟示》)
怎麼可能有零風險的貸款?
傳統的貸方承擔兩種形式的風險。首先是違約風險:如果借款人捲款跑了,很糟糕。貸方的第二個風險是流動性不足的風險:如果貸方在錯誤時間貸出太多資產,或者沒有及時收回還款,貸方可能會意外地缺乏流動性,且無法履行其義務。
閃貸減輕了這兩種風險。閃貸基本上是這樣運作的:我在單個交易中借給你想要數額的錢。但是,在這筆交易結束之前,你必須至少償還我借給你的錢。如果你無法執行此操作,我會自動回滾你的交易。是的,智慧合約可以做到這一點。
簡言之,你的閃貸具有原子性:如果你無法償還貸款,整個事情就會還原,就像是借貸從未發生過一樣。這樣的事情只能發生在區塊鏈。例如,你無法在BitMEX上閃貸。這是因為智慧合約平臺一次只能處理單個交易,因此,在單個交易發生的所有事情都是作為批處理按次序執行。你可以將其看作為交易執行期間的“凍結時間”。另一方面,中心化交易所可能會出現競爭狀況,以致於你的訂單無法履行。在區塊鏈上,可以確保的是,你的所有程式碼都是按次序執行。
因此,讓我們思考一下這裡的經濟學。傳統的放貸人在兩個方面得到補償:他們承擔的風險(違約風險和流動性風險),以及他們借出資本的機會成本(例如,如果我能在其他地方獲得2%的利息,那麼,借款人必須向我支付高於2%的無風險費用)。
而閃貸不同。從字面意義上說,閃貸沒有風險,且沒有機會成本。這是因為借款人在其閃貸期間“凍結了時間”,因此,在其他人眼中,系統的資本從未有風險且無負擔,它也無法在其它地方賺取利息(即,它沒有機會成本)。
在某種意義上,這意味著成為閃貸的放貸人沒有成本。這是非常反直覺的。那麼,均衡時的閃貸成本應該是多少?(藍狐筆記:這裡說的均衡時,是指經過充分競爭且發展成熟穩定時)
基本上,閃貸應該是免費的。或者更恰當的做法是,支付小額費用,以分攤包括使得資產可實現閃貸的額外三行程式碼的成本。
閃貸無法收取傳統意義上的利息,因為這種貸款有效期為零(任何APR*0=0)。當然,如果閃貸放貸人收取更高的費用,他們很容易就被其他收取較低利率的閃貸池所超越。
閃貸使得資本變成真正的商品。這種競爭不可避免地會導致零費用或微不足道的象徵性費用。dYdX當前對閃貸收取零費用。另一方面,AAVE對閃貸收取本金0.09%的費用。我懷疑這是不可持續的,確實,他們社羣中的一些人呼籲將費用消減至零。(請注意,這兩次攻擊都沒有使用AAVE作為他們的閃貸池)
閃貸有何用處?
閃貸最初的宣傳是它們基本上用於套利。Marble的公告聲稱:
“透過閃貸,交易者可以從Marble銀行借錢,隨後在一個DEX上買入代幣,並以更高的價格在另外一個DEX上賣出代幣,然後將錢還給銀行,並且在單個原子交易中獲得套利收益。”
的確如此——就交易量來說,迄今為止,大多數閃貸都用於此類套利。
不過交易量較小。AAVE的閃貸業務開展以來,其借貸額僅為1萬美元。與DeFi的套利和清算市場相比,這是微不足道的。
這是因為大多數套利都由執行復雜機器人的競爭套利人執行。他們從事鏈上優先gas拍賣,並使用gas代幣來最佳化交易費用。這是非常有競爭力的市場,這些人非常樂意在其資產負債表上保留一些代幣,以最佳化其收益。
另一方面,在AAVE上借錢花費80kgas成本,且收取本金0.09%的費用,這對競爭微薄差額的套利者來說,付出的價格很高。實際上,在大多數AAVE的套利中,借款人最終向借貸池支付的費用高於他們套利賺取的收益。
從長遠看,除非情況特殊,否則套利者不太可能使用閃貸進行套利。但閃貸在DeFi中存在其他更引人注目的用例。其中一個例子是貸款再融資。例如,假設我有一個Maker小金庫(藍狐筆記:也就是抵押債務頭寸),其中鎖定了100美元的ETH,我從中借出了40 DAI的貸款,也就是說,除去債務,我還有60美元的淨頭寸。現在,假設我想在Compound再融資以獲得更好的利息。通常,我需要回購40 Dai來關閉我的CDP,這需要一些前期資金。而現在的可替代方法是,我可以透過閃貸借出40 Dai,關閉100美元的CDP,然後將解鎖的價值60美元的ETH存入Compound,透過Uniswap將剩餘的價值40美元的ETH換成Dai,然後用它償還閃貸。Boom!原子性的0資本再融資。
這真是太神奇了。這是貨幣樂高運作的很好例子。1x.ag實際上構建了一個保證金交易匯聚器,該匯聚器使用閃貸自動執行這一切。但是閃貸可以很酷,bZx攻擊者向我們展示了它們不僅是好玩和遊戲。
閃貸攻擊對安全性有重大影響
我越來越相信,閃貸真正解鎖的是閃貸攻擊,一種由閃貸提供資金的資本密集型攻擊。在最近的bZx攻擊事件中,我們第一次看到這一現象,而我懷疑這只是冰山一角。
閃貸對攻擊者尤其有吸引力的主要原因有兩個:
· 很多攻擊需要大量前期資金(例如預言機操縱攻擊)。如果你在賺取價值1000萬美元ETH的正向投資回報,則可能不是套利——你可能會說這是在扯淡。
· 閃貸可以最小化攻擊者的汙點。如果我有個用1000萬美元ETH操縱預言機的想法,即便是我擁有這麼多ETH,我也可能不會用自己的資本進行冒險。我的ETH將會有汙點,交易所可能會拒絕我的存入,且它很難洗白。這有風險。不過,如果我借來1000萬美元的ETH,那麼,誰會在乎呢?全都是好處。dYdX抵押池不太可能會被認為有汙點,因為這是我貸款的來源——dYdX的汙點只會消失。
你可能不太喜歡交易所黑名單是如今區塊鏈安全模型的一部分。這是非常黏糊且中心化的。但這是一個重要的現實,它為這些攻擊提供演算資訊。
在比特幣的白皮書中,中本聰宣稱比特幣有免遭攻擊的安全,因為:“攻擊者應該會發現,遵守規則...比破壞系統和其財富的有效性更有利可圖。”
有了閃貸,攻擊者不再需要有利益參與其中。(藍狐筆記:也就是說,破壞系統不會影響攻擊者的自身利益,因為攻擊者沒有利益相關)。閃貸實質上改變了攻擊者的風險。請記住,閃貸可以累積!受制於gas limit,實際上,你可以在單個交易中(最高可達5000萬美元 )匯聚各個閃貸池,並將所有資金集中湧入一個脆弱的合約中。這是一個5000萬美元的攻城錘,現在任何人都可以猛擊任何鏈上的彩陶罐。這實在恐怖。
當然,僅憑你很有錢還無法攻擊協議。如果DeFi堆疊如它宣稱的那樣安全,所有這些都不是問題——什麼型別的協議對巨鯨來說是不安全的?你可能會說,沒有考慮這一點就是過失。
但是,我們承認以太坊自身也可能會遭受51%的攻擊,當前的攻擊成本是每小時不到20萬美元。這不算非常多的資金。如果以太坊自身的安全模型都基本上是構建在資本限制上,那麼,為什麼我們要如此快地去嘲笑可以被1000萬美元成功攻擊的DeFi應用?(明確地說,我不認為這些數字——這一數字方便地忽略了滑點和供應不足——加上共識層安全和應用層安全是兩碼事。但你明白這個意思。)
那麼,如何減輕閃貸攻擊?
假設我是DeFi協議,我想避免被閃貸攻擊。自然的可能問題是,我能否檢測到與我互動的使用者是否在使用閃貸?
簡單答案是:不。
EVM並不允許你從任何其他合約中讀取儲存。因此,如果你想知道其他合約正在發生什麼,則可以透過該合約告訴你。因此,如果你想知道是否閃貸合約在被使用,你必須直接詢問合約。如今,很多借貸協議並沒有對這種查詢做出響應(而且一般來說,也沒有辦法強迫閃貸借貸者的行為)。另外,即便你試圖檢查,透過使用代理合約或透過串聯閃貸池也容易誤導此類查詢。簡單來說,通常很難辨別一個儲存使用者是否在使用閃貸。
簡言之,如果有人拿著1000萬美元敲你合約的前門,你無法判斷這是否是他們自己的錢。那麼,我們有什麼真正的選擇可以防止閃貸攻擊?我們可以考慮如下幾種方法。
說服閃貸借貸池停止提供服務。
哈,開玩笑。這是加密世界,你們懂的!
認真地說,試圖讓借貸池停止提供閃貸就像是試圖停止噪音汙染——這是典型的公地悲劇。提供閃貸符合每個協議的自身利益,且出於合理原因,它們的使用者也希望使用這一功能。因此,我們儘可忽視這一條。閃貸並不會消失。
強制關鍵交易跨兩個區塊進行
請注意,閃貸允許你在單個交易時間段內借入資金。如果你需要一個資本密集型交易跨越兩個區塊,那麼,使用者必須取出至少兩個區塊的貸款,由此擊敗任何閃貸攻擊。(注意:為此,使用者必須將其資產鎖定在兩個區塊之間,以防止他們償還貸款。如果你沒有正確地考慮設計,則使用者可能只是在這兩個區塊中實施閃貸攻擊)
顯然,這會帶來巨大的UX權衡:它意味著交易不再是同步的。它對普通使用者來說極其糟糕,這是很難下決心採取的措施。(藍狐筆記:為了防止閃貸攻擊,導致使用者體驗糟糕,顯然是下策)
很多開發者對非同步智慧合約操作感到煩惱,例如,與layer 2的互動,以及以太坊2.0的跨分片通訊。具有諷刺意味的是,非同步其實讓這些系統在應對閃貸時更安全,因為你無法在單個原子交易中橫跨分片或layer 2。這意味著不會有跨ETH2.0分片或在layer 2針對DEX的閃貸攻擊。
要求提供鏈上證明,以證明使用者的先前餘額並沒有因為閃貸而改變
如果能有方法檢測出使用者真實的餘額多少(也就是他們獲得借款之前的餘額),我們就可以擊敗閃貸攻擊。
無法在EVM中本地執行此操作,不過,你可以做點帶有駭客意味的事情。這就是你要做的:
在使用者與你的協議互動之前,你要求提供可以證明之前區塊末尾的Merkle證明,他們有足夠的餘額來解釋他們當前使用的資金。你需要對每個區塊上的每位使用者跟蹤這一點。(Ari Juels向我概述了此方法)
這種方法可能有些效果。當然,它也存在棘手問題:在鏈上驗證這些鏈上證明非常昂貴,並且沒有使用者會想要生成這些證明以及為此支付gas費用。另外,出於完全正當理由,使用者有可能在早些時候在同一區塊中已更改了餘額。因此,從理論上它有一些優點,但這不是一個切實的解決方案。
以上提到的三個解決方案沒有一個有特別的希望。我相信,沒有針對閃貸攻擊的全面防禦措施。但是,有兩個特定的應用確實可以緩解閃貸攻擊:基於市場價格的預言機和治理代幣。
對於像Uniswap或OasisDEX這樣的基於市場的價格預言機,閃貸攻擊使得你在任何情況下都不能將當前的中間市場價格用作為預言機。對於攻擊者來說,在單個交易中移動中間市場價格並製造閃崩、破壞價格預言機,這是孩子的玩法。
這裡最好的解決方案是透過TWAP或VWAP使用最後X個區塊的加權平均值。Uniswap v2將原生提供這一點。還有Polaris,這是通用的方法,可以為DeFi協議提供移動平均值。具有諷刺意味的是,Polaris也是由Marble的創始人Max Wolff構建的。(Polaris現在已經被拋棄,但Max看到了這一角落的東西,值得贊)
鏈上治理本身就是自己罐頭裡的蠕蟲。鏈上治理通常由治理代幣持有者之間的代幣加權投票決定。但是,如果這些治理代幣出現在閃貸借貸池中,那麼,任何攻擊者可以撿起大量的治理代幣並搞出任何他們想要的結果。
當然,大多數治理協議都要求在投票期間鎖定這些代幣,以防止閃貸攻擊。但是,有些形式的投票並不要求這些,例如carbon投票,或Maker的執行合約。如今,隨著閃貸攻擊的出現,這些形式的投票應該認為完全遭到破壞。
理想情況下,如果治理代幣不可用來閃貸,這就很好。但是,這不取決於代幣的發行方,而是取決於市場。因此,所有治理行為應該要求鎖定,以防止閃貸攻擊。Compound的新COMP代幣更進一步,它對所有協議投票都要求基於時間的加權,甚至削弱針對其治理代幣的常規貸款攻擊。
更廣泛地說,所有治理代幣必須有時間鎖。時間鎖要求所有治理決定必須等待一段時間才能生效(Compound的時間鎖是兩天)。這使得系統可以從任何意料之外的治理攻擊中恢復。儘管MKR還無法被大量閃貸,MakerDAO最近因為易受此類攻擊而被號召實施措施。它最近實施了24小時的時間鎖,關閉了此類攻擊向量。
從長遠看,這一切意味著什麼?
我相信bZx攻擊改變了這一切。
這不會是最後一次閃貸攻擊。第二次bZx攻擊是對第一次的模仿,而且我懷疑在未來幾個月會掀起一波攻擊浪潮。現在,來自世界最遙遠角落的成千上萬名聰明少年正在嘲笑所有這些DeFi樂高,他們在顯微鏡下觀察,試圖發現可以實施閃貸攻擊的方法。如果他們設法成功利用漏洞,那麼,他們就可以賺取幾十萬美元,這在世界上的大部分地區都是可以明顯改變生活的。
有人稱閃貸並不會改變任何東西,因為如果攻擊者有足夠資金,這些攻擊總是可能的。這既正確又相當不正確。大多數鯨魚都不知道如何黑智慧合約,而大多數聰明的攻擊者也沒有數百萬美元的資產。(藍狐筆記:此處是說,兩者的交集不大。同時具備兩者的是最可怕的攻擊者。但閃貸到來讓攻擊者獲得了免費的利器)現在,任何人僅花費幾分錢就可以租用一個價值5000萬美元的毀滅球。從現在開始這改變了每個建築被構建的方式。
在bZx攻擊之後,被閃貸攻擊就像是在DAO攻擊後被重入攻擊一樣令人尷尬:你不會得到人們的同情。你應該瞭解這一點。
最後,這些事件讓我想到加密貨幣的一個古老的概念:礦工可提取的價值。礦工可提取的價值是礦工可以從區塊鏈系統中提取的價值。這包括區塊獎勵和交易費用。但它也包括更多惡意形式的價值提取。例如對交易重新排序或將無賴交易插入區塊。
從根本上講,你應該將所有這些閃貸攻擊都視為是在記憶體池中可以賺取大量金錢的單個交易。例如,第二次bZx攻擊產生了價值64.5萬美元ETH的收益。如果你一位礦工,你打算開始挖新區塊,請想象一下,檢視先前的區塊交易,並對自己說:“等等,那是什麼?當最後一個區塊包含64.5萬美元的利潤時,我為什麼還要打算為區區500美元左右的收益挖新區塊呢?”你不會選擇去擴充套件區塊鏈,而是回去並試圖重寫歷史,以使自己成為閃貸攻擊者。想想看:僅此一筆交易就比4小時誠實地開採以太坊來得多!
這與包含1000倍於常規區塊獎勵的特殊超級區塊是同構的,正如你預期的那樣,這樣的超級區塊的理性結果應該是礦工競相競爭以孤立鏈的打賞併為自己偷取該區塊。
在均衡狀態下,所有閃貸攻擊應該最終會被礦工提取。(請注意,他們也應該會最終竊取所有鏈上套利和清算)具有諷刺意味的是,這會阻止閃貸攻擊的發生,既然它會導致攻擊者無法利用這些漏洞來獲利。或許最後礦工會透過私人渠道徵集攻擊程式碼,並向潛在的攻擊者支付發現者費用。從技術上講,可以使用零知識證明無須信任地完成此類操作。
但這一切現在都還是科幻小說。顯然礦工今天還沒有這麼做。
他們為什麼不呢?
有大量的原因。它很難,需要很多工作。EVM很難模擬,它有風險,可能會有漏洞導致損失資金或孤塊,流氓礦池可能會面臨PR危機,被人們冠以“以太坊敵人”的烙印。就目前來看,相對於這麼做的收益,礦工可能會在業務、R&D以及孤塊上損失更多。
今天是如此。未來不一定永遠如此。
這為以太坊提供了另外一個動力,以加速並過渡到ETH2.0。儘管以太坊上的DeFi總是很有趣,但它是絕對和不可撤銷的。DeFi在PoW鏈上不穩定,因為所有高價值交易都受制於礦工的重新分配(也稱時間劫匪攻擊)。
為了讓這些系統大規模執行,你需要最終性——讓礦工無法重寫已確認的區塊。這將保護先前區塊的交易免遭重新分配。此外,如果DeFi協議存在於單獨的ETH2.0分片中,它們不容易遭到閃貸攻擊。
據我估計,閃貸攻擊給我們一個小的但有用的提醒,那就是現在還很早期。我們還遠沒擁有可持續的架構,一個可為未來金融系統構建的架構。
目前,閃貸會是新常態。也許從長期看,所有以太坊上的資產都可用於閃貸:交易所持有的所有抵押品,Uniswap中的所有抵押品,也許所有ERC-20代幣本身。
誰知道呢?這只是幾行程式碼的事。