Uniswap V2 核心问题解答

Uniswap V2 核心问题解答

Uniswap V2 核心问题解答

以下内容基于 Uniswap V2 机制整理,涵盖 AMM 原理、滑点、三明治攻击、流动性提供、无常损失等核心概念。


1. 什么是 AMM?它和订单簿模式有什么区别?

AMM(自动做市商)

AMM(Automated Market Maker)是一种通过数学公式(算法)自动确定价格、无需人工报价的去中心化交易机制。

用户在 Uniswap 等 AMM 协议中交易时,价格由流动性池(Liquidity Pool)中的资产比例根据预设公式自动计算,用户与合约本身进行交易,而不是与另一个对手方撮合。

核心对比:AMM vs 订单簿模式

维度AMM(Uniswap)订单簿模式(CEX / DEX)
定价方式池内资产比例自动计算(算法驱动)买卖盘挂单手动撮合
对手方流动性池(LP),无需主动对手方必须有另一方挂单接单
价格发现由池内资产比例决定,有滑点盘口深度决定,更精准
流动性来源任何人存入资产成为 LP做市商或专业做市机构
交易体验随时可交易(哪怕池子小)需等待撮合,大额可能无法成交
适合场景小额现货交换、新资产发行大额交易、限价挂单

简单理解:AMM = “菜市场自动称重定价机”,你放入多少菜、机器自动按比例算出价格;订单簿 = 你和摊贩讨价还价挂牌交易。


2. AMM 的核心算法是什么?

Uniswap V2 使用恒定乘积做市商公式(Constant Product Market Maker, CPMM)

x × y = k
  • x= 池中 Token A 的数量
  • y= 池中 Token B 的数量
  • k= 恒定乘积(交易前后不变)

交易机制推导

假设池中有x单位 Token A 和y单位 Token B,用户用Δx数量的 A 换取 B:

(x + Δx) × (y - Δy) = k = x × y

整理得:

Δy = y - (x × y) / (x + Δx) = (y × Δx) / (x + Δx)

特性

特性说明
无边界的流动性池永远不会枯竭——价格曲线是双曲线,趋向无穷但不相交
价格与深度相关交易量越大,x相对于池总量越小,价格滑点越高
无常损失的根源池内资产比例变化时,LP 的实际持仓与单纯持有相比产生差异(见第 6 节)

图示(价格曲线)

价格 ↑ │╲ │ ╲ k 值越大,曲线越平缓(大池滑点小) │ ╲ │ ╲ │ ╲ └────────────→ 池中 Token A 比例

3. 什么是滑点?用户交易时如何避免滑点过高?

滑点(Slippage)

滑点是指用户期望成交价格与实际成交价格之间的差异

在 AMM 中,滑点的产生原因是:x × y = k公式下,每一笔交易都会改变池内资产比例,从而改变后续交易的成交价格。

  • 交易量越大 → 池子相对越浅 → 滑点越高
  • 池子越小 → 同样的交易量滑点越大

滑点公式

对于一笔用Δx换取Δy的交易:

滑点比例 = (预期价格 - 实际价格) / 预期价格 实际价格 = Δy / Δx 市场边际价格 = y / x

如何避免滑点过高?

1. 设置滑点容忍度(Slippage Tolerance)

  • 在 Uniswap 界面手动设置滑点上限(默认 0.5%,可调低至 0.1%)
  • 若实际滑点超过设定值,交易自动回滚,不执行

2. 优先选择流动性深的大池

  • 同一交易对,优先选 TVL(总锁仓量)更高的池子
  • 如 ETH/USDC 大池远小于小交易对池

3. 拆分大单

  • 将一笔大额交易拆成多笔小交易,减少单笔滑点
  • 注意:每笔仍有少量滑点,且后几笔可能价格更差

4. 关注 Gas 费用时机

  • 网络拥堵时 Gas 费高,滑点+矿工费双重损耗
  • 低 Gas 时段交易整体更划算

5. 使用 MEV 保护工具

  • 如 Flashbots Protect,将交易通过私密 RPC 提交,减少被三明治攻击的风险(见第 4 节)

4. 什么是三明治攻击?如何降低被三明治攻击的风险?

三明治攻击(Sandwich Attack)

三明治攻击是一种利用交易顺序操控价格的 MEV(矿工可提取价值)攻击,攻击者将受害者的交易夹在两笔自己提交的交易中间。

