前言
Dex,作為眾所週知的“去中心化交易所”,靠鏈上合約自助運行,稱為AMM(自動做市商),利用CLMM模型撮合交易,不受任何機構或者個人的控制。傳統的中心化交易所Cex中,通常使用“訂單簿”系統來撮合交易,同時擁有較大的流動性和專門的Market Maker(做市商),同時Cex Market Maker的門檻較高,一般為專業的機構,通常需要滿足資本、技術、風險管理、合規和市場知識等多方面的要求,個人很難通過成為Cex的LP來獲得收益。相反,Dex為個人參與者降低了LP的門檻。
如果你對Cex和Dex稍微有些了解,很容易就會產生兩個疑問,也是最基本的疑問——“Dex利用什麼模型來撮合交易、計算價格呢?不同模型的差異和考慮之處在何?”和“Dex如何設計一個公平又高效的機制來回饋LP呢?”
Uniswap v3的核心機制——集中流動性Concentrated Liquidity
在Uniswap v2等早期版本中,流動性均勻分佈在整個價格曲線 x · y = k
上,覆蓋價格範圍(0, ∞)。這種設計雖然足夠簡單和優雅,但是實際上大部份資產永遠不會被用到,因此存在資本效率低的問題。

v3相較於v2的升級
Uniswap v3允许流动性提供者(LP)将流动性集中在特定价格区间内,而非整个价格范围。

这种集中的流动性被称为头寸(Position)。一个头寸只需要持有足够的资产来支持其价格区间内的交易,因此可以在该区间内表现得像拥有更大虚拟储备的池子。 流动性量L = √k,真实储备遵循以下曲线:

頭寸的資產配置邏輯
舉個例子,X代幣是SOL,Y代幣是USDT,以價格X/Y(SOL/USDT),[150, 200] 和當前價格 160 ∈ [150, 200] 為例:
如果你覺得SOL 160u的價格太便宜了,cex都漲到180u了,你想在dex這裡買。所以你是拿著160u放進這個池子(Pool)裡面,同時從中取出1 SOL,從而池子中的SOL儲備變少,USDT儲備變多,價格從c點向b點移動,此過程消耗了SOL(X),存入了USDT(Y),推動價格上漲。
因此,如果你作為LP看好了這個區間,你需要儲備的頭寸(對應real)由以下邏輯計算:
X代幣儲備:只需持有足夠的X代幣來覆蓋價格上漲到上界p_b的情況(因為價格上漲對應X儲備的消耗) • Y代幣儲備:只需持有足夠的Y代幣來覆蓋價格下跌到下界p_a的情況

