返回知识库
Day 19

MEV与三明治攻击:区块链黑暗森林的生存法则

深入理解MEV概念、三明治攻击原理、抢跑机器人运作方式、Flashbots保护机制与用户防护策略

2025-01-28
MEV三明治攻击FlashbotsDeFi安全Week3

Day 19: MEV 三明治攻击

本周学习路径

Week 3: Layer2与跨链
├── Day 15: L2原理(Rollup/Optimistic/ZK) ✅
├── Day 16: 主流L2对比 ✅
├── Day 17: 跨链桥原理与风险 ✅
├── Day 18: 预言机 Chainlink ✅
├── Day 19: MEV 三明治攻击 ✅ ← 今天
├── Day 20: 安全基础-攻击类型
└── Day 21: 多链Portfolio开发

核心概念

什么是 MEV(最大可提取价值)?

> 类比理解:想象你在排队买演唱会门票,突然有人贿赂保安插队到你前面,把票买走后高价卖给你。在区块链上,矿工/验证者就像保安,可以决定交易的顺序,MEV就是他们通过调整顺序能获得的额外利润。

MEV 的演变
═══════════════════════════════════════════════════════════

原名:Miner Extractable Value(矿工可提取价值)
现名:Maximal Extractable Value(最大可提取价值)

为什么改名?
├── PoW 时代:矿工控制区块内容
├── PoS 时代:验证者控制区块内容
└── 本质相同:谁打包区块,谁就能重排交易

MEV 的来源:
┌─────────────────────────────────────────────────────────┐
│ 用户提交交易 → 进入 Mempool(公开等待池)              │
│                      ↓                                  │
│ 所有人都能看到待处理交易(包括套利者、攻击者)          │
│                      ↓                                  │
│ 矿工/验证者可以:                                       │
│   • 重新排序交易                                        │
│   • 插入自己的交易                                      │
│   • 审查某些交易                                        │
│                      ↓                                  │
│ 这些操作产生的利润 = MEV                               │
└─────────────────────────────────────────────────────────┘
═══════════════════════════════════════════════════════════

MEV 的规模有多大?

MEV 市场数据(截至2024年)
═══════════════════════════════════════════════════════════

累计提取的 MEV(以太坊主网):
├── 总量:超过 $6.8 亿美元
├── 日均:$1-5 百万美元
└── 最高单笔:数百万美元

主要 MEV 类型分布:
┌────────────────────────────────────────┐
│ 套利 (Arbitrage)          │ ~60%      │
│ 清算 (Liquidation)        │ ~25%      │
│ 三明治攻击 (Sandwich)     │ ~15%      │
└────────────────────────────────────────┘

谁在提取 MEV?
├── Searcher(搜索者):专门寻找 MEV 机会的机器人
├── Builder(区块构建者):组装区块的专业角色
└── Validator(验证者):最终打包区块的节点

数据来源: flashbots.net, mevboost.org
═══════════════════════════════════════════════════════════

三明治攻击详解

攻击原理

三明治攻击流程图
═══════════════════════════════════════════════════════════

场景:Alice 想用 1 ETH 买 PEPE 代币

正常情况(无攻击):
┌─────────────────────────────────────────────────────────┐
│ 1. Alice 提交交易:用 1 ETH 买 PEPE                     │
│ 2. Alice 设置 5% 滑点保护                              │
│ 3. 交易执行,Alice 获得 1000 PEPE                      │
└─────────────────────────────────────────────────────────┘

三明治攻击情况:
┌─────────────────────────────────────────────────────────┐
│ 1. Alice 提交交易(进入 mempool,公开可见)             │
│                                                         │
│ 2. 攻击者看到 Alice 的交易,立即:                      │
│    ┌─────────────────────────────────────────────────┐ │
│    │ 前跑交易(Front-run)                           │ │
│    │ 攻击者先买入大量 PEPE                           │ │
│    │ → PEPE 价格上涨                                 │ │
│    └─────────────────────────────────────────────────┘ │
│                         ↓                               │
│    ┌─────────────────────────────────────────────────┐ │
│    │ Alice 的交易执行                                │ │
│    │ 以更高价格买入,获得更少的 PEPE                 │ │
│    │ (但仍在滑点范围内,所以交易成功)              │ │
│    └─────────────────────────────────────────────────┘ │
│                         ↓                               │
│    ┌─────────────────────────────────────────────────┐ │
│    │ 后跑交易(Back-run)                            │ │
│    │ 攻击者卖出 PEPE                                 │ │
│    │ → 获利了结                                      │ │
│    └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘

