MEV 剖析:三明治攻击、抢先交易与内存池的黑暗森林
当你在去中心化交易所签署一笔 swap 并将其广播到公共 RPC 端点时,你并没有向撮合引擎发送一条私密指令。你发布的是一份已签名、可执行的意图声明,公开挂在一块全球公告板上,并且你还给愿意执行它的任何人附上了一笔赏金——也就是 gas 价格。所有人都能读到这份声明。但没有人有义务公平地执行它、按顺序执行它,或者干脆执行它。它相对于其他交易落地的顺序,并不是你提交时自带的属性;而是由某个第三方决定的——这个第三方恰恰能靠着对你不利的安排获利。
这正是链上交易令人不安的核心所在。在《加密市场中的统计套利与配对交易》一文中,我们曾顺带提到,在 CEX 和 DEX 之间转移仓位存在"MEV 风险",但当时没有展开说明。本文正是要补上这笔债。它是一个系列文章的入口,主题是链上执行的经济学,其任务是把词汇表——内存池(mempool)、bundle、backrun(尾随交易)、三明治(sandwich)、PBS——定义得足够精确,以便后续讨论利用闪电贷的原子套利和面向量化人群的 Uniswap v3 集中流动性的文章可以默认你已经理解这台机器的运作方式。
MEV——最大(或最多)可提取价值(Maximal/Maximum Extractable Value)——是指某一方通过选择区块内交易的纳入、排除与排序,在标准区块奖励和优先费之外能够额外提取的利润。这不是一个漏洞,而是无许可区块链排序机制的结构性后果。自 2019 年该机制被正式表述以来,累计被提取的价值已达数十亿美元规模,一整个行业——搜索者(searcher)、构建者(builder)、中继(relay)、区块提议者(proposer)——已经围绕着攫取和再分配这部分价值发展起来。如果你在链上交易,那么你要么正在缴纳这笔税,要么已经采取了刻意的措施来避免它。
1. 交易生命周期:为什么你的意图是公开的
要看清价值从哪里泄漏出去,我们不妨跟踪一笔交易从你的钱包到最终确认区块的全过程。
公共内存池
当你的钱包签署一笔交易并提交到某个标准节点的 RPC 端点时,该节点会验证它(签名、nonce、余额是否充足),如果通过验证,就会将其在点对点网络中广播给其他节点。每个节点会把这些尚未被打包的交易保存在一个本地缓冲区中,称为内存池(memory pool,mempool)。在一两秒之内,网络上几乎所有节点——包括那些整个业务就是从待处理交易中提取价值的参与方运营的节点——都会持有一份你已签名、完全解码的交易副本。
"完全解码"是这句话里的关键词。你的交易并非一段不透明的二进制数据,而是对某个已知合约的 ABI 编码调用。任何监视内存池的人都可以解码它,直白地读出:*这个地址即将在 Uniswap v2 的 WETH/USDC 池中用 40 枚 ETH 换取 USDC,且愿意接受最少 96,000 USDC。*最后那个条款——最低可接受输出——就是你的滑点容忍度,它不只是一个提示,而是编译进 calldata 的硬性参数。我们很快就会看到,它同时也是攻击者的预算上限。
内存池有时被称为黑暗森林(dark forest),这个说法来自 Dan Robinson 和 Georgios Konstantopoulos 在 2020 年写的一篇文章,借用了刘慈欣的比喻:在这个空间里,任何暴露出来的实体都会立刻被你看不见的猎手盯上。把一笔天真的、有利可图的交易广播进公共内存池,它很可能永远不会以你签署时的形式落进区块——因为某个机器人会先一步吞掉这个机会,并把周围的区块内容重新编排成对你不利的样子。
作为优先级队列的 gas 价格
以太坊的费用市场(在 EIP-1559 之后)把 gas 价格拆分成协议层的基础费(base fee,会被销毁)和优先费(priority fee,也就是"小费",归区块提议者所有)。在构建区块时,构建者出于经济动机会优先纳入给它支付最多的交易。粗略地说,内存池就是一个以小费为键的优先级队列:小费越高,越早被纳入。
正是这个机制让排序变得可以被购买。如果我看到你的待处理 swap,并希望我的交易紧挨在你之前执行,我不需要破解任何东西,只需提交一笔支付更高小费的交易即可。构建者遵循自身激励,会把我的交易排在前面。排序并不是协议提供的公平性保证;而是协议本身运行的一场拍卖,而被拍卖的标的正是根据你待处理交易中的信息采取行动的权利。
两个事实合在一起,就构成了整个 MEV 问题:
- 待处理交易是可见的(公共内存池)。
- 它们的排序是可以出售的(小费优先拍卖)。
下面的一切都是这两点的推论。