風險
停止賺取手續費 一旦價格離開[150, 200]區間,你的頭寸就變成非激活狀態,不再參與交易撮合,因此會停止賺取交易手續費收入,同時錯過了價格在區間外時的所有交易機會
無常損失 (Impermanent Loss) 這是更重要的損失。當價格離開區間時: 價格突破上界(>200u)時,你的頭寸全部變成USDT,相當於在200u的價格全部賣出了SOL。如果SOL繼續上漲到250u,你就錯過了200u→250u的漲幅; 價格跌破下界(<150u)時:你的頭寸全部變成SOL,相當於在150u的價格全部買入了SOL。如果SOL繼續下跌到100u,你承擔了150u→100u的跌幅損失。
Range Orders
當流動性頭寸設置在非常小的價格區間內時,它的行為就像傳統的限價訂單一樣。一旦價格穿越這個區間,頭寸會從完全由一種資產組成轉變為完全由另一種資產組成(加上累積的手續費)。
為什麼Range Orders比傳統限價訂單有更好的資本效率?
1. 持續賺取手續費
傳統限價訂單:資金閒置等待,直到價格觸及才執行,期間無任何收益
Range Orders:即使在等待期間,只要價格在區間內波動,就能持續賺取交易手續費
舉例:你想在SOL價格180u時賣出
- 傳統限價訂單:SOL在179u-180u之間波動時,你的資金完全閒置
- Range Orders [179.5, 180.5]:價格在區間內每次波動都能賺取手續費
2. 虛擬儲備放大效應
Range Orders利用集中流動性的虛擬儲備機制:
相同的資金在窄區間內能提供更深的流動性,獲得更高比例的交易手續費分成,以及資本利用率顯著提升
3. 部分執行的靈活性
傳統限價訂單:要麼全部執行,要麼完全不執行,原子交易
Range Orders:可以部分執行,在價格區間內逐步完成交易。這種漸進式執行往往能獲得更好的平均價格
4. 雙向收益機會
如果價格在區間內來回波動:
- 傳統限價訂單只能執行一次
- Range Orders可以多次參與交易,累積更多手續費收入
不過,這種倉位需要主動管理:價格穿越後要及時提取,避免反向交易,否則會有承擔無常損失的風險;以及區間設置需要權衡,太窄容易被穿越,太寬效率降低。
Multiple Pools Per Pair(每個交易對的多個池子)
Uniswap v1/v2的單一0.30%費率無法適應不同類型代幣對的需求。
費率過高的情況:
穩定幣對(如USDT/USDC):價格波動極小,0.30%費率相對過高 • 交易者可能轉向費率更低的平台
費率過低的情況:
高波動性代幣:價格劇烈波動,LP承擔更高風險 • 稀少交易代幣:流動性稀缺,應該有更高的風險補償
因此,v3引入多個費率層級的池子架構,這些池子都由一個叫factory的合約創建,有三個等級: • 0.05%:穩定幣對專用,追求極低滑點 • 0.30%:主流代幣對,平衡收益與風險 • 1.00%:高風險代幣,對LP提供風險補償
Non-Fungible Liquidity(非同質化流動性)
Non-Compounding Fees(非複投手續費)在早期版本中,賺取的手續費會自動重新投入池子作為流動性,這意味著池子中的流動性會隨時間自然增長,即使沒有明確的新增投入。
在v3中由於頭寸的非同質化特性,自動複投變得不可能。手續費收益被單獨存儲,以原始代幣形式持有(而非轉換為流動性),LP需要主動提取手續費,然後手動決定是否重新投入。
Removal of Native Liquidity Tokens(移除原生流動性代幣)
v1/v2中,池子合約本身就是一個ERC-20代幣合約,流動性代幣代表LP在池子中的份額,這些代幣是同質化的(fungible),可以自由交易和轉移。在v2的設計哲學:核心合約應該盡可能簡潔,非必需功能應該放在外圍合約(periphery)。但v2將ERC-20實現放在核心合約中,違背了這一原則,這種設計還阻礙了改進版ERC-20包裝器的創新。
v3的改變:核心合約不再實現ERC-20標準,以及集中流動性使得完全同質化的流動性代幣變得不可能。
兩種模式:
- 外圍ERC-20包裝器: 任何人都可以創建ERC-20合約來包裝流動性頭寸,但需要額外邏輯處理手續費分配或重新投資。這提供一定程度的同質化,但功能有限。
- ERC-721 NFT包裝器: 用戶可以將單個流動性頭寸(包括累積手續費)包裝為非同質化代幣,每個NFT代表一個獨特的流動性頭寸。這種方案更準確地反映了v3頭寸的本質特性。

