去中心化交易所深度解析

前言

DEX(Decentralized Exchange,去中心化交易所)是 DeFi 最底层的流动性基础设施。没有 DEX,就没有 DeFi —— 这句话一点都不夸张。截至 2026 年 5 月,DEX 月交易量在 800-1500 亿美元之间波动,占现货总交易量的约 20%。

这篇文章聚焦 Uniswap,因为它代表了 AMM(自动做市商)模式最完整的演进路径 —— 从 2018 年的 v1 到 2025 年的 v4,每一代都解决了一个关键问题。读完你能理解的不只是 Uniswap,而是整个 AMM 类 DEX 的设计哲学。


一、为什么需要 DEX?

1.1 订单簿 vs AMM

传统交易所(币安、Coinbase)用的是订单簿模型:买方和卖方分别挂单,系统撮合成交。这个模型在链上跑有两个致命问题:

  1. Gas 成本高:每次挂单、撤单都要支付 Gas,做市商频繁操作成本巨大
  2. 流动性分散:每个交易对都需要独立的订单簿,做市商不可能覆盖所有交易对

AMM 的解法非常优雅:用一个数学公式替代订单簿。

订单簿 vs AMM

AMM 不依赖做市商,而是让任何人(流动性提供者,LP)把一对代币存入池子,池子根据内部代币比例自动算出价格。交易者直接和池子交互,手续费分给 LP。

1.2 核心优势

维度 订单簿 DEX AMM DEX
做市门槛 高(需专业做市算法) 极低(存钱即可)
Gas 效率 差(每次挂单上链) 好(只有 swap 上链)
长尾资产覆盖 差(无人做市) 好(有人存钱就有流动性)
价格精度 高(tick 粒度) 中(取决于池子深度)

二、AMM 数学基础

2.1 恒定乘积公式

Uniswap 的灵魂是一个极其简单的公式:

$$
x \times y = k
$$

其中 $x$ 是池子中代币 A 的数量,$y$ 是代币 B 的数量,$k$ 是常数。

价格怎么来的?

池中代币 A 的价格(以 B 计价)= $y / x$。如果有人买入 A(用 B 支付),$x$ 减少、$y$ 增加,$x \times y$ 保持不变,价格自动上涨。

数值例子:

1
2
3
4
5
6
7
8
9
初始状态: 池中有 100 ETH + 200,000 USDC
k = 100 * 200,000 = 20,000,000
ETH 价格 = 200,000 / 100 = 2,000 USDC/ETH

有人用 2,000 USDC 买 ETH → 池中增加 2,000 USDC
新USDC = 202,000
新ETH = 20,000,000 / 202,000 ≈ 99.01
用户获得: 100 - 99.01 = 0.99 ETH
实际成交价: 2,000 / 0.99 ≈ 2,020 USDC/ETH

实际获得比理论价格少(2,020 vs 2,000),这个差价就是滑点

2.2 费用与滑点

Uniswap 对每笔交易收取费用(默认 0.3%),费用留在池子里,等价于 $k$ 值变大了——LP 的资产自动增值。

考虑费用的输出公式(Uniswap v2 实现):

1
2
3
4
5
6
7
8
9
// amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997)
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut)
public pure returns (uint amountOut)
{
uint amountInWithFee = amountIn * 997;
uint numerator = amountInWithFee * reserveOut;
uint denominator = reserveIn * 1000 + amountInWithFee;
amountOut = numerator / denominator;
}

997/1000 = 扣除 0.3% 费用后的比例。这个数字在 v3 后变成了可配置的(1%、0.3%、0.05%、0.01%)。

2.3 无常损失(Impermanent Loss)

无常损失是 AMM LP 最大的风险来源——甚至比合约被黑的风险更值得关注。它的本质是:当你的两种资产价格之比发生变动时,你在池子里的资产价值不如你单纯持有的资产价值。

$$
\text{IL} = \frac{2\sqrt{r}}{1+r} - 1
$$

其中 $r$ = 新价格 / 旧价格。

价格变化倍数 (r) 无常损失
1.0 0%
1.25 -0.6%
1.5 -2.0%
2.0 -5.7%
3.0 -13.4%
5.0 -25.5%
10.0 -42.5%

几个关键认知:

  • 损失是对称的:涨 5 倍和跌 80% 的无常损失是一样的(都是 r=5 或 r=0.2)
  • 手续费能对冲:只要你的手续费收入 > 无常损失,LP 就是赚钱的
  • 稳定币对几乎零无常损失:USDC/DAI 的 r 接近 1,所以 Curve 上这类池子最受欢迎