攻击步骤
步骤 1:攻击者发现受害者提交了一笔 AMM 交易(如用 ETH 买 ABC) ↓ 步骤 2:攻击者先于受害者交易——用 ABC 买 ETH(推高 ABC 价格) ↓ 步骤 3:受害者的交易在更高价格成交(买入被"夹高") ↓ 步骤 4:攻击者立即卖出 ABC(套利,价格已对自己有利)
关键点
  • 攻击者利用受害者的滑点设置来预测价格走向
  • 如果受害者设置了足够高的滑点容忍度,攻击者就能确保自己有利可图
  • 受害者支付的成交价格 > 正常市场价值,差额被攻击者获取

如何降低被三明治攻击的风险?

1. 设置较低的滑点容忍度

  • 滑点设得越低,攻击者利润空间越小
  • 建议:普通交易设 0.5% 以内,高波动资产不超过 1%

2. 开启 MEV 保护

  • 使用 Flashbots Protect、OpenMEV 等工具
  • 私密 RPC 将交易直接提交给验证者,跳过公共 mempool

3. 使用大池交易

  • 流动性好的大池滑点小,三明治攻击利润空间有限

4. 批量交易时分散滑点设置

  • 如果必须分批交易,不要每笔都用相同的滑点

5. 避免在 mempool 暴露大单

  • 大额交易尤其容易被机器人监控和狙击
  • 考虑使用 TWAP(时间加权平均价格)订单或私有交易通道

5. LP 的作用是什么?

LP(Liquidity Provider)= 流动性提供者

LP 是指将自有资产存入 Uniswap 流动性池,为交易者提供可交易深度的用户或机构。

LP 的核心作用

LP 存入:Token A(如 ETH)+ Token B(如 USDC) ↓ 成为交易对手方:所有交易都与 LP 的资金池成交 ↓ 收取手续费:每笔交易 LP 按份额比例获得 0.3% 的手续费收益

具体职责与收益

职责说明
提供流动性让交易随时可发生,无需等待对手方
承担交易风险池中资产比例随交易变化,LP 被动承受
确定交易对价格通过资产比例间接影响价格(但非主动定价)
获得手续费收入按份额比例分配池内产生的 0.3% 交易手续费

Uniswap V2 手续费分配(0.3% / 笔)

每笔交易手续费 = 0.3% 手续费全部归 LP 按份额分配 项目方不抽成(V2 版本),V3 引入了协议手续费(可切换)

成为 LP 的基本流程

  1. 准备两种等值的资产(如 ETH + USDC)
  2. 存入 Uniswap V2 对应的流动性池
  3. 获得 LP Token(代表你在池中的份额)
  4. LP Token 可随时赎回,换回本金 + 累计手续费

⚠️注意:LP 不是稳赚不赔的——无常损失(见第 6 节)可能导致本金缩水,手续费收益需要能覆盖无常损失才算盈利。


6. 什么是无常损失?如何计算?

无常损失(Impermanent Loss, IL)

无常损失是指 LP 将资产存入 AMM 池后,若资产价格发生变化,其池内持仓价值低于不做任何操作、单纯持有原资产的价值差异。

之所以叫"无常"(impermanent),是因为如果价格回归,损失会消失——但实际中价格往往不回原位,因此损失经常是实际且永久的

无常损失的计算

设初始存入时两种资产价值相等:

初始状态: - 价格比率:P₀ = Token A / Token B 的初始价格 - 存入:x₀ 单位 Token A + 等值 y₀ 单位 Token B - x₀ × y₀ = k(恒定乘积) 存入时的总价值(以 Token B 计价): V₀ = x₀ × P₀ + y₀

经过价格变化,新价格比率变为P₁

池内重新平衡后(x × y = k 仍成立): x₁ = √(k × P₁) (Token A 数量) y₁ = √(k / P₁) (Token B 数量) 池内持仓价值: V_pool = x₁ × P₁ + y₁ 对比:如果什么都不做,单纯持有初始资产: V_hold = x₀ × P₁ + y₀

无常损失

无常损失 = V_hold - V_pool 无常损失比例 = (V_hold - V_pool) / V_hold

简化公式

当两种资产初始价值相等,价格变化倍数为r = P₁ / P₀时:

无常损失比例 = 2√r / (1 + r) - 1
价格变化倍数 r无常损失比例
1.0x(不变)0.00%
1.25x-0.60%
1.50x-2.02%
2.00x-5.72%
3.00x-13.40%
5.00x-25.47%
10.00x-42.45%

