Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

免責聲明:本文旨在傳遞更多市場信息,不構成任何投資建議。文章僅代表作者觀點,不代表火星財經官方立場。

Vitalik:Uniswap v2 价格预言机能抵御闪电贷攻击

作者:Guillermo Angeris

編譯:灑脫喜

近日,在 bZx 連遭攻擊之後,關於「預言機」、「閃電貸」、「管理密鑰」的討論已變得越來越多,DeFi 生態正在經歷一個短暫的痛苦期。

對此,以太坊聯合創始人 Vitalik Buterin 也不得不站出來維穩局面了,他在今日轉發了 Uniswap 創始人 Hayden Adams 的一條推文,並評論稱:

Vitalik:Uniswap v2 价格预言机能抵御闪电贷攻击

「計劃中的 Uniswap v2 價格預言機設計,能夠抵禦最近的閃電貸攻擊。」

真的如此嗎?

我們來看這條推文中推薦的文章《Uniswap 何時會成為一個好的預言機?》

文章作者是安全分析平臺 Gauntlet 成員,斯坦福博士生 Guillermo Angeris。

以下是譯文內容:

Uniswap 已成為了傳統訂單簿式交易所的一種非常流行的替代方案,並且它還成為了一種測量兩種幣之間相對價格的常用方法(通常被稱為‘價格預言機’)。有點令人驚訝的是,儘管 Uniswap 的基本思想非常簡單,但它的實際效果卻是相當好的:在「現實世界」中,與規模大得多的交易所相比,Uniswap 似乎準確地估計了兩種資產的相對價格。

Uniswap 的穩定性也是令人驚訝的,因為它似乎不受那些試操縱價格以謀取私利的不良行為者的影響。這些結果可能是 Uniswap 用戶的直覺,因為他們已目睹了它在野外的表現。而對於懷疑者來說,我們的分析為「Uniswap 是一個好預言機」的條件創建了一個數學框架。在最近發表的論文(已被 Cryptoeconomic Systems 2020 接受)中,我們對 Uniswap 進行了一番分析,並希望在會議之前與更廣泛的受眾分享一些結果。

恆定乘積市場(Constant-product markets)

Uniswap 是恆定乘積自動做市商(通常簡稱為恆定乘積 AMM)的特殊例子。其思想如下:我們有一個合約(或交易所),它有一些代幣「A」(包含 R 這樣的代幣)的儲備以及一些代幣 「B」(包含 R’ 這樣的代幣) 的儲備。

一個想購買代幣 「B」 Δ’ 幣的代理人必須投入足夠的代幣「A」,以使儲備乘積保持不變。換言之,如果代理人想從儲備中購買代幣 「B」 Δ’幣,那麼代理人必須將「A」代幣的Δ幣投入儲備,以便新儲備乘積與舊儲備乘積相同:

方程(1)可以很容易地用來推導我們將要用到的量。例如,幣「A」的 Uniswap 價格 mᵤ,相對於幣「B」的定義,是用一定數量的幣「B」購買幣「A」的邊際價格。

這相當於是用幣「B」購買無限小數量幣「A」的平均價格,我們可以將其繪製為價格在Δ = 0 時的斜率:

Vitalik:Uniswap v2 价格预言机能抵御闪电贷攻击

在下一節中,我們將把 Uniswap 的邊際價格與真實市場價格聯繫起來(劇透:在不收費的情況下,且在一般假設下,它們是相等的)。

注:截至目前,恆定乘積公式(方程式(1))不包括任何交易費用。為了簡單起見,我們將在文章的剩餘部分假設這個案例是免費的,但我們在這裡所做的大多數陳述與收費案例中的預期是基本一致的。

套利以及它告訴了我們什麼

為了說明 Uniswap 的價格應相對於參考市場的價格,我們需要假設這些市場是如何相互作用的。

在金融數學中,一個非常常見和簡單的方法,就是說不存在套利。換言之,我們會假設,不承擔任何風險,只在這兩個市場之間進行交易,是不可能免費賺到錢的。

因此,我們可以證明,如果 mᵤ≠m (其中 m 是參考市場價格),那麼必然存在一筆足夠小的交易,使得代理人可以獲得正利潤,這就意味著,在這個假設下 mᵤ = m。

為了證明這一點,我們假設 mᵤ > m, 然後,通過定義 mᵤ,存在一個足夠小的幣「A」輸入,例如Δ,這樣:

Vitalik:Uniswap v2 价格预言机能抵御闪电贷攻击

在給定幣「A」的Δ的情況下,Δ’是幣「B」的輸出。

同樣,對於市場來說,存在足夠小的交易,使得 mΔ ≈ Δ’’,但是,由於Δ’’ m),我們可以很容易地通過在公開市場上以Δ'' 交易Δ來輕鬆獲利,然後在 Uniswap 中以Δ交易Δ’,也就是說,我們的利潤是正的(因為 Δ’’– Δ’ > 0)。注意,這個推導雖然不是完全嚴格的,但基本上遵循了數學證明。