攻击者利润 = Alice 多付的钱 - Gas 费用

为什么叫"三明治"?
Alice 的交易被夹在攻击者的两笔交易中间,像三明治的馅
═══════════════════════════════════════════════════════════

数值示例

具体数值演算
═══════════════════════════════════════════════════════════

初始状态:
├── ETH/PEPE 池子:100 ETH / 100,000 PEPE
├── 价格:1 ETH = 1000 PEPE
└── Alice 想用 1 ETH 买 PEPE,设置 5% 滑点

【无攻击情况】
Alice 买入后:
├── 获得约 990 PEPE(考虑 AMM 滑点)
└── 花费 1 ETH

【三明治攻击】
Step 1 - 攻击者前跑:用 10 ETH 买 PEPE
├── 获得约 9,090 PEPE
├── 池子变为:110 ETH / 90,910 PEPE
└── 新价格:1 ETH ≈ 826 PEPE(价格上涨约 17%)

Step 2 - Alice 交易执行:用 1 ETH 买 PEPE
├── Alice 获得约 820 PEPE(而非预期的 990)
├── 池子变为:111 ETH / 90,090 PEPE
└── Alice 多付了约 170 PEPE 的价值

Step 3 - 攻击者后跑:卖出 9,090 PEPE
├── 获得约 10.1 ETH
└── 攻击者利润:0.1 ETH(扣除 Gas)

结果:
├── Alice 损失:约 $170(假设 PEPE 价值)
├── 攻击者获利:约 $100(扣除 Gas 后)
└── 这就是为什么 Alice 总感觉 DEX 买到的比预期少
═══════════════════════════════════════════════════════════

其他 MEV 类型

1. 套利(Arbitrage)

DEX 套利示例
═══════════════════════════════════════════════════════════

场景:同一代币在不同 DEX 价格不同

Uniswap: 1 ETH = 2000 USDC
SushiSwap: 1 ETH = 2010 USDC

套利流程:
1. 在 Uniswap 用 2000 USDC 买 1 ETH
2. 在 SushiSwap 卖 1 ETH 得 2010 USDC
3. 利润:10 USDC(扣除 Gas)

特点:
├── 这是"良性" MEV,帮助市场价格趋于一致
├── 竞争激烈,利润薄
└── 需要极快的速度和复杂的算法
═══════════════════════════════════════════════════════════

2. 清算(Liquidation)

借贷协议清算
═══════════════════════════════════════════════════════════

场景:用户在 Aave 抵押 ETH 借出 USDC

初始状态:
├── 抵押:10 ETH(价值 $20,000)
├── 借出:12,000 USDC
└── 健康因子:1.25(安全)

ETH 价格下跌 20%:
├── 抵押品价值:$16,000
├── 健康因子:< 1(可被清算)
└── 清算奖励:5-10% 的抵押品

清算者(MEV Searcher):
1. 监控所有借贷仓位
2. 发现可清算仓位
3. 立即发起清算交易
4. 获得清算奖励

特点:
├── 对协议有益:防止坏账
├── 对用户有害:被清算损失大
└── 竞争极其激烈:毫秒级响应
═══════════════════════════════════════════════════════════

3. JIT 流动性(Just-In-Time Liquidity)

JIT 流动性攻击
═══════════════════════════════════════════════════════════

场景:大额 Swap 即将执行

1. Searcher 看到 mempool 中的大额 Swap
2. 在 Swap 前添加集中流动性
3. Swap 执行,Searcher 赚取手续费
4. Swap 后立即移除流动性

