來源: Keegan小鋼
UniswapV3 於 2021 年 5 月上线,相比 UniswapV2,改動很大,也變得復雜很多,最主要的有以下這幾點改動:
引入了集中流動性(Concentrated Liquidity)機制
LP Token 改爲了不可互換的 NFT
每個交易對可以有多個不同費率的池子
協議手續費治理更靈活
改進了價格預言機
其中,最核心的改動就是引入了集中流動性機制。所謂集中流動性,主要是說流動性提供者(LP)可以將其提供的流動性”限制“在任意價格區間內來”集中“其流動性。從直觀上來說,UniswapV3 中,用戶添加流動性的時候,需要設置一個價格區間,如下圖所示:
默認時這個價格區間是全範圍,即 **(0, ∞)**。LP 可以自己修改低價和高價爲任意值,即 LP 可以設置自己要提供的一個價格區間。而設置了有限的價格區間後,那提供的該流動性也只有在該價格區間內才有效。爲了更好理解,下面舉個例子說明一下。
有兩個LP,A 和 B,分別在不同價格區間提供了流動性,A 在區間 (1000, 2000) 內提供了流動性,而 B 則在區間(2000, 3000)內提供了流動性。那當交易價格爲 1500 時,發生的交易只會和 A 所提供的流動性進行交易,交易手續費也歸 A 所有,而 B 提供的流動性不參與任何交易,也得不到任何手續費。不過,當價格上漲到 2500 時,進入到了(2000, 3000)的價格區間,這時候發生的交易則只會和 B 所提供的流動性進行交易,交易手續費也歸 B 所有了,而 A 的流動性則變成無效了,也得不到手續費了。當價格又跌回到 (1000, 2000) 區間時,A 的流動性又再次變爲有效,而 B 的流動性又再次變爲無效。
集中流動性機制,會使得大量 LP 的流動性聚合在包含當前價格的區間內,能有效提高池子的資金利用率。比如下圖爲 USDC/ETH 的流動性分布:
大部分流動性集中在了當前價格附近,這也是大部分池子都比較常見的狀態。
不過,集中流動性機制,實現起來其復雜度也大幅增加,背後的數學原理也不太容易理解,還引入了其他概念,比如 tick。
因爲在 UniswapV3 中,LP 提供的流動性是分爲多個不同區間的,那爲了方便計算不同區間的流動性和手續費分配,UniswapV3 就將整個價格範圍劃分爲了多個離散的價格點,這些價格點就稱爲 tick,每個價格點 tick 都對應於一個實際價格,兩者的關系可以表示如下:
該公式表明了,當 tick 爲 0 時,價格爲 1;當 tick 爲 1 時,價格爲 1.0001;當 tick 爲 2 時,價格爲 1.0001^2。也即是說,相鄰價格點之間的價差爲 0.01%。當然,tick 也可以爲負值,爲負值時表明價格 p 小於 1。
UniswapV2 添加流動性時,兩個代幣的價值是相等的。直到你移除流動性時,兩個代幣的價值依然也是相等的。但在 UniswapV3 中則不是,我們以下圖爲例進行說明:
上圖中,ETH/USDC 當前價格爲 1806.97,待添加的流動性價格區間爲 (1699, 1900)。然而,可以看到,當要添加 1 ETH 時,對應需要添加的 USDC 並不是當前價格的數量 1806.97,而是達到了 2184.99,兩個代幣的價值是不相等的。另外,添加流動性之後,如果 ETH/USDC 的價格下跌,你流動性裏的 ETH 會增多,USDC 則減少;反之,如果價格上漲,則你流動性裏的 ETH 會減少,USDC 會增多。
基於這種特性,還可以實現限價單功能。比如,假設 ETH 當前價格爲 2500,用戶覺得價格可能會跌到 2000 以內,那就可以在 2000 附近設置一個很短的區間,比如設置(1999, 2000)。這時候,因爲整個價格區間都低於當前價格,用戶提供的流動性只需要充值 USDC 一種資產即可。這時候,相當於用戶掛了一個價格爲 2000 的限價买單。當價格跌下來,進入了(1999, 2000)這個價格區間的時候,有人交易時就會將該區間內的 USDC 換成 ETH(實際其實爲 WETH),直到價格完全穿過價格區間的上限,那池子裏的所有 USDC 都被換成了 ETH。這時候,用戶撤走流動性,就相當於之前所掛的限價买單成交了。不過,與傳統的限價單相比,有兩點需要注意:
如果價格不能穿過整個價格區間,那就只有部分 USDC 會被換成 ETH
轉換完成後,需將流動性移除,否則一旦價格又回到該價格區間,那池子裏的 ETH 會被交易換回 USDC
UniswapV2 中的流動性是整個池子共享的,每個人佔有多少流動性可以用份額來表示,而份額是可以互換的,所以可以用 ERC20 Token 來作爲流動性代幣。但 UniswapV3 中,流動性增加了價格區間的限制之後,就不再是共享的了,每一次添加的流動性都基本是獨一無二的,因此,已經不適合繼續使用 ERC20 來作爲流動性代幣,但使用 ERC721 卻非常合適,每一次添加的流動性也稱爲一個頭寸(position),就用一個單獨的 NFT 來表示。
UniswapV2 中,每個交易對有且僅有一個流動性池,且交易手續費率都是統一的千分之三。但 UniswapV3 可以爲同個交易對創建不同費率的池子,即 token0、token1 加上 fee 三個字段組成了一個 Pool 的唯一性。一开始的時候支持了 0.05%, 0.3% 和 1% 的費率,之後在 2021 年 11 月時通過 DAO 治理又增加支持了 0.01% 的費率。
UniswapV2 中,還有一個協議手續費,和交易手續費一樣,也是一個基於全局的費率,如若打开收取協議手續費的話,則可獲得交易手續費的 1/6。而 UniswapV3 的協議費率設置更靈活,不再是固定的 1/6,而是 1/N 或 0,其中,N 是可配置的,範圍爲 4 <= N <= 10。而且,還可以基於每個池子設置不同的協議費率。比如,可以設置 A 池爲 1/6,B 池設爲 1/8,C 池則爲 0。
價格預言機也做了升級,之前講區塊鏈預言機章節中已經介紹過 UniswapV2 和 UniswapV3 的預言機。這裏主要再補充一點,V2 的方式是直接記錄價格的累加值,使用時再除以時間間隔,這是一種算術平均。而 V3 累加的是 log(price, 1.0001)
也就是價格的冪,使用時再除以時間間隔,這是幾何平均。幾何平均數相比算術平均數,能更好的反應真實的價格,受短期波動影響更小。另外,使用幾何平均,也是因爲合約中記錄了 tick 序號,序號是整型,且跟價格相關,所以直接計算序號更加節省 gas。
UniswapV3 在代碼層面的架構和 UniswapV2 的變化則不大,合約層面,主要還是兩個庫:
v3-core
v3-periphery
v3-core 的核心合約就兩個:
UniswapV3Factory:工廠合約
UniswapV3Pool:流動性池子合約
v3-periphery 的核心合約也是兩個:
NonfungiblePositionManager:頭寸管理合約
SwapRouter:兌換路由合約
與 UniswapV2 不同,不再由 Router 合約作爲添加流動性、移除流動性和兌換交易的全部入口,而是把流動性相關的功能放到了單獨的合約 NonfungiblePositionManager,而 SwapRouter 主要只用於交易入口。
後續文章我們會依次講解下這四個核心合約。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
標題:剖析DeFi交易產品之UniswapV3:集中流動性、協議手續費、價格預言機
地址:https://www.torrentbusiness.com/article/74551.html
標籤:DeFi