設計影響與意義
技術層面:
- 核心合約更加簡潔且專注
- 為創新的代幣化方案預留空間
- 符合模組化設計原則
用戶體驗:
- LP需要適應新的非同質化流動性管理模式
- 失去了v2中簡單的「存入即忘」體驗
- 獲得更精細的控制能力
生態發展:
- 催生各種流動性管理工具和協議
- NFT化的流動性頭寸成為新的DeFi基礎元素
- 為流動性即服務(LaaS)等創新模式奠定基礎
Governance 代幣治理
治理架構
Factory合約所有權:
Factory合約有一個owner(所有者),初始由UNI代幣持有者控制,但owner無法停止任何核心合約的運行,這確保了協議的抗審查性和去中心化特性。
UNI治理的核心權限
1. 協議費用控制
用戶可以開啟/關閉協議費用(類似v2),可以選擇協議費用佔交易手續費的比例,以及為每個池子設置不同的協議費用比例。
2. 費率層級管理
用戶可以引入新的交易手續費等級,為每個費率層級定義對應的tickSpacing參數。不過一旦添加費率層級,無法移除,tickSpacing也無法更改。
關於tickSpacing
tickSpacing是池子的重要參數,決定了哪些tick可以被初始化。
tick的概念:
每個tick代表一個特定的價格點,理論上每個價格都有對應的tick(基於1.0001的冪),tick之間的價格差異約為0.01%(1個基點)。
基本機制:
只有tick索引能被tickSpacing整除的tick才能被初始化。
例如,當tickSpacing = 10時,只能初始化tick -20, -10, 0, 10, 20…
精確度與效率的權衡:
- tickSpacing越小,精確度越高,允許更精確的價格區間設置,但交易時gas費用更高(可能跨越更多tick)
- tickSpacing越大,效率越高,交易gas費用較低,但價格精度較低,無法設置很窄的區間
當前支持的費率層級:
- 0.05%(tick間距10,約0.10%價格間隔)
- 0.30%(tick間距60,約0.60%價格間隔)
- 1.00%(tick間距200,約2.02%價格間隔)
為什麼tickSpacing一旦確定不能修改?
為了保護已有LP的頭寸有效性,確保合約長期穩定運行,以及防止治理攻擊影響用戶資金。
3. 所有權轉移
UNI治理擁有將factory所有權轉移給其他地址的權力。
Oracle Upgrades (與傳統預言機不同,Uniswap是內部預言機模式)
Uniswap v3對v2引入的時間加權平均價格(TWAP)預言機進行了三個重大改進: (Tips:TWAP和幾何TWAP是DeFi領域很重要的保護機制,在防止價格操縱、穩定幣錨定領域有著廣泛應用,我會再出一篇文章專門介紹)
TWAP = Σ(价格i × 持续时间i) / 总时间
1. Oracle Observations 預言機觀測
v2版本存在許多局限性,例如用戶需要在外部追蹤累加器的歷史值,必須在計算TWAP的時間段開始和結束時手動記錄累加器值,且無法保證每個接觸池子的區塊都反映在累加器中。
v3的改進
內置檢查點系統:
池子自動儲存價格累加器的歷史值列表,每當池子在一個區塊中首次被接觸時自動創建檢查點,使用循環緩衝區機制,最舊的檢查點會被新的覆蓋。
儲存擴展機制:
初始只有一個檢查點槽位,任何人都可以初始化額外儲存槽位,最多擴展到65,536個檢查點,可以獲取至多9天內的歷史數據(假設13秒出塊間隔)。
這能夠向用戶展示歷史觀測數組,提供便利函數查找任意歷史時間戳的(插值)累加器值,方便用戶進行數據分析。
2. Geometric Mean Price Oracle 幾何平均價格預言機
v3預言機的內生價格計算機制從TWAP升級為幾何TWAP,大幅提升了價格精度和儲存效率。
v2:算術平均TWAP
維護兩個價格累加器(token0/token1 和 token1/token0),計算算術平均時間加權價格。這需要分別追蹤兩個方向的累加器(因為算術平均不滿足倒數關係),並且使用224位定點數表示價格,精度要求高。
v3:幾何平均TWAP
預言機累加當前tick索引(log₁.₀₀₀₁(P))而非價格本身,累加器公式aₜ = Σᵢ₌₁ᵗ log₁.₀₀₀₁(Pᵢ),得出t₁-t₂時間的TWAP:Pₜ₁,ₜ₂ = 1.0001^((aₜ₂-aₜ₁)/(t₂-t₁))
只需一個累加器,因為幾何平均的倒數等於倒數的幾何平均。合約追蹤log₁.₀₀₀₁(P)而非P,只需24位有符號數就可在廣泛價格範圍內保持一致精度。同時在理論上,對幾何布朗運動過程價格建模更準確。
3. Liquidity Oracle 流動性預言機
v3新增了流動性累加器,追蹤1/L(當前範圍內虛擬流動性的倒數)的時間加權累加。在價格每次跨越tick時儲存基於此值的計算檢查點,與價格累加器並行追蹤,為集中流動性的精確獎勵分配提供了基礎。
- 流動性挖礦公平分配(Reward分配機制)
外部合約可以按R代幣/秒的速率向所有活躍流動性分發獎勵,對於從t₀到t₁期間活躍的L流動性頭寸,獎勵為:R·L·(spl(t₁) - spl(t₀))。確保只有在範圍內的集中流動性才能獲得獎勵。
- 預言機強化
幫助鏈上合約選擇最可靠的TWAP來源(流動性越強越可靠),以及能夠評估不同費率層級池子的流動性深度,多個數據來源為預言機提供更強的抗操縱能力。
設計哲學
相比於v2,v3的升級體現了「用複雜性換取效率」的核心設計思想。雖然增加了技術複雜性,但大大提升了資金利用率、儲存效率和安全性,引領了流動性即服務(LaaS)等的創新模式,為整個DeFi生態提供了更強大和靈活的基礎設施。