无常损失的直观理解

假设初始存入:1 ETH + 1000 USDC(ETH = $1000) 情况 A:ETH 涨到 $2000 池内自动变成:0.707 ETH + 1414 USDC 池价值 = $1414 + $1414 = $2828 持有不动:$2000 + $1000 = $3000 无常损失 = $3000 - $2828 = $172(约 -5.7%) 情况 B:ETH 跌到 $500 池内自动变成:1.414 ETH + 707 USDC 池价值 = $707 + $707 = $1414 持有不动:$500 + $1000 = $1500 无常损失 = $1500 - $1414 = $86(约 -5.7%)

如何降低无常损失的影响?

方法说明
存入稳定币交易对如 USDC/USDT,汇率波动极小,几乎无无常损失
存入相关性高的资产对如 ETH/stETH,波动同步,IL 较小
选择无常损失保护的产品如 Balancer 变体池、Uni V3 集中流动性(部分区间)
长期持有视角手续费收益需超过无常损失才值得做 LP
使用 DeFi 收益聚合器自动寻找手续费 APY 最高、IL 最低的策略

附录:核心概念速查表

术语英文一句话定义
AMMAutomated Market Maker用算法自动定价的去中心化交易协议
LPLiquidity Provider为 AMM 池提供流动性的用户
滑点Slippage成交价与预期价的偏差
三明治攻击Sandwich Attack用抢先+滞后交易夹击受害者的 MEV 攻击
无常损失Impermanent LossLP 持仓价值低于单纯持有的差额
恒定乘积公式x × y = kUniswap V2 的核心定价算法
TVLTotal Value Locked池中锁定的总资产价值
MEVMiner Extractable Value矿工/验证者可提取的最大价值

—@TOC

欢迎使用Markdown编辑器

你好! 这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown将代码片显示选择的高亮样式进行展示;
  3. 增加了图片拖拽功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的KaTeX数学公式语法;
  5. 增加了支持甘特图的mermaid语法1功能;
  6. 增加了多屏幕编辑Markdown文章功能;
  7. 增加了焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了检查列表功能。

功能快捷键

撤销:Ctrl/Command+Z
重做:Ctrl/Command+Y
加粗:Ctrl/Command+B
斜体:Ctrl/Command+I
标题:Ctrl/Command+Shift+H
无序列表:Ctrl/Command+Shift+U
有序列表:Ctrl/Command+Shift+O
检查列表:Ctrl/Command+Shift+C
插入代码:Ctrl/Command+Shift+K
插入链接:Ctrl/Command+Shift+L
插入图片:Ctrl/Command+Shift+G
查找:Ctrl/Command+F
替换:Ctrl/Command+G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本强调文本

加粗文本加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210运算结果是 1024.

插入链接与图片

链接: link.

图片:

带尺寸的图片:

居中的图片:

居中并且带尺寸的图片:

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的代码片.

// An highlighted blockvarfoo='bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants 是一个文本转换工具,主要功能是将普通的 ASCII 标点符号自动转换为更美观的印刷体标点符号。例如:

原始符号转换后说明
"引号"“引号”直引号变弯引号
'单引号'‘单引号’直单引号变弯单引号
--两个连字符变短破折号
---三个连字符变长破折号
...三个点变省略号

创建一个自定义列表

Markdown
Text-to-HTMLconversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n1)!nN是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.Γ(z)=0tz1etdt.

你可以找到更多关于的信息LaTeX数学表达式here.

新的甘特图功能,丰富你的文章

2014-01-072014-01-092014-01-112014-01-132014-01-152014-01-172014-01-192014-01-21已完成进行中计划一计划二现有任务Adding GANTT diagram functionality to mermaid
  • 关于甘特图语法,参考 这儿,

UML图表

可以使用UML图表进行渲染,例如下面产生的一个序列图:

王五李四张三王五李四张三李四想了很长时间, 文字太长了不适合放在一行.你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!打量着王五...很好... 王五, 你怎么样?
  • 关于UML图表语法,参考 这儿,

流程图

链接

长方形

圆角长方形

菱形

  • 关于Mermaid语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart.js的流程图语法:

Created with Raphaël 2.3.0开始我的操作确认?结束yesno
  • 关于Flowchart流程图语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到文章导出,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