探索Uniswap V4: 流動性池

流動性池是Uniswap 的核心,也是每次升級的重頭戲。如果說從V2 到V3,最主要的變化是集中流動性,那麼從V3 到V4,最主要的變化是流動性池。在V4 中,流動性池的變更主要有以下幾個面向:

  • V3 的每一個流動性池要單獨部署一個合約,而在V4 中所有流動性池都在PoolManager 合約中。
  • 手續費不再僅限於幾個特定值,可以自由設定手續費。
  • V4 支援動態手續費,可依特定條件調整手續費比例。

以下將逐一詳細介紹每個方面的改進,深入探討它們的實現原則以及影響。

PoolManager

在Uniswap V3 中,流動性池是透過UniswapV3Factory 合約部署的,每個池都是一個單獨的智慧合約。同時,每條鏈還有一個Proxy 合約(這個合約在大部分鏈的位址是0x364484dfb8f2185b90e29fbd10ac96fca8a7e4a7)。在增加流動性的時候,用戶需要對Proxy 合約發起交易,Proxy 合約再去調用Pool 合約。在這個過程中,資金要先轉入Proxy 合約,再轉入Pool 變成流動性,最後Proxy 合約會發給用戶一個NFT 作為流動性權益的證明。可見這個過程非常繁瑣,會消耗很多gas。另外,用戶在交易代幣時,如果使用了多跳交易,也要在不同的Pool 合約中轉換,同樣要額外花費一些Gas。

針對這個問題,Uniswap V4 引入單例模式,讓所有的Pool 透過PoolManager 合約管理。在PoolManager 有一個變數_pools,這個變數保存了所有池的狀態。如果要新建一個Pool,只需要為_pools 變數增加一個鍵值對就可以了,不需要部署合約。進行交易的時候,資金也用不著在各個合約之間劃轉,只要在PoolManager 中做好記帳就可以了。

這樣做的好處很多,我們可以做一個粗糙的類比。例如我們需要進行BTC 到USDC 的交易,然後路由計算發現,先把BTC 兌換成ETH,再把ETH 兌換成USDC 是最省錢的方式。因此我們的兌換路徑是BTC->ETH->USDC。

對Uniswap V3 來說,它就像一個菜市場,每個攤位都要進行一次結算,通知各個ERC20 進行支付,需要分別結算BTC,ETH,USDC。

而Uniswap V4 則像一個大超市,只需要在進門的時候充值,離開的時候提款就可以了,在每個櫃檯的交易都是掛帳,不會真的結算。只在最後結算BTC 和USDC 兩個資產。

在這個過程中節省的費用包含兩個部分:

  1. 跨合約調用,在V3 菜市場中每次行動攤位(pool address)都需要付費,而V4 只支付一次。
  2. ERC20 結算費用,V4 的大超市模式砍掉了全部的交易路徑中的清算成本。

鑑於PoolManager 合約的重要性,Uniswap 還搞了個轟轟烈烈的地址挖礦活動[1], 為PoolManager 選個吉祥位址,也能節省使用者的gas。可見官方對這個合約的重視程度。

單利模式的實現,依賴於瞬態儲存技術。瞬態儲存是以太坊中新的資料儲存方式,在EIP-1153 中提出,並在2024 年透過坎昆升級上線。它允許在單一交易執行期間臨時儲存數據,並在交易結束後自動清除。瞬態儲存填補了現有儲存機制的空缺,尤其適合那些資料只需在單一交易內有效且需要頻繁讀寫的場景。以下是瞬態儲存(Transient Storage)、儲存(Storage)、記憶體(Memory)和呼叫資料(Calldata)的比較(引用自瞬態儲存:Solidity 中的高效能暫存資料解決方案[2])

正是透過引入瞬態儲存(Transient Storage)機制,Uniswap V4 能夠在單一交易中以極低的成本儲存交易狀態,而不需要將中間變數永久寫入區塊鏈儲存。這種設計不僅降低了每次交易的gas 消耗,也提升了V4 的交易效率。

手續費

除了單例模式外,另一個巨大的變化是手續費。與V3 相比,V4 的流動性池可以自由設定手續費率,不再局限於幾個特定的值。要直觀的了解這一點,可以看一下流動性池的創建參數。在V3 中,建立池的參數是這樣的:

  • address token0: 池的第一個token
  • address token1: 池的第二個token,通常第一個和第二個根據地址排序
  • uint24 fee: 池的手續費率,只能在1%,0.3%,0.05%,0.01% 中選擇

