什么是三明治攻击?MEV机器人如何从你的DEX交易中窃取利润
三明治攻击是一种MEV(最大可提取价值)利用方式,机器人检测到待处理的交换交易后,在受害者交易的前后放置自己的交易,从由此产生的价格变动中提取利润。
这种攻击发生在每个拥有基于AMM的去中心化交易所的区块链上 — Solana、Ethereum、BSC、Base等。它是DEX交易者遭受意外损失的最常见原因之一,大多数受害者甚至不知道自己被攻击了。
本指南涵盖三明治攻击背后的机制、使其有利可图的条件以及可用的保护方法。
区块链交易的处理方式
要理解三明治攻击的工作原理,首先需要了解Solana、Ethereum和BSC等区块链如何处理交易。
区块链不会在你点击"交换"的那一刻逐一处理交易。相反,它们以批处理方式工作。区块链收集所有传入交易,将它们分组,然后一次性处理整个批次。每个批次称为区块,生成一个区块所需的时间称为出块时间。
| 区块链 | 出块时间 |
|---|---|
| Solana | ~0.4秒 |
| Monad | ~0.4秒 |
| Arbitrum | ~0.25秒 |
| Base | ~2秒 |
| Polygon | ~2秒 |
| Optimism | ~2秒 |
| Avalanche | ~2秒 |
| BNB Chain | ~3秒 |
| Ethereum | ~12秒 |
在Ethereum上,大约每12秒产生一个新区块。以下示例展示了在同一个12秒窗口内不同时间提交的五笔交易如何全部一起确认 — 但以与提交顺序无关的顺序执行:
| 交易 | 提交时间 | 确认时间 | 执行顺序 |
|---|---|---|---|
| 交易 A | 下午3:00:01 | 下午3:00:12 | 第3 |
| 交易 B | 下午3:00:03 | 下午3:00:12 | 第1 |
| 交易 C | 下午3:00:05 | 下午3:00:12 | 第5 |
| 交易 D | 下午3:00:08 | 下午3:00:12 | 第2 |
| 交易 E | 下午3:00:11 | 下午3:00:12 | 第4 |
所有五笔交易在区块创建时的下午3:00:12确认。但执行顺序 — 实际决定谁先交易的顺序 — 是由生成区块的验证者决定的,而不是由谁先提交决定。
优先费用、MEV小费或与验证者的直接关系等因素会影响交易在序列中的位置。交易B是第二个提交的,但第一个执行。交易A是第一个提交的,但第三个执行。
这就是三明治攻击成为可能的根本原因。MEV机器人监控管道中的待处理交易,通过支付更高的费用,它们可以操纵区块内的执行顺序,将自己的交易放在你的前后。
三明治攻击的工作原理
三明治攻击利用了交换会移动流动性池中代币价格的事实。以下是逐步说明。
- 你提交交换:你在DEX上提交购买代币X的交易。在此交易被包含在区块之前,它进入网络的交易管道 — 在Ethereum上是公共内存池,在Solana上是交易转发层 — 在那里它短暂可见。
- 机器人检测到你的交易:持续扫描管道的MEV机器人发现你的待处理交换。它看到你购买的数量并计算你的交易将使价格移动多少。你的交易相对于池的流动性越大,价格移动越多 — 攻击越有利可图。
- 机器人抢跑你:机器人以更高的优先费用提交自己的买入交易,确保在同一区块中你之前执行。机器人的购买推高了代币价格。
- 你的交易执行:你的交换以现在更高的价格进行。你收到的代币比没有机器人干扰时要少。
- 机器人尾随你:紧接着你的交易之后,机器人卖出步骤3中购买的代币。你的购买创造了额外的上行价格压力,机器人以那个更高的价格卖出。
机器人卖出后,价格回落。你持有的代币现在的价值低于你支付的价格。机器人捕获了其买入价和卖出价之间的差价 — 直接从你的交易中提取的价值。
整个序列发生在单个区块内。

