一、定义与它的必然性

你在 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,这份价值理应有一部分归你——订单流拍卖和意图架构就是在做这件事。

思考题

  1. 用三条基本性质说明为什么 MEV 无法被消除。如果去掉其中任意一条,还会有 MEV 吗?
  2. 为什么套利和清算是良性的?如果彻底禁止它们,DeFi 会发生什么?
  3. 用文中的池子参数,自己算一遍滑点设为 1% 时攻击者的利润和你的损失。与 5% 相比差多少倍?
  4. 为什么很多用户会把滑点设得很高?这个行为的真实代价是什么?有没有更好的做法?
  5. 完整推演 MEV 引发重组的场景:一个区块含 5000 万美元的清算机会,区块奖励折合 5 万美元。验证者会怎么选?
  6. 为什么说 MEV 是"共识层的安全问题"?它和第 17 讲的费用狙击有什么共同的结构?
  7. PBS 如果不存在,MEV 会怎样导致质押中心化?请描述这个正反馈过程。
  8. MEV-Boost 的中继需要被信任两件事。分别说明如果它在其中一件上作恶会发生什么。
  9. 加密内存池能消除三明治,但套利和清算仍然存在。为什么?这说明了什么?
  10. 批量拍卖为什么是最彻底的方案?它牺牲了什么?在什么场景下这个牺牲是可接受的?