由於我們可以在 mᵤ

Uniswap 的優良特性

Uniswap 還有一些很好的特性,這增強了我們的信念,即它在實踐當中很可能是一個好的預言機。

更具體地說: (a) 不可能僅僅通過在市場內交易幣來耗盡 Uniswap 的儲備; (b)向市場增加流動性是正確的做法,因為它降低了特定幣的交易成本,同時增加了操縱預言機的成本。

儲備金的邊界

要證明沒有交易能耗盡 Uniswap 的幣,這是不難的。 由於 k = R’R,那麼,通過 AM-GM 不等式(均值不等式)我們得到:

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

這立即意味著,可能儲備金的總和,是以積 k 的平方根為界的。根據定義,每次交易後 k 總是常數,那麼儲量的總和總是離 0 較遠的。

增加流動性降低交易成本

有幾種方法可以證明這一事實,但最簡單的一點是,給定幣「A」的輸入Δ,我們得到:

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

利用無套利情況下 R =mᵤR’的事實,則幣 B 的輸出等於:

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

對於固定邊際價格 mᵤ,它在 R' 中增加(注意分母隨著 R' 的增加而減少)。因此,可用儲量越高,給定輸入量的輸出量就越大。這對於很多使用 Uniswap 協議的用戶來說是很直觀的,在更多流動性池的情況下,他們看到的滑動是較小的。

價格操縱是昂貴的(當進行大的變動時)

事實上,將 Uniswap 價格操縱到任何固定金額的成本,都與儲備量與區塊數量成線性關係,這在很多實際情況下可能是昂貴的,儘管我們注意到,對價格非常小或短期的擾動,會是相對便宜的。 現在,假設攻擊者希望將 Uniswap mᵤ的價格操縱到一定的量 p > m (其中 m 是市場價格),那麼這個單一操作(例如,對於單個區塊)的成本至少是:

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

(關於推導,見論文附錄 E 部分),如果我們假設 p ≥ (1+ε)m 且ε>0,那麼由於 C(p) 在 p 中(p>m)是增加的,我們得到的成本至少是:

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

據我們所知

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

以及

Vitalik:Uniswap v2 價格預言機能抵禦閃電貸攻擊

其中 K 至少為 1/(32√2)。找到 C (ε)的這一下界有點棘手,相關論據在論文附錄 E 中可見。如前所述,這一下界與一個常數因子相關,但這裡給出的常數 K 是一個非常弱的下界(因此,這個特殊的選擇應該只是作為經驗法則,而不是作為一個確切數)。

事實上,成本與儲備量 R 是成線性關係的,這一事實正說明了大型流動性池對穩健的重要性。另一方面,由於當ε很小時,成本是平方標度的,攻擊者有可能在很長一段時間內對 Uniswap 中報告的價格進行輕微操縱,而無需花費太多費用。

例如,如果儲備池的 R=1000 ETH,攻擊者可通過ε=1% 操縱價格,大約為每個區塊 C(.01) ≈ 0.025 ETH (這裡的下界相當弱,給出 C (.01)≥ 0.002 ETH)。

請注意,這種操縱在實踐中是可能存在的,因此,我們將警告說,任何協議都不應依賴這些預言機(oracle)所報告價格非常細微的變化,也不應該依賴在非常短的時間內報告的價格。

換而言之,在試圖對價格進行重大調整時,操縱很快就會變得昂貴,這也是我們目前沒有觀察到對 Uniswap 市場進行大規模操縱的原因之一。

結論

Uniswap 雖然相對簡單,但它似乎具有很好的理論性質,這表明,在實踐中,它作為一個去中心化市場和價格預言機可以擁有穩定性。此外,上面的聲明確實強調了在 Uniswap 中擁有大型儲備池的重要性,因為所有結果都以某種方式依賴於此。

如前所述,以上只是完整論文中陳述的一小部分,對細節和證明感興趣的讀者都應該看看論文!

附錄

2020 年 2 月 15 日發生 bZx 攻擊時,攻擊者利用 bZx 智能合約邏輯中的一個漏洞來消耗合約資金,我們要重申上述結論條件的重要性。

據我們所知,這次攻擊並不依賴於預言機(oracle)操作,而是涉及到在單個區塊中執行的多個事務。

特別是,如果攻擊可以在一個區塊中執行,那麼操縱的代價就是非常小的(代價基本上只是交易費用),因此在大多數情況下是相當可行的,因為上面給出的界限並不適用。

這就強調了我們在「操縱成本高昂」部分內容所作警告的重要性:

(a) 合約依賴於 Uniswap 價格的微小變化可能是不明智的(這次攻擊證明了,成本是相當便宜的); (b)合約不應在很短的一段時間內基於 Uniswap 報告的價格;


分享到:


相關文章: