AMM 原理
AMM 原理
本页内容正在整理中,欢迎贡献。
概述
自动做市商(Automated Market Maker,AMM)是去中心化交易所(DEX)的核心机制,通过数学公式而非订单簿来确定资产价格。Uniswap 的 AMM 模型已成为 DeFi 的基础原语。
主要内容
恒定乘积公式(x × y = k)
Uniswap V2 使用最简单的 AMM 模型:
设流动性池中有两种资产 X 和 Y: x = X 代币数量 y = Y 代币数量 k = 常数(流动性)
任意交易后,x × y = k 始终成立
买入 Δx 数量的 X 代币: 新的 y' = k / (x - Δx) 需要支付的 Y = y' - y = k/(x - Δx) - y// Uniswap V2 核心交换公式(简化)function getAmountOut( uint amountIn, uint reserveIn, uint reserveOut) public pure returns (uint amountOut) { uint amountInWithFee = amountIn * 997; // 0.3% 手续费 uint numerator = amountInWithFee * reserveOut; uint denominator = reserveIn * 1000 + amountInWithFee; amountOut = numerator / denominator;}流动性提供
流动性提供者(LP)向池中注入两种资产,获得 LP Token 作为凭证:
添加流动性: 存入 1 ETH + 2000 USDC(当前价格 $2000/ETH) 获得 LP Token(代表池中份额)
手续费收益: 每笔交易收取 0.3% 手续费,分配给所有 LP LP Token 可随时燃烧,赎回对应份额的资产 + 累积手续费无常损失(Impermanent Loss)
LP 面临的主要风险:当池中资产相对价格变化时,LP 持有 LP Token 的价值低于单纯持有两种资产:
示例: 初始:存入 1 ETH($2000)+ 2000 USDC,总价值 $4000 ETH 价格翻倍至 $4000 后: 套利者会买入 ETH 直到池中价格恢复平衡 此时 LP 持有:0.707 ETH($2828)+ 2828 USDC = $5656 单纯持有:1 ETH($4000)+ 2000 USDC = $6000 无常损失 = ($6000 - $5656) / $6000 ≈ 5.7%无常损失公式:
IL = 2 × √p / (1 + p) - 1其中 p = 价格变化比率(新价格 / 初始价格)
p = 2(价格翻倍)→ IL ≈ -5.7%p = 4(价格 4 倍)→ IL ≈ -20%p = 0.5(价格减半)→ IL ≈ -5.7%Uniswap V3:集中流动性
V3 允许 LP 将流动性集中在特定价格区间:
// Uniswap V3 添加流动性INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({ token0: WETH, token1: USDC, fee: 3000, // 0.3% tickLower: -887272, // 价格下限 tickUpper: 887272, // 价格上限 amount0Desired: 1 ether, amount1Desired: 2000e6, amount0Min: 0, amount1Min: 0, recipient: msg.sender, deadline: block.timestamp + 15 minutes});
(uint256 tokenId, , , ) = nonfungiblePositionManager.mint(params);V3 vs V2 对比:
| 特性 | Uniswap V2 | Uniswap V3 |
|---|---|---|
| 流动性分布 | 全价格区间均匀 | 集中在指定区间 |
| 资本效率 | 低 | 高(最高 4000x) |
| 无常损失 | 中 | 更高(区间外时更剧烈) |
| LP 管理复杂度 | 低 | 高 |
价格影响(Price Impact)与滑点
交易规模与价格影响: 大额交易 → 池中价格显著偏移 → 高价格影响
滑点保护: 设置最大可接受价格偏差,超过则 revert
function swap( uint amountIn, uint amountOutMin, // 最小接收量(滑点保护) address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)