[!note] 为什么叫”无常”而不是”永久”?
因为只要你不撤出流动性、价格回到你入场的水平,这笔损失会消失(0%)。但如果你在价格偏离时撤了流动性,损失就变成永久的了。


三、Uniswap 版本演进

logo

官网: uniswap.org | GitHub: Uniswap/v4-core

3.1 v1 (2018) — 概念验证

v1 很简单:只支持 ERC20 ↔ ETH 交易,所有 ERC20 交易必须经过 ETH 中转。

1
代币A → ETH → 代币B
  • 恒定乘积公式 $x \times y = k$
  • 固定 0.3% 费率
  • 没有预言机
  • 需要 WETH 中转

v1 证明了一件事:AMM 这条路走得通。

3.2 v2 (2020) — 成为基础设施

v2 引入了三个关键升级,这些升级直接铺平了 DeFi summer 的道路:

① 任意 ERC20/ERC20 交易对

不再强制经过 ETH。任何两个 ERC20 代币都可以直接建池。

② 价格预言机(TWAP)

v2 在每次 swap 时累积价格,让外部合约可以查询时间加权平均价格(TWAP)

1
2
3
4
5
6
7
8
9
10
11
12
// v2 的核心累积逻辑(简化)
function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
uint32 timeElapsed = blockTimestamp - blockTimestampLast;
if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {
// 累积价格 = 当前价格 * 时间差
price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;
price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;
}
reserve0 = uint112(balance0);
reserve1 = uint112(balance1);
blockTimestampLast = blockTimestamp;
}

为什么需要 TWAP?因为瞬时价格可以被大额交易瞬时操纵。如果你想通过操纵预言机价格来触发清算——在订单簿交易所很容易做到。但 TWAP 要求你维持操纵价格至少一个时间窗口(通常 30 分钟),成本指数级上升。

③ 闪电交换(Flash Swap)

允许你在同一笔交易内先拿到代币,用完再还。这为闪电贷提供了基础设施。

3.3 v3 (2021) — 集中流动性

如果说 v2 是 AMV(自动小巴),v3 就是 F1 赛车。核心创新:集中流动性(Concentrated Liquidity)

之前的问题:

v2 的流动性均匀分布在 $0 \to \infty$ 的全价格区间,但大部分交易集中在当前价格附近。也就是说,v2 池子里 90% 的流动性是闲置的。

v3 的解法:

LP 可以指定一个价格区间(如 1900-2100 USDC/ETH),只在这个区间内提供流动性。价格跑出区间后,你的流动性自动”休眠”。

v2 vs v3 流动性

这意味着什么?资本效率可以提升最高 4000 倍。 同样的资金量,v3 提供的手续费收入可以比 v2 高出几个数量级——前提是你选对了价格区间。

v3 的核心数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 流动性头寸由 NFT 代表(不是 ERC20)
struct Position {
uint128 liquidity;
uint256 feeGrowthInside0LastX128; // 进入时累积的费用快照
uint256 feeGrowthInside1LastX128;
uint128 tokensOwed0; // 待领取的费用
uint128 tokensOwed1;
}

// Tick = 价格的最小步长
// price = 1.0001^tick
// 不同费率等级的 tick 间距不同
// 0.01% → tickSpacing 1
// 0.05% → tickSpacing 10
// 0.30% → tickSpacing 60
// 1.00% → tickSpacing 200

v3 的费用等级也变多了(0.01%、0.05%、0.30%、1.00%)。逻辑是:波动越大的交易对,无常损失风险越高,费率应该越贵——让 LP 在更多风险中获得更多补偿。

我个人的经验:v3 做 LP 需要比 v2 更主动管理价格区间。如果没时间盯盘,不如把钱放 v2 或 Curve 上省心。

3.4 v4 (2025) — 可编程流动性

v4 做了一件在 DEX 历史上具有”范式转换”意义的事:引入了 Hook 系统。

Hook 是什么?

Hook 是在流动性池的关键生命周期节点注入的自定义逻辑:

1
2
3
4
5
6
7
8
9
10
interface IHooks {
function beforeInitialize(address sender, PoolKey calldata key) external returns (bytes4);
function afterInitialize(address sender, PoolKey calldata key, uint160 sqrtPriceX96) external returns (bytes4);
function beforeSwap(address sender, PoolKey calldata key, bool zeroForOne, int256 amountSpecified) external returns (bytes4);
function afterSwap(address sender, PoolKey calldata key, bool zeroForOne, int256 amountSpecified) external returns (bytes4);
function beforeModifyPosition(address sender, PoolKey calldata key) external returns (bytes4);
function afterModifyPosition(address sender, PoolKey calldata key) external returns (bytes4);
function beforeDonate(address sender, PoolKey calldata key) external returns (bytes4);
function afterDonate(address sender, PoolKey calldata key) external returns (bytes4);
}