上图显示了在Ethereum Uniswap V2 Pool上捕获的真实三明治攻击。三笔交易在完全相同的时间(上午06:28:23)在同一区块内执行:
- **1FaE13(MEV机器人)**购买价值$616.13的DAT代币 — 抢跑。
- **8a23ff(受害者)**购买价值$1.9的DAT代币 — 以现在更高的价格执行。
- **1FaE13(MEV机器人)**卖出价值$617.84的DAT代币 — 尾随,获取约$1.71的利润。
受害者$1.9的交易很小,但足以让机器人提取利润。整个攻击 — 买入、受害者、卖出 — 发生在单个区块中。
你的交易何时成为三明治攻击目标
不是每个交换都会被三明治。MEV机器人只在预期利润超过成本时才攻击。以下条件使你的交易成为目标:
- **相对于池大小的大额交易。**在$500流动性的池中$50的交换会使价格移动约10%或更多 — 三明治机器人的有利可图目标。在$5,000,000流动性的池中同样的$50几乎不移动价格,不值得攻击。
- **高滑点容忍度。**将滑点设置为10%或更高,意味着你会接受明显更差的价格。这给了机器人在你的交易回滚前推高价格的更多空间。
- **低流动性代币。**新推出的代币和迷因币往往拥有小型池。即使适度的交换也会产生足够的价格变动让机器人利用。
如何防护三明治攻击
1. 使用MEV保护交易路由
最有效的保护是从一开始就防止机器人看到你的交易。
- 在Solana上:Jito捆绑绕过公共交易管道,将你的交换直接发送到Jito区块引擎,MEV机器人无法观察到。大多数Solana交易工具已经支持这一功能 — 如果你看到"Jito Tip"字段,你的交易正在通过Jito路由。Jito还提供
jitodontfront机制,确保你的交易在包含它的任何捆绑中必须首先出现。 - 在Ethereum和EVM链上:Flashbots Protect、MEV Blocker和私有RPC等服务通过私有内存池而非公共内存池路由你的交易。一些钱包和DEX前端将此作为内置选项提供。
2. 设置严格的滑点
滑点容忍度定义了你愿意接受的最差价格。如果你设置1%的滑点,你的交易将在价格比预期差超过1%时失败而不是执行。
这限制了机器人的利润空间。如果机器人在你的交易回滚前只能提取很少的金额,在考虑机器人自身的费用和小费成本后,攻击将变得无利可图。
对于大多数交换,1-3%的滑点就足够了。仅在极端波动的代币或你愿意接受更差价格的发射期间才增加。
3. 拆分大额交易
不要在一笔交易中交换大量金额,而是拆分为多个较小的交换。每个较小的交易价格影响较小,使每一个对三明治机器人来说都不那么有吸引力。
缺点是更多的交易和更多的费用,但避免三明治攻击节省的金额通常超过额外成本。
4. 避免极低流动性的池
如果池的流动性非常低,即使小额交易也会产生巨大的价格影响。这些池是三明治机器人最容易的目标。在交换前在DEXScreener、Birdeye或DexTools上检查池的流动性。
5. 事后检查你的交易
sandwiched.me等工具让你检查钱包是否受到三明治攻击的影响。审查过去的交易有助于识别模式并调整策略 — 更严格的滑点、更小的交易或切换到MEV保护路由。
三明治攻击 vs. 其他价格下跌
购买后的每次损失都不是三明治攻击。
- 三明治攻击:价格在你的交易之前急剧上升,之后立即下降 — 在同一区块或下一区块内。在区块浏览器上,你可以看到同一钱包或程序在你之前的大额买入和之后的大额卖出。
- 正常卖压:购买后价格在几分钟到几小时内逐渐下降。其他持有者在卖出,这是正常的市场行为。
- 跑路:开发者从池中移除所有流动性。价格立即跌至接近零,代币变得不可交易。
总结
三明治攻击利用了DEX价格根据相对于池流动性的交易大小而变动,以及区块内的交易排序由验证者控制而非由谁先提交决定的事实。
保护自己:使用MEV保护路由(Solana上的Jito,Ethereum上的Flashbots Protect),设置严格的滑点,拆分大额交易,交换前检查池流动性。
FAQ
在任何链上都可能被三明治吗?
是的。任何拥有基于AMM的DEX的链都容易受到影响 — Solana、Ethereum、BSC、Base、Polygon、Arbitrum等。脆弱性来自AMM计算价格的方式,而不是任何特定的链或DEX。
高滑点意味着一定会被三明治吗?
不是自动的,但会显著增加风险。高滑点告诉网络你会接受更差的价格,这给了机器人更多提取利润的空间。尽量保持低滑点。
三明治攻击是违法的吗?
在大多数司法管辖区没有明确的法律框架。在Solana上,Solana基金会和Jito已对参与三明治攻击的验证者采取行动,将他们从委托计划中移除。在Ethereum上,Flashbots和其他基础设施提供商致力于减少MEV提取。
