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.net | MEV 研究和工具 |
| EigenPhi | eigenphi.io | 实时 MEV 监控 |
| MEV Wiki | docs.flashbots.net | 最全面的 MEV 知识库 |
| CoW Protocol | cow.fi | MEV 保护 DEX |
| Paradigm MEV 研究 | paradigm.xyz | 深度研究文章 |
明日预告
Day 20: 安全基础 - 攻击类型
├── 重入攻击 (Reentrancy)
├── 闪电贷攻击 (Flash Loan)
├── 价格操纵攻击
├── 治理攻击
└── 阅读 Rekt 事后分析报告