这意味着池子的行为可以被完全定制。举几个例子:

  • TWAP 订单:在 beforeSwap 里检查是否满足时间加权价格条件
  • 动态费率:在 beforeSwap 里根据当前波动率调整费率
  • MEV 保护:在 afterSwap 里检测是否有三明治攻击
  • 限价订单:在 beforeSwap 里检查价格,不满足则回滚

v4 另一个重要升级:单例合约(Singleton)

v2/v3 里每个交易对是一个独立的合约。这导致跨池交易(如 ETH → USDC → DAI → LINK)要经过多个合约调用,Gas 成本高。v4 把所有池子放在一个合约里管理,路由在一笔交易内完成,Gas 大幅降低。

特性 v2 v3 v4
池子模式 独立合约 独立合约 单例合约
流动性分布 全区间 集中区间 集中区间 + Hook 定制
费率 固定 0.3% 4 档可选 动态可编程
可扩展性 有限 Hook 系统
原生 ETH 不支持 不支持 支持
Gas 中等 较高 低(单例路由)

四、AMM 的设计取舍

4.1 滑点 vs 资本效率

策略 滑点 资本效率 无常损失风险
全区间 (v2)
窄区间 (v3) 极高
稳定币池 (Curve) 极低 极低

这本质上是不可能三角:滑点、资本效率、无常损失——三条里你只能选两条。

4.2 v3 LP 策略建议

给想做 v3 LP 的人几个经验之谈:

  1. 窄区间不是越窄越好:区间太窄意味着价格频繁跑出区间,你的流动性会反复”休眠”,每次调整都要花 Gas
  2. 稳定币对用宽区间:USDC/DAI 价格几乎不变,把区间设宽一点(如 ±10%),省去频繁调整
  3. 波动大的资产用更宽的区间 + 更高费率层级:比如 ETH/MEME 币对,选 1.00% 费率 + 较宽区间
  4. 关注费用复投:v3 的费用不会自动复投,不手动领取和再存入等于浪费复利

4.3 除了 Uniswap 还值得关注的 DEX

  • Curve:稳定币互换王者,StableSwap 算法在同类资产交易中滑点远低于恒定乘积。veCRV 代币经济模型也值得单写一篇
  • PancakeSwap:BSC 上的 Uniswap v2 分叉 + 改进,低 Gas 环境下的小额 swap 体验不错
  • Trader Joe:Avalanche 上最有创新性的 DEX,Liquidity Book 模型是集中流动性的另一种形态
  • CoWSwap / UniswapX:意图架构(intent-based),把路由和 MEV 保护放到链下求解器,用户只需签名意图

五、安全考量

5.1 三明治攻击(Sandwich Attack)

AMM 最经典的 MEV 攻击。攻击者在你的交易前后插入两笔交易:

1
2
3
1. 攻击者先买(推高价格)
2. 你的交易执行(吃高价)
3. 攻击者卖出(赚差价)

防御手段:设置滑点容忍度(slippage tolerance),通常设为 0.1%-0.5%。你的容忍度越低,攻击者能赚的就越少。

5.2 价格预言机操纵

如果协议使用 Uniswap v2 的瞬时价格做清算判断,攻击者可以通过一笔大额 swap 暂时扭曲价格,触发本不该发生的清算。

正确做法:使用 TWAP(至少 30 分钟窗口),配合 Chainlink 等多数据源交叉验证。

5.3 无常损失 = 真实损失

无常损失不是”纸面亏损”——如果你在价格偏离时撤出,它就是永久损失。v3 的 LP 尤其要注意:价格一旦跑出你的区间,你的头寸就变成了单边持仓(100% 是你更不值钱的那个代币)。


📚 参考资料

  1. Uniswap v4 白皮书
  2. Uniswap v3 白皮书 - 集中流动性的数学推导
  3. Uniswap v2 Core 源码
  4. Uniswap 官方文档
  5. Uniswap 市场分析
  6. Flash Boys 2.0: DEX 中的抢先交易 - MEV 经典论文
  7. SoK: DEX 与 AMM 协议综述
  8. StableSwap 论文 - Curve 的稳定币互换算法
  9. 以太坊 DeFi 页面
  10. DEX 交易量仪表板

本文撰写于 2026 年 5 月。Uniswap v4 仍在持续迭代中,部分 Hook 用例可能随版本变化。