三明治攻击(Sandwich Attack)是 DEX 中一种典型的 MEV 攻击方式:攻击者先在你的交易前买入,再让你的交易推高价格,最后在你的交易后卖出,从价格变化中获利。你看到的交易可能正常完成,但最终收到的代币数量会少于理想成交结果。
三明治攻击本质上是“前置交易 + 用户交易 + 后置交易”的组合。攻击者通过观察公开交易池(Mempool)中的待确认交易,判断某笔 DEX Swap 是否具有足够的价格影响和盈利空间,然后尝试把自己的交易安排在用户交易之前和之后。
以用户用 USDT 买入某种 Token 为例:
用户提交一笔较大的 USDT → Token 交易。
攻击者发现这笔交易可能明显推高 Token 价格。
攻击者先买入 Token,即 Front-running。
用户的 Swap 按原计划执行,但由于池中价格已经被推高,用户实际获得的 Token 数量下降。
用户交易完成后,攻击者立即卖出此前买入的 Token,即 Back-running。
攻击者利用两次交易之间的价格差获得收益。
这就是所谓的“夹心”:用户交易被夹在攻击者的买入和卖出之间。Uniswap 对三明治攻击的说明也采用了这一基本过程,并指出价格滑动和区块链交易透明性是这种攻击能够发生的重要条件。

核心原因不是 DEX 本身存在某个简单的“漏洞”,而是 AMM 的定价机制、公开交易信息和区块内交易排序结合后,为 MEV 搜索者创造了可利用的空间。
在 AMM 中,一笔较大的 Swap 本身就可能改变流动性池中的资产比例,从而影响后续交易价格。如果攻击者能够提前看到这笔交易,就可以估算它可能造成的价格变化,并判断是否值得在交易前买入、交易后卖出。
以太坊官方文档将这种通过调整区块中交易的包含、排除和排序来提取价值的行为归入 MEV。三明治交易就是其中较典型的一类,而且与套利不同,它会直接恶化普通用户的成交结果。
因此,真正需要关注的是下面这条链路:
公开待确认交易 → 攻击者识别大额 Swap → 前置买入 → 用户成交 → 后置卖出 → 攻击者获利
如果你还不清楚 Slippage、Price Impact 和 MEV 分别意味着什么,可以先了解滑点与 MEV:DEX 交易的隐藏成本,再来看三明治攻击会更容易理解。
三明治攻击的利润主要来自用户交易造成的价格变化。
假设一个流动性池当前 Token A 的价格为 100 USDT。用户提交了一笔规模较大的买入订单,正常情况下,这笔订单执行后价格可能上涨到 105 USDT。
攻击者如果能够在用户交易之前买入 Token A,那么攻击者买入时使用的是较低价格;等用户的大额买单推动价格上涨后,再把 Token A 卖出,就可能获得价差。
这里需要特别注意:攻击者并不是凭空“拿走”用户的钱,而是利用用户的大额交易对池子价格造成的影响进行交易。用户承担的主要损失通常表现为更差的成交价格、更高的价格影响以及额外的滑点损耗。
实际收益还必须扣除 Gas、交易竞争成本、价格变化以及交易失败等因素。因此,并不是看到一笔大额 Swap 就意味着一定存在可盈利的三明治机会。
三明治攻击尤其关注对流动性池价格影响较大的交易。
如果一个池子拥有非常深的流动性,一笔普通规模的交易通常不会明显改变池内资产价格;攻击者即使提前买入,也未必能够获得足够利润。
相反,如果交易金额相对于池子流动性较大,同样数量的 Token 买入可能造成更明显的价格变化。Uniswap 也明确建议用户优先考虑流动性较大的池子,因为攻击者更容易从低流动性池的大幅价格变化中寻找机会。
因此,判断风险时不要只看“我要交易多少钱”,而应该看:
交易金额 ÷ 对应交易池的有效流动性
这个比例越高,一般意味着交易本身对价格的影响越明显。
滑点容忍度(Slippage Tolerance)决定了你愿意接受的最大成交价格偏离范围。
例如,你准备买入某个 Token,报价显示预计可以获得 1,000 枚 Token。如果设置了较高的滑点容忍度,交易即使受到较明显的价格变化,只要最终成交结果仍处于允许范围内,交易就可能继续执行。
这给攻击者留下了更大的操作空间。
因此,高滑点并不等于一定会被三明治攻击,但它可能扩大攻击者可以利用的价格空间。反过来,如果滑点设置得过低,交易又可能因为市场价格变化而失败。
真正合理的做法不是简单地把滑点设置成“越低越好”,而是根据 Token 流动性、交易规模、网络状况和实际成交需求进行调整。
两者都属于 MEV 相关行为,但交易结构并不完全相同。
普通 Front-running 更接近“看到你的交易后,抢在你之前完成类似交易”,攻击者的目标是获得先手优势。
三明治攻击则需要前后两笔交易形成完整结构:
攻击者买入 → 用户交易 → 攻击者卖出
因此,三明治攻击不仅需要预测用户交易,还需要在用户交易前后完成两次交易,并承担价格变化和交易失败风险。
以太坊官方文档也将 Sandwich Trading 单独列为一种常见 MEV 提取方式,并指出它会导致被夹交易的用户面临更高的滑点和更差的执行结果。

