
你在去中心化交易所换币,点下确认,成交价比报价差了 1.5%,钱包里少了一笔说不清的钱。多数人把这归因于“行情波动”,但相当一部分来自同一个机制:区块内的交易排序权。这篇讲清楚三明治攻击怎么做、什么情况下你会中招、以及四道成本很低的防线。
一、MEV 的本质:谁决定区块里的顺序
链上交易不是按你点击的时间上链,而是按打包者把它们放进区块的顺序执行。以太坊大约每 12 秒出一个块,一个块能装的交易有限,于是“排在前面”本身就有价值。这种从排序中提取的价值叫 MEV(最大可提取价值)。
今天的区块生产已经分工:用户把交易发给 RPC,RPC 转给搜索者(searcher),搜索者把有利可图的交易包(bundle)交给区块构建者(builder),构建者拼块、验证者出块。普通用户看不见这一层,只看到自己的成交价变差。
二、三明治攻击的三个动作
典型的三明治只有三步,全部发生在同一个区块或相邻两个区块里:
- 抢跑(front-run)。攻击者看到你 pending 的买单,用更高的优先费把自己的买单插到你前面,把价格推高。
- 你的成交。你的交易按原参数执行,但价格已经被抬高,你在更差的价位买入。
- 反向卖出(back-run)。攻击者立刻卖出,赚走你造成的价差。
三笔交易构成一个“三明治”。你的损失不是被黑客转走,而是滑点被吃掉——链上一切合法,交易记录里看不出异常。

三、什么情况下会中招
三个条件同时成立才有肉:交易金额相对池子足够大、滑点容忍度设得过高、以及交易在内存池里可见。常见场景是:新币池子只有几万美元流动性,你却用市价单换 2,000 美元,滑点设了 5%;或者跟风抢开盘,把滑点拉到 10% 以上。
反过来,如果你的交易走私有通道、不进入公开内存池,或者滑点设在 0.1%–0.5%,攻击者的利润空间就被压到不够付 gas,通常会放弃。
四、四道防线,成本都很低
- 滑点设小。主流币对 0.1%–0.5% 足够;小池子也别超过 1%。设太小会失败,但失败只损失 gas,不损失本金。
- 用限价单或聚合器的保护模式。限价单不会在更差价格成交;部分聚合器提供 MEV 保护路由。
- 走私有 RPC。交易不进公开内存池,搜索者看不到你的 pending 单,抢跑的前提消失。
- 拆单。把一笔大额拆成 3–5 笔小额,每笔都在池子可承受的范围内,单笔利润不足以覆盖攻击成本。
五、攻击环节对照
| 环节 | 你看到的 | 实际发生 |
|---|---|---|
| 提交交易 | “处理中”,预计 30 秒 | 交易进入内存池,对搜索者可见 |
| 成交价格 | 比报价差 0.8%–3% | 有人在你前面买入了同一资产 |
| 区块确认 | “成功” | 抢跑者在你之后立即卖出 |
| 对账 | 余额少了 | 差额进了攻击者的钱包,不是被平台收走 |
六、三个常见误区
误区一:只有大户会被盯上。攻击是程序化的,阈值看的是“利润是否大于 gas”。在低费链上,几百美元的交易同样有肉。
误区二:把滑点设到 0 就安全。滑点过小会让交易频繁失败,尤其在波动大的时候;合理区间比极端值更有用。
误区三:交易成功就等于价格合理。成功只说明执行了,不说明执行得好。成交后核对实际均价,是唯一可靠的检验。
七、延伸阅读
- 交易卡在 pending 怎么办:nonce、加速与替换交易的规则
- 跨链桥的三种模型与它们的风险点:锁定铸造、流动性池、原生跨链
- 储备证明(PoR)证明了什么:默克尔树、快照时间与它的三个盲区
- DeFi 借贷的利率与清算是怎么算的:LTV、健康因子与资金利用率
常见问题
三明治攻击违法吗?
在多数司法辖区它不构成传统意义上的犯罪:交易在链上公开、按规则执行,攻击者只是利用了排序权。这也是它难以追回的原因。
被夹了能退款吗?
不能。链上交易不可撤销,损失不是被平台扣走,而是价差。唯一能做的是保留记录、调整参数,避免下一次。
滑点应该设多少?
主流币对 0.1%–0.5%;流动性较小的池子不超过 1%。设得比这更宽,等于主动把利润让给排序者。
私有 RPC 一定安全吗?
它切断了公开内存池的可见性,能显著降低被抢跑的概率,但不改变智能合约本身的风险。私密通道解决的是“被看见”,不是“合约有漏洞”。
为什么失败也要付 gas?
交易被打包进区块就会消耗计算资源,即使回滚也要付费。所以“滑点太小导致失败”的成本通常远低于“被夹一次”的成本。
说明:本文只讲机制与操作规则,不构成投资建议,也不预测任何资产价格。