一、定义与它的必然性
你在 DEX 上换币,设了 1% 滑点。交易成功,正好差 1%。
第 24–25 讲已经埋好了这件事的全部前提:你的意图在 mempool 里是公开的,而谁的交易排在前面由出价决定。这两条加起来,你那 1% 就是一份公开标价的、可以被人拿走的东西。
打个比方
这像一个所有人都能看到你出价的拍卖会,而且举牌顺序由小费决定。
你举牌之前先得大声喊出你愿意出多少,然后别人可以花钱插到你前面去。他不需要比你聪明,也不需要攻破任何东西——规则就是这么写的。
MEV(Maximal Extractable Value):通过在一个区块内【包含、排除、重新排序】交易,所能提取的、超出常规区块奖励与手续费的价值。
它原名是"矿工可提取价值",后来改成"最大可提取价值"——因为提取者早已不只是矿工。
⭐ 它的存在是三条基本性质的必然结果:
① ⭐ 排序权本身有价值
在一个 AMM 里,谁的交易先执行,谁拿到更好的价格。
⟹ 排序权是一种可以被出售的资源。
② mempool 是公开的(第 25 讲)
在交易被打包之前,所有人都能看到它要做什么。
③ 区块内的执行是原子的、确定的
攻击者可以精确模拟"如果我把交易插在这里会赚多少",
并且能保证"要么整套动作全部成功,要么全部不发生"。
⭐⭐ 这三条都是区块链的基本属性,不是缺陷。所以:
MEV 无法被消除,只能被【重新分配】。
⭐ 讨论 MEV 时,正确的问题不是"如何消灭它",而是"让谁拿到它"。
二、几种形态:良性与恶性
⚠️ 把 MEV 一概称为"攻击"是不准确的。
良性:套利
DEX A 上 ETH 报价 2000,DEX B 上报价 2010。
套利者同时在 A 买、B 卖,赚取 10 的差价。
⭐ 这个行为的社会功能:
① 让两个市场的价格趋于一致
② 为 DEX 提供价格发现
⟹ 没有它,DEX 的报价会长期偏离真实价格。
良性:清算
借贷协议里某个头寸的抵押率跌破阈值。
清算者偿还债务、拿走抵押品,赚取清算奖励。
⭐ 社会功能:如果没有人清算,协议会产生【坏账】,
损失由所有储户承担。
⟹ 清算奖励就是为这个必要服务付的钱。
恶性:三明治攻击
这一类是纯粹的价值转移——它不提供任何服务,受害者是普通用户。
① 攻击者在 mempool 看到你的大额买单
② ⭐ 在你【前面】插一笔买单,把价格推高
③ 你的交易以更差的价格成交
④ 在你【后面】插一笔卖单,把价格砸回去,赚走差价
一个可以验算的完整例子
AMM 池子:100 ETH / 200,000 USDC (恒定乘积,忽略手续费)
现价:2000 USDC/ETH
你要用 10,000 USDC 买 ETH,⭐ 滑点容忍度设为 5%
无攻击时:
池中 USDC → 210,000,ETH → 20,000,000/210,000 = 95.238
你拿到:100 − 95.238 = ⭐ 4.7619 ETH
有效价格:10,000 / 4.7619 = 2100 USDC/ETH
攻击者会精确计算:把你压到"刚好不触发滑点保护"的位置。
5% 滑点下你能接受的最低产出:4.7619 × 0.95 = ⭐ 4.5238 ETH
⟹ 攻击者反解出他能前置买入的最大金额:约 5,322 USDC
① 攻击者先买:花 5,322 USDC,得到 2.5922 ETH
② 你的交易执行:只拿到 4.5238 ETH(比应得的少 0.2381 ETH)
③ 攻击者卖回 2.5922 ETH:得到 5,846 USDC
攻击者净利润:5,846 − 5,322 = 524 USDC
你的损失:0.2381 ETH ≈ 500 USDC
⭐⭐ 这个例子揭示了最关键的一点:
滑点容忍度直接决定了能被抢走多少。
⚠️ 把滑点从 5% 调到 0.5%,攻击者能提取的利润下降一个数量级。 很多用户为了"避免交易失败"而把滑点设成 5% 甚至更高——⭐ 这等于主动交出了这部分钱。
恶性:抢跑
NFT 铸造:抢在你之前 mint 稀有编号
清算竞争:⭐ 看到你的清算交易,用更高 Gas 抢先执行同样的操作
三、MEV 对共识的真实威胁
这是最深刻、也最容易被忽略的一点。
正常情况:区块奖励 + 手续费 ≫ 单个区块的 MEV
⟹ 延长链是最优策略,共识稳定。
⚠️ 但如果某个区块里出现了一个【极大】的 MEV 机会
(比如一次数千万美元的清算):
验证者面前出现两个选项:
A. 老老实实出下一个块,赚区块奖励
B. 【重组】那个区块,把 MEV 抢过来
⟹ 当 MEV ≫ 区块奖励时,选项 B 更划算。
⭐⭐ 这与第 17 讲的"费用狙击"是同一个机制,而且更严重:
它破坏了中本聪共识的一个隐含假设——“延长链总是最优策略”。
⚠️ 由此产生了一个反直觉的推论:
⭐ MEV 越大,链的共识越不稳定。
⟹ 所以 MEV 不只是"用户被薅"的问题,它是【共识层的安全问题】。
这也是以太坊社区如此重视 MEV 治理的原因——不是出于道德,而是出于安全。
四、MEV 供应链
今天的 MEV 已经产业化,形成了一条完整的链条:
用户
│ 发交易
▼
钱包 / RPC ──────▶ 公开 mempool 或 ⭐ 私有通道
│
▼
搜索者(Searcher)
运行策略程序,扫描 mempool 和链上状态,
构造出能获利的交易【捆绑包(bundle)】
│
▼
构建者(Builder)
收集捆绑包,用优化算法拼出【价值最高的区块】
│
▼
中继(Relay)
信任中介:向提议者证明"这个区块有效且出价 X",
同时不让提议者提前看到区块内容
│
▼
提议者(Proposer,即验证者)
只看出价,选最高的那个区块头签名
五、提议者-构建者分离(PBS)
⭐ 拍卖会那个比方在这里被改造了一次:PBS 没有取消拍卖,它只是把"举牌的人"和"敲锤的人"分开——敲锤的人不再看得见牌上写什么,于是他没法自己插队。
动机不是"让 MEV 更公平",而是防止验证者中心化:
⚠️ 如果每个验证者都要自己构建最优区块,
那么"拥有更好的 MEV 算法和更多订单流"的大机构会赚得更多,
⟹ 小验证者被挤出,质押集中化。
PBS 的解法:把"构建"和"提议"拆开。
⟹ 提议者只需选出价最高的区块头,
不需要任何 MEV 能力,也看不到区块内容。
⟹ 于是无论大小,所有验证者拿到的 MEV 收益趋于一致。
⭐ MEV-Boost 是它的链下实现(通过中继),而中继是一个真实的信任点:
中继必须保证:
① 区块确实有效(否则提议者签了个坏块会被罚没)
② ⭐ 不把区块内容提前泄露给提议者(否则提议者可以自己偷走 MEV)
**协议内 PBS(enshrined PBS)**的目标就是用协议机制取代这个信任中介。
六、缓解路线
① 私有交易池
把交易直接发给构建者,⭐ 不进入公开 mempool。
⟹ 三明治攻击者看不到,但你现在信任那个构建者不作恶。
⭐ 注意这又是第 27 讲那个模式:一个问题被"引入新的信任"解决了。
② 加密内存池
⭐ 交易内容【加密】提交,排序完成后才解密执行。
⟹ 排序者在决定顺序时【根本看不到内容】
⟹ 三明治攻击在原理上不可能
实现方式:
阈值加密:⭐ 需要 t 个委员会成员合作才能解密(第 8 讲)
延迟加密:用 VDF(第 8 讲),保证解密需要固定时间——
而那时排序已经定死了
⚠️ 难点:解密失败怎么办?加密交易无法预先验证有效性,可能被用来 DoS 区块空间。
③ 批量拍卖
不再逐笔按顺序成交,而是把一个时间窗口内的所有订单【批量撮合】,
⭐ 所有人拿到【同一个价格】。
⟹ "谁在前面"不再有任何价值 —— 从根源上消灭了排序 MEV。
代价:牺牲了即时成交,且需要一个撮合机制。
这是最彻底的一条路:它不是让 MEV 更难提取,而是让排序权本身不再值钱。
④ 应用层与意图架构
⭐ 设置合理的滑点(第二节:它直接决定被抢走多少)
RFQ / 做市商报价:由做市商承担价格风险,链上不再有可抢跑的价差
意图(intent)架构:
用户表达"我要用 X 换至少 Y 个 Z",
由求解者(solver)竞争提供最优执行。
⟹ 竞争把 MEV 返还给用户——因为出价最好的求解者才能赢
七、MEV 返还:一个更好的框架
回到第一节的结论:MEV 无法消除,只能重新分配。 那么它可以流向三个地方:
① 搜索者与构建者 ⚠️ 现状:大部分被专业玩家拿走
② 验证者 通过 PBS 拍卖,让全体质押者分享
③ 用户自己 通过订单流拍卖、意图架构,把本属于用户的部分还回去
⭐ 第三条正是当前的主要方向:既然你的交易本身创造了 MEV,那这份价值理应有一部分归你。
八、Go:三明治攻击的计算
package mev
import "math"
// Pool 是一个恒定乘积做市商(忽略手续费)。
type Pool struct {
ReserveA float64 // 例如 USDC
ReserveB float64 // 例如 ETH
}
func (p *Pool) K() float64 { return p.ReserveA * p.ReserveB }
// SwapAForB 计算投入 dx 个 A 能换出多少 B,并更新储备。
func (p *Pool) SwapAForB(dx float64) float64 {
k := p.K()
newA := p.ReserveA + dx
newB := k / newA
out := p.ReserveB - newB
p.ReserveA, p.ReserveB = newA, newB
return out
}
func (p *Pool) SwapBForA(dy float64) float64 {
k := p.K()
newB := p.ReserveB + dy
newA := k / newB
out := p.ReserveA - newA
p.ReserveA, p.ReserveB = newA, newB
return out
}
func (p *Pool) Clone() *Pool { return &Pool{p.ReserveA, p.ReserveB} }
// Quote 返回不受攻击时的成交量——这就是钱包给用户看的报价。
func Quote(p *Pool, amountIn float64) float64 {
return p.Clone().SwapAForB(amountIn)
}
// MaxFrontrun 二分搜索攻击者能前置买入的【最大】金额,
// 使受害者的产出恰好不低于其滑点下限。
// ⭐ 这是三明治攻击的核心计算:把受害者压到"刚好不触发保护"的位置。
func MaxFrontrun(p *Pool, victimIn, slippageTolerance float64) float64 {
minOut := Quote(p, victimIn) * (1 - slippageTolerance)
lo, hi := 0.0, p.ReserveA*10
for i := 0; i < 100; i++ {
mid := (lo + hi) / 2
sim := p.Clone()
sim.SwapAForB(mid) // 攻击者前置买入
if sim.SwapAForB(victimIn) > minOut { // 受害者仍能通过滑点检查
lo = mid
} else {
hi = mid
}
}
return lo
}
// SandwichProfit 返回攻击者的净利润和受害者的损失。
// 关键结论:两者都随 slippageTolerance 线性放大——
// 滑点容忍度直接决定了能被抢走多少。
func SandwichProfit(p *Pool, victimIn, slippage float64) (profit, victimLoss float64) {
quote := Quote(p, victimIn)
x := MaxFrontrun(p, victimIn, slippage)
sim := p.Clone()
attackerB := sim.SwapAForB(x) // ① 前置买入
victimGot := sim.SwapAForB(victimIn) // ② 受害者以更差价格成交
back := sim.SwapBForA(attackerB) // ③ 后置卖出
return back - x, quote - victimGot
}
// ReorgIncentive 判断验证者是否有动机重组去抢 MEV。
// 这是 MEV 最深刻的危害:当单块 MEV 远超区块奖励时,
// "延长链是最优策略"这个中本聪共识的隐含假设被打破。
// 与第 17 讲的费用狙击是同一个机制。
func ReorgIncentive(blockMEV, blockReward, reorgSuccessProb float64) bool {
expectedFromReorg := blockMEV * reorgSuccessProb
// 用 math.Max 保证区块奖励为正,避免除零式的退化比较
return expectedFromReorg > math.Max(blockReward, 0)
}
// EncryptedMempoolBenefit 说明加密内存池为什么在原理上消除三明治:
// 排序者在决定顺序时看不到交易内容,
// 也就无法计算"插在哪里能赚多少"。
func EncryptedMempoolBenefit(orderingSeesContent bool) string {
if orderingSeesContent {
return "排序者可模拟收益 ⟹ 三明治可行"
}
return "排序者无法模拟 ⟹ 三明治在原理上不可能(套利与清算仍存在)"
}
九、本讲小结
- ⭐⭐ MEV 是三条基本性质的必然结果:排序权有价值、mempool 公开、区块内执行原子且可预测。这三条都不是缺陷,所以 MEV 无法消除,只能重新分配。正确的问题是"让谁拿到"。
- 不能把 MEV 一概称为攻击:套利让市场价格趋同、清算防止协议产生坏账——两者都是必要的社会功能。
- ⭐ 三明治是纯粹的价值转移,不提供任何服务。可验算的结论:滑点容忍度直接决定被抢走多少——例子中 5% 滑点让攻击者赚 524 USDC,受害者损失 0.238 ETH。为"避免交易失败"而把滑点设成 5% 以上,等于主动交出这部分钱。
- MEV 对共识的威胁最深刻:当单块 MEV 远超区块奖励时,验证者有动机重组去抢它 ⟹ “延长链是最优策略"这个隐含假设被打破。与第 17 讲的费用狙击是同一个机制。⟹ MEV 越大,共识越不稳定——它是共识层的安全问题,不只是用户被薅。
- MEV 供应链:用户 → 钱包/RPC → 搜索者(构造捆绑包)→ 构建者(拼最优区块)→ 中继 → 提议者(只看出价)。
- PBS 的动机不是公平,是防中心化:若人人自建区块,MEV 能力强的大机构会挤走小验证者。拆开之后,提议者不需要任何 MEV 能力。 MEV-Boost 的中继是真实信任点(要保证区块有效,且不让提议者提前看到内容)。
- 四条缓解路线:私有池(又是"引入新信任”)、加密内存池(排序时看不到内容 ⟹ 三明治原理上不可能)、批量拍卖(统一价格 ⟹ 让排序权本身不值钱,最彻底)、应用层的滑点/RFQ/意图架构。
- MEV 返还是当前主要方向:既然你的交易创造了 MEV,这份价值理应有一部分归你——订单流拍卖和意图架构就是在做这件事。
思考题
- 用三条基本性质说明为什么 MEV 无法被消除。如果去掉其中任意一条,还会有 MEV 吗?
- 为什么套利和清算是良性的?如果彻底禁止它们,DeFi 会发生什么?
- 用文中的池子参数,自己算一遍滑点设为 1% 时攻击者的利润和你的损失。与 5% 相比差多少倍?
- 为什么很多用户会把滑点设得很高?这个行为的真实代价是什么?有没有更好的做法?
- 完整推演 MEV 引发重组的场景:一个区块含 5000 万美元的清算机会,区块奖励折合 5 万美元。验证者会怎么选?
- 为什么说 MEV 是"共识层的安全问题"?它和第 17 讲的费用狙击有什么共同的结构?
- PBS 如果不存在,MEV 会怎样导致质押中心化?请描述这个正反馈过程。
- MEV-Boost 的中继需要被信任两件事。分别说明如果它在其中一件上作恶会发生什么。
- 加密内存池能消除三明治,但套利和清算仍然存在。为什么?这说明了什么?
- 批量拍卖为什么是最彻底的方案?它牺牲了什么?在什么场景下这个牺牲是可接受的?