Uniswap V3 核心思想是流動性集中,流動性提供者可以在某個區間提供流動性,提高資金使用率。

原文標題:《Uniswap - V3 技術白皮書導讀》
撰文: Star Li

Uniswap V3 一公佈就引發廣泛關注。相對 V2 來說,邏輯和代碼都複雜一些。V3 的核心是通過盤口區間提供流動性(集中式流動性),解決 LP 提供流動性時的資金利用率的問題。什麼是資金利用率?V3 如何推導區間流動性的計算公式?如何理解流動性?如何計算 swap 費用?本文先從 V3 技術白皮書詳細分析開始。

先給出一些 Uniswap 官方有關 V3 的資料:

推薦先認真查看技術白皮書,再看智能合約代碼,最後再對照官方介紹。理解了技術白皮書,代碼非常容易理解。在技術白皮書的第一章總結了 Uniswap V3 的技術特點,最核心的概念是 「Concentrated Liquidity」(集中式流動性)。

資金利用率

先看看 Uniswap V2 的資金利用率:

深入理解 Uniswap V3 原理:從技術白皮書開始

上圖爲資金池中的 x/y 的量變化曲線。資金池中的當前價格在 c 點,並且假設會在 a 價格點和 b 價格點之間波動。從 c 點向 a 點滑動,消耗最大 y_real,從 c 點向 b 點滑動,消耗最大爲 x_real。也就是說,當前價格 c 點,在 a 點和 b 點之間震盪的話,最大隻需要消耗 x_real 和 y_real。理論上只要提供 x_real 和 y_real 就足夠了。而事實上,如上圖所示,在價格 c 點,分別提供了大於 x_real 和 y_real 的 x 和 y。明顯可以看出,x-x_real 和 y-y_real 的資金在這種情況下是永遠用不上的,也就稱爲閒置資金。

在這種情況下,資金利用率爲 x_real/x 或者 y_real/y。如果價格波動非常小的話,資金利用率是非常低的。Uniswap V3 就是嘗試解決資金利用率低的問題。想法比較簡單,所有資金可以只添加到某個區間,只添加到有可能價格波動到的區間範圍。如何在某個區間添加流動性並提供 swap 功能是 Uniswap V3 的重點。先從 Virtual Reserves 說起。

虛擬資金池(Virtual Reserves)

Uniswap 的交易採用的乘積固定模型 (x*y=k)。所謂的虛擬資金池 (Virtual Reserves),是指還在乘積固定曲線上,只提供某個區間流動性的資金池:

深入理解 Uniswap V3 原理:從技術白皮書開始

圖中的墨綠色的曲線就是虛擬資金池滿足的乘積固定曲線。事實上需要的資金的曲線如圖中的橘黃色。橘黃色的曲線公式如下圖:

深入理解 Uniswap V3 原理:從技術白皮書開始

你可以想象成虛擬資金曲線在 x/y 軸進行平移,使得 a/b 點和 x/y 軸重合。也就是用一定量的資金就能達到「虛擬」的交易曲線的效果。

如何計算在某個區間提供虛擬資金池,先要從深入理解流動性開始。

流動性(Liquidity - L)

乘積固定的交易模型,滿足資金池中的兩種代幣金額滿足:xy = K。如果設定 K=L^2 的話,xy = L^2。L 就是我們說的流動性。由乘積固定的交易模型得出如下的公式:

深入理解 Uniswap V3 原理:從技術白皮書開始

在已知 L 和 sqrt(P) 的情況下,也能推導出資金需求量 x 和 y。

深入理解 Uniswap V3 原理:從技術白皮書開始

通過公式 6.6,在流動性不變的情況下(不添加刪除流動性),流動性可以看成是單位「價格波動」的 y 資金量的變化。「價格波動」打上引號是因爲事實上是 sqrt(P) 的變化。

深入理解 Uniswap V3 原理:從技術白皮書開始

這個是 Uniswap V3 核心公式(6.7),用相對值(資金和價格相對值)來計算流動性。所謂的流動性,就是單位「價格變化」的資金量。在一定的交易量的情況下,如果流動性好,價格變化就小,流動性不夠的話,價格波動就大。