影响:
├── 挤占普通 LP 的收益
├── 对交易者没有直接伤害
└── 是否"攻击"有争议
═══════════════════════════════════════════════════════════

MEV 保护方案

Flashbots 生态系统

Flashbots 工作原理
═══════════════════════════════════════════════════════════

传统交易流程:
用户 → 公开 Mempool → 矿工打包 → 上链
         ↑
    所有人可见(包括攻击者)

Flashbots 流程:
用户 → Flashbots Protect → 私有通道 → Builder → 验证者
                ↑
         交易不公开,无法被前跑

核心组件:

1. Flashbots Protect(用户端)
   ├── 免费 RPC 端点
   ├── 交易不进入公开 mempool
   └── 防止三明治攻击

2. MEV-Boost(验证者端)
   ├── 验证者运行的软件
   ├── 从多个 Builder 获取最优区块
   └── 目前 90%+ 以太坊区块使用

3. Builder(区块构建者)
   ├── 专业组装区块
   ├── 包含 Searcher 的套利交易
   └── 与验证者分享 MEV 收益

生态参与者:
Searcher → Bundle → Builder → MEV-Boost → Validator
(搜索者)   (交易包)  (构建者)   (中继)      (验证者)
═══════════════════════════════════════════════════════════

如何使用 Flashbots Protect

用户操作指南
═══════════════════════════════════════════════════════════

方法1:添加 RPC 到 MetaMask

1. 打开 MetaMask → 设置 → 网络 → 添加网络
2. 填入以下信息:
   ┌─────────────────────────────────────────────────┐
   │ 网络名称: Flashbots Protect                     │
   │ RPC URL: https://rpc.flashbots.net             │
   │ Chain ID: 1                                     │
   │ 货币符号: ETH                                   │
   │ 区块浏览器: https://etherscan.io               │
   └─────────────────────────────────────────────────┘
3. 切换到该网络发送交易

方法2:使用支持的前端

支持 Flashbots 的 DEX:
├── CoW Swap(默认开启)
├── 1inch(可选开启)
├── Uniswap(通过设置)
└── Matcha / 0x

方法3:直接提交 Bundle(开发者)

// 使用 ethers.js + Flashbots
const flashbotsProvider = await FlashbotsBundleProvider.create(
  provider,
  authSigner,
  'https://relay.flashbots.net'
);

await flashbotsProvider.sendBundle([
  { signedTransaction: signedTx }
], targetBlockNumber);
═══════════════════════════════════════════════════════════

其他 MEV 保护方案

MEV 保护方案对比
═══════════════════════════════════════════════════════════

│ 方案              │ 原理                    │ 适用场景    │
├─────────────────────────────────────────────────────────────┤
│ Flashbots Protect │ 私有交易池              │ 所有交易    │
│ CoW Protocol      │ 批量拍卖+MEV返还        │ Swap        │
│ MEV Blocker       │ Searcher竞价返还用户    │ 所有交易    │
│ 私有 Mempool      │ 加密交易内容            │ 高价值交易  │
│ 限价单            │ 避免市价单滑点          │ Swap        │

推荐策略:
1. 小额交易:使用 Flashbots Protect RPC
2. 大额 Swap:使用 CoW Swap 或 1inch Fusion
3. 敏感交易:考虑私有 mempool 服务
4. 所有交易:降低滑点设置(但可能失败)
═══════════════════════════════════════════════════════════

链上实操:体验 MEV 保护

任务 1:添加 Flashbots RPC

实操步骤
═══════════════════════════════════════════════════════════

1. 打开 MetaMask
2. 点击网络选择器(顶部)
3. 添加网络 → 手动添加

填入:
├── 网络名称: Flashbots Protect
├── RPC URL: https://rpc.flashbots.net
├── Chain ID: 1
├── 符号: ETH
└── 浏览器: https://etherscan.io

4. 保存并切换到该网络
5. 之后的交易将通过 Flashbots 私有通道
═══════════════════════════════════════════════════════════

任务 2:使用 CoW Swap

CoW Swap 体验
═══════════════════════════════════════════════════════════