2. 三明治攻击机制,附实际数学推导
三明治攻击是针对 swap 交易者的经典有毒 MEV 策略,值得把算术过程完整推一遍,因为这些数字能解释为什么滑点设置是你所能掌控的最重要的防御参数。
恒定乘积不变量
一个 Uniswap v2 池持有代币 X 的储备量 和代币 Y 的储备量 ,并在每笔交易之后(暂时忽略手续费)维持不变量
如果交易者向池中卖出 数量的代币 X,新的 X 储备量为 ,为了保持 不变,池子必须支付出
考虑 Uniswap v2 0.3% 的手续费,输入量会被 缩放:
关键性质在于:你朝一个方向买入的量越大,你的边际价格就越差。价格冲击是凸的。而这个凸性正是攻击者用来变现的东西。
场景设定
考虑一个 WETH/USDC 池。为了数字干净一些,假设储备量使 ETH 价格约为 2,500 USDC:
- WETH
- USDC
你想用 40 枚 WETH 买入 USDC(即向池中卖出 WETH)。忽略手续费,在一个空区块中一次诚实的成交会给你
你交易前的现货价格是 USDC/WETH,所以按交易前中间价计算,40 WETH "值" 100,000 USDC。而你实际收到 99,601——这约 399 USDC 的差额,是你自己的价格冲击加上手续费造成的。现在假设你设置了1% 的滑点容忍度。你交易中的 amountOutMin 就是
这个数字现在在内存池中是公开的。它告诉任何观察者:*这个人愿意为他们的 40 WETH 接受最低 98,605 USDC。*你在干净区块中本可获得的数量(99,601)与你的底线(98,605)之间的差额——大约 996 USDC——正是你自愿让渡给任何抢先交易者的空间。这就是攻击者的预算。
攻击过程,逐步拆解
搜索者构造三笔交易,并强制它们在同一个区块中以如下顺序落地:
1. 抢跑(攻击者先买入)。 攻击者在你之前把自己的 WETH 卖进池子,推高 USDC 相对 WETH 的价格,这样当你的交易落地时,你每枚 WETH 能换到的 USDC 就变少了。攻击者会精心控制这笔交易的规模,使你的交易仍然满足 amountOutMin——如果不满足,你的 swap 就会回滚,也就没有受害者可供三明治了。最优抢跑规模,正是恰好把你压到底线上的那个最大值。
假设攻击者用自己的 40 WETH 抢跑。池子变为 ,根据不变量,攻击者收到
此时储备变为 WETH, USDC。
2. 受害者(你的 swap 在恶化后的池子中执行)。 你的 40 WETH 现在要面对这样的储备:
检查约束条件:98,811 > 98,605,所以你的交易不会回滚——你成交了,只是成交价更差。你实际收到 98,811,而不是干净区块中本该得到的 99,601。你损失了大约 790 USDC,而且你完全不知道发生了什么;你的 swap "成功"了。此时池子为 WETH, USDC。
3. 尾随(攻击者卖回)。 攻击者现在把第一步买入的 USDC 卖回池子——等价于买回自己的 WETH——从而收割你的交易所制造出的更高价格。用手头约 99,601 USDC 买回 WETH:
攻击者在第一步花掉 40 WETH,在第三步收回 40.32 WETH——扣除 gas 前获利约 0.32 WETH(约 800 USDC),几乎全部来自你的滑点预算。收紧你的滑点,这笔预算就会缩小;攻击者的最优抢跑规模随之下降,一旦低于某个阈值,三明治攻击在扣除 gas 后就不再有利可图,搜索者也就会放过你。
这里的教训不是"滑点容忍度不好"。你需要一定的容忍度,否则你的交易会在普通的价格波动中就回滚。教训是:滑点容忍度是一个可以被直接提取的量,把它随手设成 1% 这样的懒惰默认值,甚至更糟——在流动性稀薄的池子里设成"自动"——等同于把这么多钱留在桌上,任由观察者拿走。在一个低流动性的池子里,如果你自己的交易就能把价格推动好几个百分点,默认滑点可能会让出你名义金额中一个惊人的比例。
搜索者利润条件的一个简化示意:
def sandwich_profit(x, y, gamma, victim_dx, victim_min_out, attack_dx, gas_cost):
out1 = (y * gamma * attack_dx) / (x + gamma * attack_dx)
x1, y1 = x + attack_dx, y - out1
vout = (y1 * gamma * victim_dx) / (x1 + gamma * victim_dx)
if vout < victim_min_out:
return None # victim would revert; no sandwich
x2, y2 = x1 + victim_dx, y1 - vout
got_back = (x2 * gamma * out1) / (y2 + gamma * out1)
return got_back - attack_dx - gas_cost # profit in WETH
搜索者会对 attack_dx 做一个小型优化,找出能让 vout >= victim_min_out 仍然成立的最大抢跑规模。那个最优点恰好卡在你的滑点底线上——换句话说,攻击者能拿走的收益,恰恰被你留出的空间精确地限定了上限。
3. MEV 的分类:有毒与良性
"MEV"常被当作一个贬义词使用,但并非所有 MEV 都是从受害者身上榨取价值。按照"是否有人因排序而变得更糟"来对策略分类会很有帮助。
抢先交易(Frontrunning)。 观察到一笔待处理的有利可图的交易,复制或抢先执行它,并支付更高的小费以确保先行成交。典型场景是:看到一笔会推动价格的大额买单,抢在它之前买入。这纯粹是有毒的:受害者要么拿到更差的价格,要么其机会被直接窃取。
尾随交易(Backrunning)。 把你的交易安排在目标交易之后紧接着执行,以利用它所创造出的状态。关键在于,纯粹的尾随交易不会使目标交易的执行结果变差——因为它在目标交易之后运行,此时受害者的价格已经锁定。如果你的大额 swap 把 WETH/USDC 池的价格打得偏离了 Binance 的价格,套利者会尾随你把价格拉回一致,并赚取其中的差价。你并没有受到伤害;事实上,正是这种套利维持着链上价格与更广泛市场的一致性。尾随交易是这个光谱中良性的一端——而且,正如我们接下来会看到的,现代 MEV 防护系统恰恰是被设计来把尾随交易的利润返还给创造出这一机会的用户的。
三明治攻击(Sandwiching)。 如上文剖析的那样,是包裹在同一个受害者交易两侧的一笔抢跑加一笔尾随。它天生就是有毒的:抢跑交易存在的唯一目的,就是恶化受害者的成交结果,好让尾随交易能够收割它。
原子套利(Atomic arbitrage)。 单笔交易在一个场所低价买入某资产、在另一个场所高价卖出——比如 WETH 在 Uniswap 上比在 Sushiswap 上便宜——从而获得无风险利润,整个过程在一笔交易内要么全部完成、要么全部不发生(如果无利可图就会回滚)。没有特定的受害者;它只是在弥合市场留下的价格差异。通常被认为是良性的——它改善了跨场所的价格一致性——它也是本系列中原子套利与闪电贷一文的主题,闪电贷"无需自有资金"的特性让这种策略格外锋利。
清算(Liquidations)。 当一笔借贷仓位(Aave、Compound、Maker)的抵押率跌破阈值时,协议会向任何偿还坏账并没收抵押品的人提供奖励。搜索者会争相成为那个清算者。这里确实存在一个"受害者"——被清算的借款人——但无论如何,他们都会按协议规则被清算;MEV 竞争主要决定的是谁能拿到这笔奖励,并且通过竞争可能会压缩奖励的大小。对市场健康而言可称之为中性偏良性,但对借款人而言并不愉快。
大致的分类图谱:
| 策略 | 是否有受害者受损 | 结论 |
|---|---|---|
| 抢先交易 | 是 | 有毒 |
| 三明治攻击 | 是 | 有毒 |
| 尾随交易(纯粹) | 否 | 良性 |
| 原子套利 | 否 | 良性(改善价格一致性) |
| 清算 | 借款人(按协议规则) | 中性 |
有毒/良性的这条界线之所以重要,是因为整个现代 MEV 缓解技术栈本质上都是在试图压制有毒策略,同时保留——并重新分配——良性策略。你不可能在禁止排序博弈的同时,不破坏那些维系 DEX 价格诚实的套利行为。诀窍在于把有毒的价值重新导流回它原本被夺走的那个人手中。
4. 简史:从 gas 拍卖到 Flashbots
Flash Boys 2.0 与优先 gas 拍卖
这一现象在 2019 年的论文**《Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges》中被首次命名和度量,作者为 Philip Daian、Steven Goldfeder、Tyler Kell、Yunqi Li、Xueyuan Zhao、Iddo Bentov、Lorenz Breidenbach 和 Ari Juels。该论文提出了"矿工可提取价值"(miner extractable value)这一术语(后来随着行业从工作量证明矿工转向权益证明提议者,被推广为"最大可提取价值"),并记录了优先 gas 拍卖(priority gas auctions,PGA)**:机器人之间实时抬价竞标 gas 价格,以赢得对某个有利可图机会的排序权。
PGA 的病态特征显而易见。因为机器人手中唯一的杠杆就是公开的 gas 价格,它们会展开公开竞价战——在同样短短几秒钟内,反复以更高的小费重新提交交易——只为抢下一次套利或清算的机会。由此产生两个丑陋的后果。第一,这会拥塞网络,抬高所有人的 gas 价格,无论是否与 MEV 相关。第二,更令人担忧的是,论文指出,如果一个区块中可获取的 MEV 超过区块奖励本身,理性的矿工就会被激励去重组链以窃取它,这直接威胁到共识稳定性本身。MEV 不仅仅是一个用户公平性问题,它是对整条链的威胁。
Flashbots 作为应对方案
Flashbots 于 2020 年上线,目的正是化解 PGA 问题。它的核心洞见是:把排序拍卖从公共内存池移出,转移到一个密封竞价、链下的通道中。搜索者不再广播一笔交易并卷入一场公开的 gas 战争,而是组装一个 bundle(捆绑交易)——一份按特定相对顺序、原子性地要么全部纳入、要么全部不纳入的有序交易列表——并把它私下提交给一个区块构建者(block builder),同时附上一份出价(通常以直接转账给提议者的形式支付,而不是通过 gas 价格)。构建者会从它收到的所有 bundle 和交易中,组装出它能构建的价值最高的区块,并将其提交给提议者。
两件事同时得到改善。搜索者不再向公共内存池发送大量注定失败的竞价交易,从而降低了对普通用户造成的 gas 价格外部性。而且,获胜的 bundle 要么完整落地,要么完全不落地,消除了过去那些会堵塞区块的"失败抢跑"交易。竞价战依然在发生——只是它现在是构建者内部的一场私密拍卖,而不是链上的一场公开叫价混战。
PBS:提议者-构建者分离
Flashbots 的架构被推广为提议者-构建者分离(proposer-builder separation,PBS),这是当今以太坊上的主导模型。各个角色被拆分为:
- **搜索者(Searchers)**发现 MEV 机会,并将其打包成 bundle。
- **构建者(Builders)**从 bundle 和公共交易中竞相组装出单个价值最高的完整区块。
- **中继(Relays)**位于构建者和提议者之间,从构建者那里接收完整区块,只把区块的头部信息加上一份价值出价传递给提议者,这样提议者在看到区块内容之前就要先做出承诺(防止提议者直接窃取这份 MEV)。
- 提议者(Proposers)(验证者)挑选出价最高的区块头,签名,并收取报酬。
这一机制目前是通过 MEV-Boost 在协议之外实现的,这是绝大多数以太坊验证者都在运行的中间件——大约 80%–90% 的区块是通过 MEV-Boost 由外部构建者构建的。这套机制是有效的,但它依赖于可信的中继。下一步,内嵌式 PBS(enshrined PBS,ePBS,EIP-7732),旨在把提议者-构建者分离直接嵌入以太坊协议本身,移除对可信中继的依赖。截至 2026 年年中,它计划在 Glamsterdam 升级中推出,目标是在 2026 年晚些时候实现主网激活,支持者声称通过改善区块的承诺方式以及缩窄有毒重排序的可乘之机,它能大幅削减用户承受的 MEV 损失。在它真正上线之前,应把这些具体数字视为愿景而非事实,但方向是明确的:协议正在把它多年来假装不存在的那条 MEV 供应链纳入自身。
MEV-Share:把价值还回去
对普通交易者而言,最具意义的进展是 MEV-Share,Flashbots 的订单流拍卖机制。这个想法颠倒了黑暗森林的逻辑。你的交易不再对每一个捕食者可见,而是被私下发送给一个 MEV-Share 节点,该节点只向搜索者透露关于它的部分提示(你可以选择透露多少)。搜索者竞价争夺对你交易的尾随权——记住,尾随交易不会伤害你——由此产生的利润中的很大一部分会返还给你,其余部分则在搜索者和提议者之间分配,以促成该 bundle 被纳入区块。
这种经济学上的重新框定十分巧妙。一笔大额 swap创造了一个尾随交易的机会;问题只在于谁来捕获它。在黑暗森林的世界里,搜索者和构建者拿走了全部。而在 MEV-Share 之下,你自己的交易所创造的价值,大部分会被返还给你。Flashbots 面向消费者的 RPC 服务 Flashbots Protect 就是通过这套系统来路由零售交易的,2025 年它还在此基础上加入了 gas 费退款,显著提高了用户能拿回的部分。这正是"再分配良性部分、压制有毒部分"这一原则的具体落地。
5. 交易者的实用防御手段
你不需要自己运营一个搜索者来摆脱猎物的处境。按影响力大致排序:
有意识地按池子设置滑点
第二节已经确立了:你的滑点容忍度就是攻击者的预算。由此可以得出两条规则。第一,滑点的大小应该匹配池子的实际流动性和你这笔交易的价格冲击,而不是习惯性地设成 1%。在一个深度充足的池子里,0.1%–0.3% 的容忍度可能就绰绰有余;在一个流动性稀薄的池子里,要么接受你无法安全地交易这么大的规模,要么把交易拆分成更小的批次。第二,在低流动性交易对上永远不要使用"自动"/"无限制"滑点——那等于是一张签了名的空白支票。如果一笔 swap 在较紧的容忍度下持续回滚,这是市场在告诉你,这笔交易对这个池子而言太大了,而不是在提示你去放宽底线。
通过私有 RPC 路由交易
最干净的结构性解决方案,是让你的交易彻底不进入公共内存池。把你的钱包指向一个私有 RPC,让交易直接转发给构建者,而不是在网络中广播:
- Flashbots Protect——把你的交易送入 MEV-Share 系统,使其对抢先交易者永远不可公开见,并把任何尾随交易价值的一部分外加 gas 费退款返还给你。
- MEV Blocker(由 CoW Protocol 等机构提供)——一个类似的私有 RPC 服务,可以防止抢先交易和三明治攻击,并把尾随交易利润返还给用户,采用免费使用的收费模式。
由于三明治攻击要求攻击者看到你待处理的交易并在其前面插入一笔抢跑交易,把你的交易从公共内存池中移除,就从根本上消除了抢跑的机会。尾随交易的机会依然存在,但现在它会被拍卖返还给你,而不是被窃取。代价是对 RPC 运营方要有一点信任,偶尔纳入速度会略慢一些——相比消除三明治风险,这通常是微不足道的。(一项 2025 年针对私有保护 RPC 的基准研究发现,它们在真实世界中的结算效果并非总是严格优于公开提交,所以这种效果虽强但并非普遍适用;对大多数零售规模的 DEX swap 而言,私有路由仍然是正确的默认选择。)
优先选择批量拍卖和基于意图的交易场所
一些 DEX 设计从结构上就消除了排序优势。CoW Protocol 以统一结算价格的批量拍卖方式结算交易——同一批次中的每一笔交易都以相同的价格结算,因此不存在可供利用的"第一"和"最后"位置,求解器(solver)之间竞争的是谁能给你最好的执行结果,而不是谁能围绕你重新排序。基于意图的系统——你签署的是你想要什么,而由求解器去寻找执行路径,而不是你签署一个具体的执行路径——同样剥夺了三明治攻击的立足之地。如果你在做较大规模的交易,这些场所的价值远超任何滑点上的微调。
理解为什么 L2 有所不同
如今在大多数以太坊 rollup 上(Arbitrum、Optimism、Base),区块由 rollup 团队运营的单一排序器(sequencer)生成。这里没有供搜索者监视的公开待处理交易内存池,只有一个可信方在决定顺序。实践中,大多数排序器按照先到先得的原则排序交易,并不会对自己的用户发起三明治攻击,所以在这些链上,三明治攻击在协议层面基本上是不存在的。
但要精确地理解这里的取舍:你之所以能免受去中心化的 MEV 提取,原因是你信任了一个中心化的排序方不去提取它。排序器完全可以抢跑你;它只是选择(并且出于声誉约束)不这么做。这是一种暂时的均衡。随着 rollup 去中心化其排序器——共享排序器、基于以太坊本身的排序(based sequencing)、L2 上类 PBS 的拍卖机制——同样的内存池可见性和排序可出售的动态可能会重新出现,L2 的 MEV 问题也会从一个已解决的问题变回一个开放的设计难题。不要想当然地认为"我在 L2 上"就意味着"MEV 永远碰不到我";它的实际含义是"目前有一个可信方承诺不这么做"。
应该带入本系列后续文章的要点
把本文主题浓缩为几个承重事实:
- 一笔公共内存池中的 swap 等于公开的意图加上一个可购买的排序位。正是这个组合,而不是任何单一漏洞,构成了整个问题的本质。
- 在恒定乘积 AMM 上,你的滑点容忍度是一个攻击者可以提取的量,而三明治攻击能拿走的收益,恰恰被你留出的空间精确地限定了上限。设置滑点是一个安全决策,而不是一个方便开关。
- MEV 并非铁板一块:抢先交易和三明治攻击是有毒的;尾随交易和原子套利是良性的,甚至是有用的,因为它们维系着链上价格与市场的一致性。好的缓解方案应该压制前者,同时重新分配后者。
- 行业的应对经历了从 PGA(公开 gas 战争,Flash Boys 2.0,2019 年)到 Flashbots / bundle / PBS(密封的私有拍卖),再到 MEV-Share(把尾随交易价值返还给用户),以及接下来即将到来的、内嵌在协议中的 PBS。
- 作为交易者,你的防御手段包括针对每个池子设置紧凑的滑点、私有 RPC(Flashbots Protect、MEV Blocker),以及批量拍卖场所——同时也要意识到,L2 的安全性目前只是对排序器的一种信任假设,而不是物理定律。
《原子套利与闪电贷》一文将站在搜索者的角度,看这张桌子的另一面——良性提取是如何通过借入资本和原子性回滚这一安全网构建起来的。《Uniswap v3 集中流动性》一文将重新审视上文推导的恒定乘积数学,说明集中流动性如何重塑价格冲击曲线——从而重塑我们在这里推导出的三明治预算。内存池是一片黑暗森林。现在你知道其中潜伏的猎手是谁了。
参考文献
- Daian, Goldfeder, Kell, Li, Zhao, Bentov, Breidenbach, Juels (2019), Flash Boys 2.0: Frontrunning, Transaction Reordering, and Consensus Instability in Decentralized Exchanges. arXiv:1904.05234.
- Robinson & Konstantopoulos (2020), Ethereum is a Dark Forest.
- Flashbots documentation: MEV-Boost, MEV-Share, Flashbots Protect, MEV refunds (docs.flashbots.net).
- Ethereum PBS / EIP-7732 (enshrined proposer-builder separation), Glamsterdam upgrade materials.
- MEV Blocker (mevblocker.io); CoW Protocol batch-auction design.
- Private MEV Protection RPCs: A Benchmark Study (arXiv:2505.19708, 2025).
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.