在公开内存池里,一笔大额AMM兑换会提前暴露方向、数量和最低到账。攻击者若能从用户允许的滑点区间里获得利润,就可能把自己的两笔交易夹在用户前后,这就是三明治攻击。
三笔交易怎样形成利润
假设用户要用A买B。攻击者先抢跑,也用A买B,把池价推高;用户随后按更差价格成交;攻击者最后卖出刚买的B,吃掉价格回落产生的价差。攻击利润来自用户成交价格恶化,扣除两笔交易费用、Gas和竞争成本后仍需为正。
滑点为什么是攻击预算
用户设置amountOutMinimum,允许实际输出不低于该值。滑点越宽,攻击者可把价格推得越远而不让用户交易回滚;但设为零或极窄又会因正常价格波动、其他交易和区块延迟频繁失败。
| 防护 | 主要作用 | 局限 |
|---|---|---|
| 合理最小到账 | 压缩可利用价格区间 | 过窄会增加失败 |
| 选择深流动性池 | 降低同等金额价格影响 | 仍需核对代币与路由 |
| 拆分或限价 | 减少单笔暴露 | 多次交易增加费用和时间 |
| 私有/受保护提交 | 减少公开内存池可见性 | 有服务信任与回退风险 |
| 短deadline | 限制旧报价长期有效 | 不能单独阻止抢跑 |
先区分滑点与价格影响
价格影响是你的交易本身沿AMM曲线推动价格;滑点是报价与执行结果的允许偏差。小池的大额交易即使没有攻击,也会有明显价格影响。判断异常成交时,要比较预交易池状态、真实执行区块和同块前后交易,而不是看到输出低于页面初始报价就认定被夹。
如何复盘一笔可疑交易
固定用户交易所在区块,找到同池同方向的前置交易和紧随其后的反向交易;比较发送者、Gas出价、token流和攻击者最终余额;计算用户若在前置交易之前执行的理论输出;再扣除正常价格变化。完整证据应包含交易哈希、池地址和日志。
钱包怎样设置默认值
根据池深、交易规模、代币税费与市场波动动态建议滑点,同时给用户展示amountOutMinimum和价格影响。对高风险路由提供警告或受保护提交,不要用“滑点调高即可成功”作为通用错误处理。
“设置1%滑点”不是通用答案
可接受滑点应从池深、输入规模、报价有效时间和代币机制推导。聚合器给出的多跳路径还要逐池检查,表面深度很高的路由可能在中间池产生主要价格影响。带转账税、rebasing或回调逻辑的代币会让普通报价模型失真,不能仅靠放宽minimum output解决。
前端应同时展示报价、最小到账、预计价格影响、路由和deadline,并在用户修改滑点后重新计算潜在损失上限。对大额订单,可比较拆单后的总手续费与降低的MEV暴露;对私有提交,要说明若私有通道失败是否会自动广播到公共内存池。
合约端仍需保留硬约束
即使使用受保护RPC,交易合约也应带amountOutMinimum、有效deadline和预期池参数。私有通道只能降低可见性,不能防止区块构建者作恶、报价过期或错误路由。复盘时把用户签名的最小到账作为边界:如果成交低于它却未回滚,问题更可能出在实际调用函数或代币余额计算。
池内价格解读可参考Uniswap v3价格,交易日志见topics与data,签名连接风险可结合智能合约连接检查。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。