深入理解 Uniswap V3 原理:從技術白皮書開始

特別注意的是,一個區間上的流動性和 V2 的普適的流動性不同。一個區間上的流動性,重點在「區間上」。不同區間的流動性沒有可比性。V2 的流動性和區間上的流動性的區別如下圖:

深入理解 Uniswap V3 原理:從技術白皮書開始

V2 的流動性是「普適」的,在所有價格點上流動性相同。V3 的流動性是由一系列不同區間上的流動性組成。相對來說,在當前價格左右的流動性比較高。流動性提供者 LP 只有提供了可供交易的流動性才能獲取交易費。爲了獲取更多的交易費,爲了提高資金的利用率,流動性提供者會將資金提供在合理的價格波動範圍內。也就是說,在某個區間 swap 交易產生的手續費,只有該區間流動性提供者才能獲取手續費。爲了計算每個區間獲取的手續費,引入了 Tick 的概念和計算方法。

Tick

在區間上提供流動性,帶來很多複雜的情況:區間和區間的重疊覆蓋。因爲不同區間的流動性沒有可比性,某個交易費並不能混入到流動資金中,等刪除流動性時候一併提取。爲了解決這個問題,Uniswap V3 引入了 Tick 的概念。交易費用實時結算並單獨記錄,並不混入流動資金中。雖然整個區間和區間的流動性沒有可比性,但是,在具體的某個價格點上(一個價格片上),流動性是可比較的。Uniswap V3 將整個價格範圍 (負無窮到正無窮) 分成一個個的 Tick (價格點):

深入理解 Uniswap V3 原理:從技術白皮書開始

後一個價格點的價格是前一個價格點價格基礎上浮動萬分之一。

深入理解 Uniswap V3 原理:從技術白皮書開始

每個 Tick 也有一個唯一的序號。區間(Position)可以由兩個 Tick 表示。邏輯上交易手續費可以一個個的 Tick 計算,並在每一個 Tick 上根據流動性的佔比進行交易分配。先看看一個 Tick 範圍的 swap 的計算。

Tick 內的 SWAP

假設有一個很小的量的 y,需要 swap 爲 x。通過 6.13 的公式,可以計算出因爲 y 的變化導致的價格變化。

深入理解 Uniswap V3 原理:從技術白皮書開始

再利用 6.15 的公式可以算出換取的 x 的量。

深入理解 Uniswap V3 原理:從技術白皮書開始

Uniswap V3 針對同樣的交易對設置了不同的交易費:0.05%,0.3% 以及 1% (還可以添加其他費率)。如果是從 Y 換取 X,則在換取之前先扣除手續費再進行上述的交換。

在同一交易池中只支持一種費率。也就是說,在一個交易池中支持不同的價格區間,但是都是同樣的費率。如果需要添加同樣交易對的不同交易費的交易池,必須創建新的交易池。

接下來,深入講解一下 添加 / 刪除流動性以及交易費用的計算邏輯。

添加 / 刪除流動性

V3 的添加 / 刪除流動性是當前價格情況下在某個區間添加或者刪除流動性。所有的流動性添加 / 刪除流動性採用如下的公式:

深入理解 Uniswap V3 原理:從技術白皮書開始

注意,價格變化並不是指區間的大小,而是在某個區間上提供流動性,相對當前價格,「需要相應資金變化」對應的價格變化。

分爲三種情況,想要添加的流動性區間和當前價格的關係。

  • 當前價格處於流動性價格區間 (il <= ic < iu)

深入理解 Uniswap V3 原理:從技術白皮書開始

因爲價格在區間範圍內,如果價格滑動到 il,則需要提供 y 資金。如果價格滑動到 iu,則需要提供相應的 x 資金。所以,對於 delta_Y 來說的,價格變化爲 sqrt(P) - sqrt(p(il));對於 delta_X 來說,價格變化爲 1/sqrt(P) - 1/sqrt(p(iu))。

  • 當前價格低於流動性價格區間

