Uniswap V2 —— 概述

Uniswap V2 是以太坊上最具影响力的去中心化交易所(DEX),开创了 AMM(自动做市商)模式的先河,成为 DeFi 基础设施的重要组成部分。

1. Uniswap V2 简介

1.1 什么是 Uniswap

Uniswap 是一个运行在以太坊上的去中心化交易协议,允许用户在无需中心化中介的情况下交换 ERC-20 代币。与传统订单簿交易所不同,Uniswap 使用**自动做市商(AMM)**机制,通过智能合约和流动性池实现代币交换。

1.2 V2 的改进

相比 V1,Uniswap V2 带来了多项重要改进:

特性 V1 V2
交易对 仅支持 ETH/ERC-20 支持任意 ERC-20/ERC-20
价格预言机 内置 TWAP 预言机
闪电贷 不支持 支持 Flash Swap
协议费用 可开启 0.05% 协议费

2. 核心概念

2.1 自动做市商(AMM)

传统交易所依赖订单簿撮合买卖双方,而 AMM 使用数学公式自动计算价格。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
┌─────────────────────────────────────────────────────────┐
│ 传统订单簿交易所 │
│ │
│ 买方 ──────────► 订单簿 ◄─────────── 卖方 │
│ │ │
│ 撮合引擎 │
│ │ │
│ 成交 │
└─────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────┐
│ Uniswap AMM │
│ │
│ 用户 ──────────► 流动性池 ◄─────────── LP │
│ │ │
│ x × y = k 公式 │
│ │ │
│ 自动定价 │
└─────────────────────────────────────────────────────────┘

2.2 恒定乘积公式

Uniswap V2 的核心是恒定乘积公式

1
x × y = k
  • x:池中 Token A 的数量
  • y:池中 Token B 的数量
  • k:常数(在没有添加/移除流动性时保持不变)

价格计算示例

假设池中有 10 ETH 和 20,000 USDC:

1
2
3
4
5
6
7
初始状态:
x = 10 ETH
y = 20,000 USDC
k = 10 × 20,000 = 200,000

当前价格:
1 ETH = 20,000 / 10 = 2,000 USDC

用户用 1 ETH 换 USDC:

1
2
3
4
5
6
7
8
9
交易后(忽略手续费):
x' = 11 ETH
y' = k / x' = 200,000 / 11 ≈ 18,182 USDC

用户获得:
20,000 - 18,182 = 1,818 USDC

新价格:
1 ETH = 18,182 / 11 ≈ 1,653 USDC

关键特性:交易量越大,滑点越大(价格偏离越多)。

2.3 流动性池原理

流动性池是存放两种代币的智能合约,任何人都可以成为流动性提供者(LP)

1
2
3
4
5
6
7
8
9
10
11
┌─────────────────────────────────────────┐
│ ETH/USDC 流动性池 │
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ ETH │ │ USDC │ │
│ │ 100 │ │ 200,000 │ │
│ └─────────┘ └─────────┘ │
│ │
│ LP 存入 → 获得 LP Token │
│ LP 取出 → 销毁 LP Token + 手续费收益 │
└─────────────────────────────────────────┘

3. 架构概览

3.1 合约层级

Uniswap V2 分为 CorePeriphery 两层:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────┐
│ 用户 │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ Periphery 层 │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │ UniswapV2Router │ │ UniswapV2Library│ │
│ │ 用户交互接口 │ │ 辅助计算 │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────┐
│ Core 层 │
│ ┌─────────────────┐ ┌─────────────────┐ │
│ │UniswapV2Factory │───►│ UniswapV2Pair │ │
│ │ 创建交易对 │ │ AMM 核心逻辑 │ │
│ └─────────────────┘ └─────────────────┘ │
└─────────────────────────────────────────────────────────┘

3.2 各合约职责

合约 层级 职责
UniswapV2Factory Core 创建和管理所有交易对
UniswapV2Pair Core 单个交易对的 AMM 逻辑
UniswapV2ERC20 Core LP Token 标准实现
UniswapV2Router Periphery 用户友好的交互接口
UniswapV2Library Periphery 价格和数量计算

