技術角度分析 Uniswap V2 的一些特性以及可能帶來的改進與影響。

原文標題:《Uniswap V2 關於預言機和閃電貸》
撰文:outprog,imToken 後端開發與智能合約開發
來源:幣乎

2018 年底給大家介紹了 Uniswap V1,一個基於簡單數學公式的去中心化交易所(V1 版本介紹)。如今 V1 版本已經在以太坊上運行了一載有餘,證明了這種數學公式兌換模型的可行性和實用性。2020 年 3 月 23 號,官方發佈文章介紹即將問世的 V2 版本。那麼 V2 有什麼改進和突破呢?就讓我們來瞧一瞧(官方博客:Uniswap V2)。

本文主要從技術角度介紹 V2 的一些特性,分析這些新特性可能帶來的改進和影響。這些特性包括:ERC20/ERC20 供給池、價格預言機和閃電兌換。其中關於預言機和閃電兌換會做一些的思考,歡迎有識之士來探討這些問題。對某項特性感興趣的讀者可直接跳到指定章節。

ERC20/ERC20 供給池

V1 版本只能通過 ERC20 和 ETH 建立供給池。如果我們使用 DAI 去兌換 ETH,那就可以直接使用 DAI/ETH 的供給池獲得兌換。當我們要進行 DAI 到 USDC 的兌換時,V1 版本是將 DAI 兌換成 ETH,再使用 ETH 去 USDC/ETH 的供給池進行「二次」兌換,最終完成 USDC 到 DAI 的整個兌換過程。

速覽即將推出的 Uniswap V2 新特性:供給池、預言機與閃電貸

V2 的供給池,可以使用任意兩種 ERC20 代幣構成。這樣做的一個好處是可以降低兌換匯率的滑點,因爲每個供給池都會收取一定的費用作爲兌換手續費,通過兩個供給池兌換那就是兩倍的費用。V2 對 ERC20/ERC20 供給池的支持,使 DAI 兌換 USDC 的時候不再需要向兩個供給池進行兌換,減少了一半的費用,兌換匯率滑點也會更低。

如果兩種 ERC20 Token 之間沒有直接的供給池,V2 的路由協議可以在多個供給池之間找到一條優化的兌換路徑,在多個供應池之間完成兌換。爲了實現 A 到 D 的兌換,可以通過 A 兌換到 B,B 兌換到 C,C 兌換到 D 來完成。

目前代碼中的路由協議是 01 版本,需要在鏈下計算好路徑提交給路由協議進行處理。

價格預言機

隨着 DeFi 應用的興起,預言機變得越來越重要,區塊鏈應用對預言機的依賴和要求越來越高。

但在預言機的發展和探索道路上,可謂事故頻發,造成的經濟損失不計其數。早有 Synthetix 由於預言機的錯誤喂價導致 3500 萬的 sETH 損失;最近的 bZx 閃電貸套利事件,也是由於平臺使用了 Uniswap 作爲價格預言機造成了經濟損失。

bZx 閃電貸事件中,攻擊者使用借出的資金對 Uniswap 進行砸盤,導致其價格劇烈變化。此時,使用 Uniswap 作爲預言機的平臺由於讀取了當前砸盤後的價格,出現了巨大的套利空間。套利完成後,攻擊者歸還在閃電貸中借出的資金,完成交易。而整個交易過程都在一個區塊的一個交易中一次性完成,是爲「閃電貸」。

可以發現在 bZx 事件中,由於平臺使用了 Uniswap 最後時點的執行價格產生了不符合預期的喂價。儘管這個價格在 Uniswap 是真實的,但和其他平臺是價格存在很大的偏差。由於閃電貸在一個區塊中迅速完成所有的操作,Uniswap 的執行價格沒有和其他平臺進行套利拉平的機會,可以認爲是一個不符合預期的價格。

V2 的改進是歷史將價格保存在鏈上,並加上了時間權重。它的存儲方式是在鏈上保存了一個累積價格,通過使用兩個累積價格的差值和時間差,可以計算出一個具有時間權重的平均價格。

我們知道 Uniswap 的價格變動是跟隨交易變化的。如果一直沒有交易,那麼這個價格會是一個固定的值。假設兩次交易的間隔 10 秒,第一次交易後產生的價格 P1 會持續存在,直到第二次交易的發生(10 秒後)才變爲 P2。因此 P1 的累積值就是 P1 * 10。累積價格(priceCumulative)即價格和時間差的乘積。在無數次的價格變動中,其中每次的時間間隔分別是 T1、T2、T3...,就有:

priceCumulative = P1 * T1 + P2 * T2 + P3 * T3 + ...

有了累積價格,使用累積價格除以時間就可以得到一個基於時間權重的平均價格。

具體實現如下圖:

速覽即將推出的 Uniswap V2 新特性:供給池、預言機與閃電貸

區塊 122,供給池被創建後累積價格(priceCumulative)初始值爲 0,此時只是發生了交易,產生了一個截止價格,而累積價格並未產生。

區塊 123 的中發生的第一筆交易會更新累積價格,區塊 123 和上一個區塊的時間差爲 7 秒,因此累積價格就是 10.2 * 7,即 71.4。

區塊 124 和上一次區塊的時間差爲 8 秒,使用上一次的截止價格計算的累積值爲 10.3 * 8,即 82.4,加上之前的累積值即爲 153.8。計算過程以此類推。

當我們知道每個區塊的累積價格時,可以通過公式獲得任意時間範圍內的,帶有時間權重的平均價格:

時間權重的平均價格 = (當前累積價格 - 上一次累積價格)/(當前時間戳 - 上一次時間戳)

計算過程中,累積價格包含了上一次交易區塊中發生的截止價格,但不會將當前區塊中的最新截止價格計算進去,這個計算要等到後續區塊的交易發生時進行。因此累積價格永遠都比當前區塊的最新價格(執行價格)慢那麼一個區塊。由於慢了一個區塊,閃電貸在同一個區塊裏進行的砸盤價格就不能立即生效。當惡意砸盤發生時,不會影響當前的預言機價格,但是執行價格會立即降低,發現價格變動的套利者會在下一個區塊將價格缺口補平。採用這樣的機制,使預言機具備了防範閃電貸中惡意砸盤行爲的能力。同時,惡意砸盤產生的價格會被套利者發現並迅速補平缺口,由於快速的套利會使砸盤價格存在的時間權重較低,也能極大的提高預言機的準確性。

閃電兌換

也許是得益於閃電貸的啓發,V2 版本也將提供閃電兌換的功能。該功能同閃電貸異曲同工,無需任何抵押(空手套白狼),就可以借出 Uniswap 供給池中的 Token,這些 Token 用於「閃電」業務,只要在業務處理完成後,將對手方 Token 即刻兌還,就可以完成一筆閃電兌換。

V2 核心合約 Pair (即供給池)的 swap 函數中實現了 calldata 調用,並且可以讓用戶先兌後還。假設有一個支持 DAI/ETH 的 Pair (供給池),一開始 ETH 會從 Pair 借出到外部套利合約,然後 Pair 會去調用套利合約實現的 uniswapV2Call 接口。

uniswapV2Call 中可以完成一系列的「閃電」業務,之後 uniswapV2Call 再將相應的 DAI 返還給 Pair。Pair 對 uniswapV2Call 調用結束後,會進行最終的賬目覈對。如果 Pair 沒有收到足夠的 DAI,那麼整個交易都將回滾。因此對於套利者,借出一筆 ETH 後,必須在同一個交易結束前再將 DAI 返還(並付上 0.3% 的費率),才能保證整個閃電兌換的成功。

速覽即將推出的 Uniswap V2 新特性:供給池、預言機與閃電貸

反觀最近發生的 bZx 事件,它可能不算是一種攻擊,而是多種 DeFi 金融工具結合涌現出的一種「平倉」操作。這樣的操作或許會使價值更接近本質。區塊鏈上的價值,會以自動化算法爲驅動,在整個區塊鏈網絡中以更加迅速的方式流動,bZx 的閃電貸就是一種很好的體現,在一個原子交易中抹平價值和信息的差距。

閃電貸、閃電兌換應該會成爲一種常態,擁有專業能力的人,在沒有資本的前提下,亦可以捕獲價值信息的不對稱,從價值轉化中獲取利益。在傳統領域,這必須是具有龐大資本的機構才能完成的操作。

結語

Uniswap 上線之初,就不是一個能使項目方自己賺得金銀滿鉢的項目,他的供給池是由無數的個人用戶組成。只要你擁有 ETH 和 token 既可以存儲在供給池中獲利。通過簡單的算法,供給池在交易的過程中持續的增長,最終這些收益又回饋到供給池的提供者們身上。它以低廉的成本,通過區塊鏈完成了一種自組織、盈利和分配的機制,這種機制不會使壟斷機構獲取暴利,而是按照每個人所提供的資本進行平等分配,是一種真正透明、公正可持續化的機制。

在整個去中心化組織的發展歷程中,由於機制的先進性和早期的不完善,不免產生各種新的問題,甚至造成巨大的經濟損失。Uniswap V1 作爲預言機存在一定的問題,但從 V2 的升級中我們可以看到機制的進一步完善,使之前的問題被化解。同時,閃電兌換的創新,開放了 Uniswap 的供給池,爲那些缺乏資本擁有能力的專業人士創造了機會。通過這些持續不斷的創造和改進,自組織形式在快速的發展和完善。

來源鏈接:bihu.com