而在V4 中,建立參數被封裝成PoolKey 物件。這個物件的欄位包括:

  • Currency currency0: token 0。 (Currency 類型是address 類型的別名)
  • Currency currency1: token 1。
  • uint24 fee: 池的手續費率,可以設定為不超過100% 的值,如果設定為0x800000,表示池使用動態手續費。
  • int24 tickSpacing: 流動性的tickspacing。可以自由指定,從2 到32766 都可以。
  • IHooks hooks: Pool 的hook,想詳細了解可以查看之前的文章[3]。

從這些參數可見,流動性池的初始化參數主要包含兩部分: 代幣和手續費。

V4 的手續費設定有兩個參數,fee 和tickSpacing,而V3 只有fee。手續費,V3 只能設定四種數值(1%,0.3%,0.05%,0.01%),比起V2 只能設定0.3%,已經有了一些進步。但在V4 中,手續費率可以在小於100% 的數字中任意挑選,這讓池的創建由了更高的自由度,可以根據代幣的特點設定更精準的手續費值。

tickSpacing 是流動性的粒度。較小的值可提高價格精度;然而,較小的值將導致swap 交易更頻繁地跨越tick,從而產生更高的gas 成本。在V3 中,tick spacing是由手續費率決定的,對應關係如下:

而V4 取消了這種綁定關係,因此fee 和tick spacing 變成了兩個參數分開設置,在V4 中,tick spacing 可以取從2~32766 的任意整數。至於這個值取大還是取小,就要權衡價格精度以及交易頻率了。例如對於穩定幣來說,tick spacing 要盡量小,而對於BTC 這種價格接近十萬的代幣來說,tick spacing 可以大一些以節約gas。將費率和tick spacing 解綁,相當於解除了代幣價格和精確度的綁定關係,這會讓高價格的幣種受益。

這種任意設定帶來了一個問題。對於相同的交易對,每個手續費,每種tick spacing 都是一個新的池,因此池的數​​量會大大增加。例如在V3 中,USDC-ETH 就存在0.05% 和0.3% 以及1% 三個池,而且三個池都很活躍,流動性排名都在前50。到了V4,由於費率有1000,000 種可能,V4 中USDC-ETH 池很容易出現上百個。要是考慮到不同的Hook 也算新的池,未來的池就更多了。這必然會分散每個池的流動性。

動態手續費

動態手續費是V4 中除Hook 以外最大的變化了,意義不亞於V3 的集中流動性。所謂「動態手續費」,是指流動性池的手續費不再固定為某個具體值,而是可以根據市場的具體情況隨時進行調整。這種靈活性使得動態手續費能夠衍生出多種使用場景,為Uniswap 帶來更多的創新應用和策略,從而提高整個協議的效率和適應性。以下是一些可能的動態手續費調整場景:

  1. 根據當前市場價格調整在這種模式下,手續費的調整與市場價格的波動掛鉤。例如,當某種資產的價格上漲時,手續費也會相應增加,反之亦然。這種調整方式可以幫助Uniswap 更好地適應市場環境的變化,尤其是在資產價格劇烈波動時,增加手續費可以有效地補償流動性提供者的風險。
  2. 根據交易量調整在交易量較大時,手續費可以進行折扣或優惠。這種模式適用於大宗交易,既能吸引高頻交易者來降低其交易成本,也能夠鼓勵流動性提供者提供更多的流動性,特別是在交易量大、價格波動小的市場中。透過優化手續費結構,可以實現市場需求與流動性提供者收益之間的平衡。
  3. 根據網路gas 費調整此機制使得手續費與區塊鏈網路的擁擠程度進行連動。在網路gas 費用較高時,流動性池可以自動提高手續費,控制流動性的變化速度;而當網路較為空閒時,手續費則可以適當降低。這種調整方式有助於流動性池的營運效率,也有助於用戶在低網路費用時享受更低的交易成本。
  4. 根據外部價格(如預言機)調整透過與外部預言機或市場資料來源的結合,Uniswap 能夠根據準確的外部價格來動態調整手續費。這種調整機制可以確保流動性池的手續費始終與市場的實際情況相匹配,從而提供更公平和精確的定價機制。例如,當某種資產的市場波動性增加時,手續費可以增加,以反映其風險。
  5. 在特定時間調整此策略允許在某些特定時間點(如每年、季或按週)調整手續費率。這種方式適用於需要定期審視市場環境或根據季節性需求進行最佳化的場景。例如,每年根據上一年的市場表現和流動性需求進行調整,以維持系統性的長期健康發展。

