三明治攻击自救配置:滑点、拆单与私发送的实操清单 图 1
三明治攻击自救配置:滑点、拆单与私发送的实操清单 · 图 1

三明治攻击是链上交易成本里最隐蔽的一项。它不需要协议有漏洞,也不需要你的私钥泄露,只利用两个公开事实:你的交易签名后先落入等待打包的内存池,而执行顺序由出块方按出价排列。攻击者看到你的大额买入后,用更高的费用抢在你前面买入同一资产,把你顶到更高的价格成交,再在你成交后立刻卖出离场。你多付的价差、加上前后两笔夹单制造的额外滑点,就是整场攻击的全部利润来源。

理解成立条件就知道防护从哪里下手。第一,你的交易必须先在公共内存池里暴露意图,看不见意图就无从夹起。第二,你的单量要大到推动价格,夹一笔几百美元的小单通常连 gas 都收不回。第三,你的滑点容忍度要宽到足以吞下攻击者制造的价格移动,滑点设死则攻击交易反而会让你的交易失败重发。三个条件任何一个被掐断,攻击就不成立,对应的防护参数也就清晰了。

第一个可调的是滑点容忍度。滑点的本质是你写给协议的成交底线:价格比报价差过这个百分比,交易就回滚。把它从默认的百分之零点五收窄到接近你预期的正常波动,夹单制造的价差就更容易顶爆你的底线让交易失败而不是被吃掉。代价是失败率上升、白付一次 gas,所以合理做法是流动性好的主流交易对用窄滑点,冷门池或行情剧烈时段宁可分批也不放宽。第二个是交易截止时间,把几十分钟的默认值压到一两分钟,攻击者抢跑窗口被压缩,你的过期报价也不会被隔很久再执行。

第三个是拆单。既然夹单只吃大单,把一笔大额兑换拆成多笔稍小的、间隔几个区块的交易,就同时摊薄了每次的市场冲击和被夹的收益空间。手工做费时,多数聚合器本身就有拆单路由,可以确认它是否把子单分散到不同时段或不同池子执行。第四个是私有发送通道:把签好的交易直接交给出块方而不是广播进公共内存池,交易在落块前对所有人不可见,从根上消灭可被夹的窗口。这类通道的可靠性取决于承接方的诚实度和排队规则,属于概率性防护,对大仓位建议和滑点控制叠加使用。

把这些参数装进一个真实流程:你要用稳定币换成某主流资产,金额可观。先看池子深度估算这笔单自身的价格影响,作为滑点地板;把滑点设在地板之上留一点点余量,截止时间压到一到两个区块;如果金额推价格明显,就让聚合器拆道或手工分两三笔错开区块;最后走带 MEV 保护的发送选项提交。三笔动作做完,夹单的经济性基本归零。

最后一层认知是成本与收益的对称。防护不是免费的:窄滑点换来失败重试的 gas,短截止时间换来偶发的过期重敲,私有通道可能收一笔服务费。小钱不值得全副武装,大仓位则值得把清单跑全。真正糟糕的组合是永远用页面默认值——那些默认参数为顺畅成交设计,不为你的本金设计。每次交易前花半分钟按单量和池深重设一遍,是把默认值重新校准回自己利益的过程。

还有一个容易被忽略的细节是成交后的对账习惯。执行完一笔较大兑换后,把页面报价、区块浏览器里实际成交价和你预先估算的价格影响放在一起对比:三个数字基本吻合,说明防护参数配置得当;若实际成交明显差于报价,先检查是不是走了被公开广播的路径、滑点是否过宽、子单是否挤在同一区块。把这种事后对账做成模板记录几周,你会很快摸清自己常用交易对在正常时段和拥挤时段的成本分布,下次设滑点时就不再是猜数字,而是按自己链上的历史分布取值。

风险提示:各类 MEV 防护通道与执行环境的行为可能变化,防护参数只能降低而不能消除夹单损失,本文是操作机制说明,不构成投资建议。

三明治攻击自救配置:滑点、拆单与私发送的实操清单 图 2
三明治攻击自救配置:滑点、拆单与私发送的实操清单 · 图 2