1. 访问 swap.cow.fi
2. 连接钱包
3. 选择交易对(如 ETH → USDC)
4. 注意观察:
   ├── "MEV Protected" 标识
   ├── 预估收益 vs 最坏情况
   └── 批量拍卖倒计时

CoW Swap 特点:
├── 订单先进入链下批量撮合
├── 相同方向订单可以互相抵消(CoW = Coincidence of Wants)
├── 剩余部分才到 DEX 执行
└── MEV 收益返还给用户
═══════════════════════════════════════════════════════════

任务 3:查看 MEV 数据

MEV 监控网站
═══════════════════════════════════════════════════════════

1. EigenPhi (eigenphi.io)
   └── 查看实时 MEV 交易、三明治攻击案例

2. Flashbots Dashboard (flashbots.net)
   └── 查看 MEV-Boost 采用率、Builder 排名

3. MEV Blocker (mevblocker.io)
   └── 查看保护了多少用户价值

4. Dune Dashboard
   └── 搜索 "MEV" 查看各种分析看板
═══════════════════════════════════════════════════════════

今日思考

产品经理视角的 MEV 问题

1. 用户体验困境

  • 用户不理解为什么总是"买贵了"
  • 如何在 UI 上解释 MEV 而不吓跑用户?

2. 权衡决策

  • MEV 保护通常意味着更慢的确认
  • 用户愿意为保护等待多久?

3. 产品设计启示

  • 默认开启 MEV 保护还是让用户选择?
  • 如何展示"你节省了 $X MEV"?

面试题准备

问题:什么是 MEV?它如何影响用户体验?

30秒版本:
═══════════════════════════════════════════════════════════
MEV(最大可提取价值)是区块生产者通过重排、插入或审查交易
获得的额外利润。最常见的是三明治攻击:攻击者在用户交易前后
插入自己的交易,人为抬高价格后获利。这导致用户在 DEX 交易
时总是比预期多付钱。解决方案包括使用 Flashbots 等私有交易
通道,或使用 CoW Swap 等带 MEV 保护的 DEX。
═══════════════════════════════════════════════════════════

2分钟版本:
═══════════════════════════════════════════════════════════
MEV 的定义和来源:
MEV 是区块生产者(PoW 的矿工或 PoS 的验证者)通过控制交易
顺序获得的额外价值。来源于公开的 mempool:用户交易在被打包
前对所有人可见,给了攻击者可乘之机。

主要 MEV 类型:
1. 套利:在不同 DEX 间利用价差获利(相对良性)
2. 清算:抢先清算借贷协议的不健康仓位
3. 三明治攻击:在用户交易前后夹入交易获利(最伤害用户)

对用户体验的具体影响:
1. 价格更差:三明治攻击让用户买到更少代币
2. 交易失败:竞争导致 Gas 飙升,交易失败率上升
3. 信任受损:用户感觉"总是亏",对 DeFi 失去信心
4. Gas 战争:MEV 竞争推高整体 Gas 价格

解决方案:
1. Flashbots Protect:交易不公开,防止被前跑
2. CoW Swap:批量撮合,MEV 返还用户
3. 私有 mempool:加密交易内容
4. 产品设计:默认开启保护、显示节省金额

产品经理应该考虑:
- 是否默认集成 MEV 保护?
- 如何教育用户理解这个复杂概念?
- 在 UI 上如何平衡信息透明和用户体验?
═══════════════════════════════════════════════════════════

学习资源

资源链接说明
Flashbots 官网flashbots.netMEV 研究和工具
EigenPhieigenphi.io实时 MEV 监控
MEV Wikidocs.flashbots.net最全面的 MEV 知识库
CoW Protocolcow.fiMEV 保护 DEX
Paradigm MEV 研究paradigm.xyz深度研究文章

明日预告

Day 20: 安全基础 - 攻击类型
├── 重入攻击 (Reentrancy)
├── 闪电贷攻击 (Flash Loan)
├── 价格操纵攻击
├── 治理攻击
└── 阅读 Rekt 事后分析报告