如果交易金额较大,可以考虑拆分交易,避免一次交易对流动性池价格造成过大的冲击。
但拆单并不意味着绝对安全。如果拆分后的多笔交易仍然暴露在公开交易环境中,同样可能存在 MEV 风险,因此需要结合实际流动性和执行环境判断。
流动性越深,单笔交易造成的价格变化通常越小。
因此,在交易 Token 时,不要只比较显示出来的报价,也应该关注实际使用的流动性来源以及交易规模对应的 Price Impact。
不要为了“保证交易成功”而把滑点容忍度设置得过高。
同时,也不要机械地设置极低滑点导致交易频繁失败。比较合理的原则是:在能够接受的成交范围内,将允许的价格偏离控制在较小水平。
部分钱包、交易工具和交易协议会通过私有交易通道、订单意图(Intent)或其他机制降低交易内容暴露给公开 Mempool 的程度。
例如,Flashbots 提供的 Protect 服务就是针对抢跑等 MEV 风险设计的交易保护机制。
1inch 的部分交易产品也采用 Intent-based 架构,并提供 MEV Protection;其 Wallet 的 Swap 功能目前也标注为支持 MEV protection。
需要注意的是,使用所谓“MEV 保护”并不意味着所有交易风险都会消失,具体保护范围仍取决于所使用的钱包、网络、交易模式和执行机制。
如果一个 Token 的流动性很低、交易规模却很大,那么除了三明治攻击,还可能面临严重的 Price Impact、滑点以及流动性不足问题。
因此,当你发现一个 Token 必须把滑点设置得非常高才能完成交易时,不应该只把问题理解为“怎么设置参数”,而应该重新判断这个交易池是否适合交易。
三明治攻击不一定会出现一个明显的“你被攻击了”提示,通常需要结合链上交易记录进行判断。
可以重点观察:
自己的交易前是否出现了同一 Token 的大额买入;
自己的交易后是否出现了同一地址的大额卖出;
你的交易前后 Token 价格是否出现异常变化;
实际成交价格是否明显偏离提交交易时的报价;
交易所在池子的流动性是否较低;
攻击者的两笔交易是否与自己的交易处于同一区块,并形成明显的前后夹击结构。
如果出现“攻击者买入 → 我的 Swap → 攻击者卖出”这样的链上结构,并且攻击者从价格变化中获得了收益,就具有较明显的三明治攻击特征。
不过,单凭交易顺序不能百分之百确认攻击行为,还需要结合交易金额、池子状态、Gas、路由和实际价格变化进行分析。
很难通过某一个参数彻底消除三明治攻击风险。
因为它涉及的是区块链交易透明性、交易排序、AMM 定价机制以及 MEV 市场之间的综合关系。以太坊生态目前也在持续探索包括 PBS、Builder API、私有交易通道等在内的 MEV 缓解方案。
对于普通 DEX 用户来说,更现实的思路不是追求“绝对不会被夹”,而是降低自己成为高价值目标的概率,并减少一次攻击能够造成的损失。
可以把风险控制浓缩成一个简单公式:
大额交易 ↓ + 深流动性池 ↑ + 合理滑点 ↓ + MEV 防护 ↑ = 三明治攻击风险 ↓
三明治攻击的核心,是攻击者利用公开待确认交易和交易排序,在用户 Swap 前后插入自己的交易,从用户交易造成的价格变化中获取利润。
普通用户最应该关注的并不是“有没有一种设置可以保证不被攻击”,而是交易规模、流动性、Price Impact、滑点容忍度以及交易是否经过 MEV 防护通道。
尤其是在交易低流动性 Token 或进行大额 Swap 时,不要只看交易界面显示的报价。理解“报价 → Price Impact → Slippage → MEV → 最终成交”的完整链路,才能真正判断一次 DEX 交易的实际成本和风险。
加密货币和 DeFi 交易具有较高风险,价格、流动性、智能合约及网络状况均可能发生快速变化。本文仅用于信息和教育目的,不构成投资建议。