深入理解 Uniswap V3 原理:從技術白皮書開始

因爲當前價格遠低於 il,即使從當前價格向 iu 滑動,也只需要 x 的資金,不需要 y 的資金。所以,在這種情況下,delta_Y = 0。因爲從 il 滑向 iu 需要整個區間的 x 的資金,對於 delta_X 來說,價格變化爲 1/sqrt(il) - 1/sqrt(p(iu))。

  • 當前價格高於流動性價格區間

和第一種情況類似,不重複分析了。

Swap 交易費用

Uniswap 最複雜的邏輯是計算交易費用並分配。在添加和刪除流動性之前需要將相應的交易費用提取。

Tick 上的總流動性

在某個 Tick 上可以存在多個區間。在計算交易費用時,需要平攤這些費用給所有在這個 Tick 上多個區間的總的流動性。在每個區間的邊界的 Tick 上記錄下 delta_L (所有以這個 Tick 爲邊界的區間的流動性總和)。

存在一個全局狀態:liquidity,保存當前價格對應 Tick 的流動性總和。當價格波動,穿過某個 Tick 時,會進行流動性的增加或者減少(取決於價格波動方向)。舉例來說,價格從左到右穿過區間,當穿過區間的第一個 Tick 時,流動性需要增加,穿出最後一個 Tick 時,流動性需要減少,中間的 Tick 都沒有流動性的增加和減少(delta_L 爲 0)。

深入理解 Uniswap V3 原理:從技術白皮書開始

區間(Position)上的交易費用率

計算一個區間上的交易費用率,採用總的費用率減去區間外的費用率的方法。 在一個區間的邊界 Tick 上記錄 feeGrowthOutside。所謂的 feeGrowthOutside,就是「另外」一個方向上總的費用率。另外的一個方向是相對穿過當前 Tick 的方向而言。當價格從左到右穿過一個 Tick,feeGrowthOutside 指的是 Tick 左邊所有區間的費用率。簡單的說,就是價格要去方向的相反方向所有區間的費用率。feeGrowthOutside 用 fo 表示。因爲 fo 是一個 Tick 的兩個方向的總的費用率,兩個方向的費用率的總和肯定是等於 fg (全局的費用率)。所以當穿過一個 Tick 時,這個 Tick 上的 fo 要進行翻轉:

深入理解 Uniswap V3 原理:從技術白皮書開始

當一個區間創建時,區間邊界上 Tick 的 fo 需要初始化:

深入理解 Uniswap V3 原理:從技術白皮書開始

如果當前的價格大於 Tick 的價格時,因爲即使當前價格在設置的區間內,但是之前費用也不會分到,所以,可以簡單的假想爲所有的費用發生在 Tick 價格之下,也就是 fo=fg。如果 Tick 的價格大於當前價格,價格還沒有穿過 Tick,因爲假設了之前所有發生的費用發生在 Tick 價格之下,Tick 之上是沒有費用的,所以 fo=0。在理解了這些邏輯的基礎上,在 swap 的過程中,隨着價格的波動,一個區間上,超過最高 Tick 的費用率以及低於最低 Tick 的費用率可以用如下的方式計算:

深入理解 Uniswap V3 原理:從技術白皮書開始

以低於最低 Tick 的費用率的計算爲例,如果 ic>=i (當前的價格是高於最低 Tick 的),低於 Tick 的所有的費用率就是 fo (定義如此)。如果 ic

深入理解 Uniswap V3 原理:從技術白皮書開始

獲取的費用率的基礎上,用費用率乘以區間的流動性可以計算出該區間收取的費用。

總結

Uniswap V3 版本核心思想是流動性集中。流動性提供者可以在某個區間提供流動性,提高資金使用率。在某個區間獲取的交易費,由所有在該區間的流動性提供者均分。Uniswap V3 設計了區間粒度-Tick,並且推導了流動性添加 / 刪除以及費用計算的過程。在之基礎上,Uniswap V3 也更新了價格預言機的實現。