4. 核心功能

4.1 添加流动性

LP 按当前比例存入两种代币,获得 LP Token 作为凭证:

1
2
3
4
5
6
7
8
9
10
存入前:
池子:100 ETH + 200,000 USDC
比例:1 ETH : 2,000 USDC

Alice 存入:
1 ETH + 2,000 USDC(必须按比例)

存入后:
池子:101 ETH + 202,000 USDC
Alice 获得:约 1% 的 LP Token

4.2 移除流动性

LP 销毁 LP Token,按比例取回代币 + 累积的手续费:

1
2
3
4
5
6
Alice 持有 1% LP Token
当前池子:110 ETH + 220,000 USDC

Alice 取出:
销毁 LP Token
获得:1.1 ETH + 2,200 USDC

4.3 代币交换

用户通过 Router 进行交换,支持多跳路径:

1
2
3
4
5
6
直接交换:
ETH → USDC(单跳)

多跳交换:
LINK → ETH → USDC(两跳)
当 LINK/USDC 池不存在或流动性不足时使用

4.4 闪电贷(Flash Swap)

无需抵押,在单笔交易中借出代币,只要在交易结束前归还即可:

1
2
3
4
5
// 闪电贷流程
1. 从池中借出代币
2. 执行任意操作(套利、清算等)
3. 归还代币 + 0.3% 手续费
4. 如果未归还,整笔交易回滚

5. LP Token 与手续费

5.1 LP Token 机制

LP Token 代表流动性份额,其数量计算方式:

首次添加流动性

1
liquidity = sqrt(amount0 × amount1) - MINIMUM_LIQUIDITY

后续添加流动性

1
2
3
4
liquidity = min(
amount0 × totalSupply / reserve0,
amount1 × totalSupply / reserve1
)

5.2 手续费分配

每笔交换收取 0.3% 手续费:

1
2
3
手续费分配:
├── 0.25% → LP(自动累积到池中)
└── 0.05% → 协议(可选,默认关闭)

手续费不直接发放,而是累积在池中,LP 的份额价值自动增长。

6. 价格预言机(TWAP)

6.1 什么是 TWAP

**TWAP(Time-Weighted Average Price)**是时间加权平均价格,用于提供抗操纵的价格数据。

6.2 实现原理

Uniswap V2 在每个区块首次交易时记录累积价格:

1
2
price0CumulativeLast += reserve1 / reserve0 × timeElapsed
price1CumulativeLast += reserve0 / reserve1 × timeElapsed

计算 TWAP:

1
TWAP = (priceCumulativeEnd - priceCumulativeStart) / timeElapsed

6.3 使用场景

  • 借贷协议的抵押品估值
  • 合成资产定价
  • 清算触发条件

7. 安全考虑

7.1 滑点保护

交易时设置 amountOutMin 防止价格剧烈波动:

1
2
3
4
5
6
7
swapExactTokensForTokens(
amountIn,
amountOutMin, // 最少获得数量
path,
to,
deadline // 交易截止时间
)

7.2 重入攻击防护

Pair 合约使用 lock 修饰器防止重入:

1
2
3
4
5
6
7
uint private unlocked = 1;
modifier lock() {
require(unlocked == 1, 'LOCKED');
unlocked = 0;
_;
unlocked = 1;
}

7.3 最小流动性

首次添加流动性时,锁定 MINIMUM_LIQUIDITY(1000 wei)防止池被完全抽空。

8. 总结

Uniswap V2 的核心创新:

特性 说明
AMM 模式 无需订单簿,算法自动定价
无许可 任何人可创建交易对、提供流动性
ERC-20 对 支持任意代币对交易
TWAP 预言机 提供抗操纵的链上价格
Flash Swap 无抵押闪电贷

V2 的局限性:

  • 流动性分散在整个价格范围,资本效率低
  • 无法自定义费率
  • LP 面临无常损失

这些问题在 Uniswap V3 中通过集中流动性得到解决。