透過上述例子可以看出,動態手續費的引入不僅為流動性池提供了更多的靈活性,也為流動性提供者和用戶帶來了不同的收益與節省機會。對於流動性提供者來說,動態手續費能夠在市場波動較大的時候提供更高的收益,從而激勵他們在高風險時期提供更多的流動性;而對於普通用戶來說,手續費的動態調整能夠根據交易時段、市場狀況或網路擁塞程度進行最佳化,減少交易成本,進而提高交易體驗和平台的整體吸引力。

總而言之,動態手續費為Uniswap 引入了一種更靈活和智慧的費用管理方式,不僅增強了市場適應性,還為流動性提供者和用戶提供了更多的選擇和機會,推動去中心化交易協議在日益複雜的市場環境中不斷向前發展。

以下的話引用了Uniswap 官方的說法,描述了他們眼中動態手續費的場景:

  • 改善波動性的定價:根據市場波動性調整費用,類似傳統交易所調整買賣差價。
  • 根據訂單定價:更準確地定價不同類型的交易(例如,套利交易與非資訊性交易)。
  • 提升市場效率與穩定性:費用可依即時市場狀況調整,優化流動性提供者與交易者的利益。動態費用有助於透過即時調整激勵措施來抑制極端市場波動。
  • 提升資本效率與流動性提供者回報:透過優化費用,池子能夠吸引更多流動性並促進更有效率的交易。更精準的費用定價可能帶來更好的回報,進而吸引更多資本進入池子。
  • 更好的風險管理:在高波動時期,費用可以提高,以保護流動性提供者免受暫時性損失。
  • 可自訂的策略:為特定代幣對或市場區隔提供複雜的費用策略。

動態手續費的實作依賴於流動性池的Hook。 Hook 是V4 的新概念,它是一個單獨的合約,可以為流動性池增加額外的邏輯。透過Hook,流動性池可以在交易前後插入一些自訂函數,在這些函數中都可以更改手續費率。因此,更改手續費的方式是非常靈活的,例如在添加移除流動性的時候,或者swap 的前後都可以計算新的手續費,並即時更改池的手續費率

如果要允許流動性池使用動態手續費,需要在建立池的時候,將費率設定為0x80000, 也就是LPFeeLibrary.DYNAMIC_FEE_FLAG

而改變動態手續費率有兩種辦法。一是在Hook 中調用IPoolManager.updateDynamicLPFee(key,newValue),永久改變池的手續費率。這個函數可以在Hook 的任意掛入點呼叫。比如下面這個例子:

注意: 在建立池後,預設費率是0,所以要在Hook 的afterInitialize為手續費設定一個初始值

另一種方式是臨時更改費率。在Hook 的beforeSwap中,可以回傳一個費率,然後這次swap 交易就會使用這個新的費率。而池的手續費率不會更改,其他的交易也不會受影響。

不過對於動態手續費,有兩個概念容易混淆。在Hook 中也可以額外手續部分手續費,它和池的手續費不衝突,兩個可以一起收。事實上,流動性池的手續費通常會叫做LP fee,而Hook 收的手續費會叫Hook fee。一般提到動態手續費是指流動性池的手續費。

總結

作為領先的AMM 協議,Uniswap V4 的流動性池更新再次彰顯了其在去中心化交易協議領域的創新與領先地位。這一系列的變革不僅增強了協議的靈活性和可擴展性,還顯著提升了其市場競爭力,使得Uniswap V4 在許多方面將對手甩開,並繼續保持在DeFi 生態中的主導地位。

參考資料[1]

轟轟烈烈的地址挖礦活動: https://v4-address.uniswap.org/

[2]

瞬態儲存:Solidity 中的高效臨時資料解決方案: https://learnblockchain.cn/article/9847

[3]

之前的文章: https://github.com/antalpha-labs/zelos

作者:Steven Sun,Zelos

聲明:本內容為作者獨立觀點,不代表0x财经 立場,且不構成投資建議,請謹慎對待,如需通報或加入交流群,請聯絡微信:VOICE-V。

來源:Uniswap V4

Total
0
Shares
Related Posts