三明治攻击是什么?DEX 订单如何被夹击 图 1
三明治攻击是什么?DEX 订单如何被夹击 · 图 1

结论先说

三明治攻击是 DEX(去中心化交易所)上最典型的 MEV 攻击:攻击者先于你的交易插入一笔买单(抢跑单)抬高价格,让你的换币订单按被抬高的价格成交,再插入一笔卖单(跑后单)立刻按新高价卖出获利。你的交易本身没有漏洞——它正常执行了——但你付出的滑点被攻击者精准截走。理解它的结构,就能理解所有防御手段(滑点限制、私有通道、限价单)为什么有效。

三笔交易的时间线

以”A 换 B”为例。第一步,攻击者监控内存池,发现一笔大额 A→B 换币交易正在广播,且该交易设置的滑点容忍度足够宽。第二步,攻击者构造一笔抢跑单:在同一个区块里排在受害者之前,用 A 大量买入 B,把池子价格推高。第三步,受害者的订单按规则执行——池子价格已经变了,同样的 A 换到的 B 变少了,但因为没超过滑点上限,交易仍然成功(用户往往只感到”成交差了点”)。第四步,攻击者的跑后单紧随其后,把之前买入的 B 按新高价卖出,差价落袋。三笔交易打包进同一个区块,原子性由区块顺序保证:攻击者可以反复试错(不同区块重试),直到成功。

为什么滑点是成立的必要条件

关键在受害者订单的”可接受范围”。DEX 交易通常带滑点参数(比如”最多接受 3% 的价格偏差”),这是为了容忍链上执行前的价格波动。攻击者的整个套利空间 = 你愿意多付的滑点。如果你把滑点设成 0.5%,攻击者抬价 3% 会导致你的交易回滚(不成交、只损失 gas),攻击无利可图就不会发生。这就是”滑点既是便利也是敞口”:滑点宽,交易成功率高但被夹概率大;滑点紧,安全但高波动行情下容易失败。没有滑点容忍的交易(严格限价)在结构上免疫三明治——代价是可能永远匹配不上。

攻击者的成本与约束

攻击不是免费的:抢跑单要付 gas(且需要足够高的优先费才能排进目标区块前面)、跑后单要占用池子流动性(大单本身会移动价格,压缩利润)、还要承担回滚风险(如果受害者交易最终没进块,攻击者已经动了池子,可能亏)。因此三明治集中在”中等偏大、滑点宽、走公开内存池”的 DEX 交易上——小额交易利润覆盖不了 gas,极小滑点交易无肉可吃。这也是为什么”我的交易太小不会被盯”有一定道理,但”偶尔一次大额”恰恰是风险点。

防御手段的结构逻辑

按”切断攻击链条的哪一环”来理解:一,收窄滑点/严格限价——压缩套利空间到无利可图(最直接,但牺牲成交率)。二,私有交易通道——交易不经过公开内存池,攻击者看不到,无法构造抢跑单(Flashbots 类保护,注意它把风险转移给通道运营者)。三,限价单/意图撮合——用”不超过某价格成交,否则不成交”替代”接受范围内成交”,让攻击者无法计算利润。四,走受保护的排序机制(如部分 L2 的公平排序、私有 bundle 流程)。四种手段的共同点:要么让你”看不见”(私有),要么让你”夹不动”(限价),要么让你”夹了不赚”(紧滑点)。

如何识别自己被三明治过

链上工具可以标记疑似三明治交易(浏览器/MEV 监测服务有标注功能)。特征:你的 DEX 交易前后紧邻两笔同一代币对的交易、来自同一地址、价格明显偏移正常市场。被夹的损失量 = 按夹击前后中间价格成交与按未夹击价格成交的差值。注意:发现后没有”撤销”机制——链上交易不可逆,唯一能做的是调整后续交易的策略。把”偶发的成交偏差”当成数据点记录,比事后追查更有价值。

风险提示

三明治攻击利用的是公开机制的合理设计(内存池公开、滑点是用户自选),不是”漏洞”——因此不存在”官方修复”,防御永远在用户策略层。私有通道降低概率但不消除风险(通道内部仍可排序);限价单降低损失但不提高成交率。任何声称”绝对防三明治”的工具都应审其排序规则。本文解释机制,不构成对具体工具或 DApp 的推荐;操作前以所用工具的当前文档为准。

小结

一句话记忆:三明治 = 抢跑抬价 + 你的宽滑点订单 + 跑后获利,三笔交易同一区块原子完成;防御的本质是让它无利可图(紧滑点)、看不见(私有通道)或夹不动(严格限价)。理解”滑点即敞口”,就理解了 DEX 交易安全的第一原则。