Caloogy 文章
English

MEV、三明治攻击与私有交易池

日期
2025 年 5 月 14 日
系列
链上
阅读
3 分钟
主题
OnchainMevSandwich attackFront running

一句话版本

你在以太坊上发出一笔兑换交易后,它会先在公开的内存池里等待被打包,所有人都能看到。专门的机器人看到你要大额买入某个代币,就抢在你前面先买(推高价格),等你以更高价格成交后再卖出,赚走差价。这叫三明治攻击,是 MEV(最大可提取价值)中最常见的一种。 用户层面的防御是:设置合理的滑点容忍度,以及把交易发给私有交易池,不在公开内存池里暴露。

全文分三层:

  1. 通俗理解:排队时被人插队
  2. 实际用处:MEV 的规模、Flashbots、私有 RPC
  3. 原理与工程要点:三明治的数学、滑点设置、其他类型的 MEV

第一层:通俗理解

1.1 排队时被人插队

你在拍卖会上举手说"我要以不超过 100 元的价格买下这件商品",声音很大,所有人都听见了。

一个精明的人抢先以 90 元买下,然后转手以 99 元卖给你。你仍然在"不超过 100 元"的范围内成交,没有察觉什么异常,但白白多付了 9 元。

区块链上:

你的交易被夹在两笔机器人交易中间,所以叫"三明治"。

1.2 谁在排序

区块里交易的顺序由出块方(以太坊合并后是验证者,通过专门的区块构建者)决定,他们自然会优先打包能给自己带来更多收益的交易组合。MEV 就是"通过安排交易的顺序、插入或剔除交易,能额外赚到的钱"。


第二层:实际用处


第三层:原理与工程要点

3.1 三明治的数学

恒定乘积池子:100 ETH 和 200,000 USDC(价格 2000)

没有攻击时:你用 20,000 USDC 买 ETH,得到 100−100×200,000220,000≈9.091 ETH.100 - \frac{100 \times 200{,}000}{220{,}000} \approx 9.091 \text{ ETH}. 你设置了 10% 的滑点容忍度,即至少要拿到约 8.18 ETH。

三明治:

  1. 机器人先用 10,000 USDC 买入,得到约 4.762 ETH,价格被推到 2205;
  2. 你的交易执行,只得到约 8.282 ETH,仍高于 8.18 的下限,交易成功;
  3. 机器人卖出 4.762 ETH,拿回约 11,941 USDC。

你少拿了约 0.81 ETH(约 8.9%),机器人赚了约 1941 USDC(未计手续费和池子费率)。(已用 Python 验算。)

关键观察:机器人能夹走多少,上限就是你允许的滑点。滑点设得越宽,被夹得越狠。

3.2 滑点设置的两难

滑点设置 结果
太宽(如 10%) 被夹的空间大
太窄(如 0.1%) 正常的价格波动就会让交易失败,白付手续费
合理 按池子流动性和交易规模估算;大额交易拆分或使用聚合器

3.3 其他常见的 MEV

类型 说明 对普通用户
套利 两个交易所价格不一致时搬砖,让价格回归一致 基本无害,甚至有益
清算 抢先清算借贷协议里抵押不足的仓位 协议设计的一部分
抢跑(front-running) 复制你发现的有利可图的交易,抢在你前面执行 有害,比如白帽救援交易被机器人抢走
三明治 见上 有害
JIT 流动性 在你的大额交易前瞬间添加流动性,赚取手续费后撤出 影响较小

3.4 对产品的启示


总结

层次 要点
直觉 喊价被人听见,被抢先买入再高价卖给你
本质 公开内存池 + 出块方决定交易顺序 = MEV
数学 被夹的上限就是你的滑点容忍度
防御 合理滑点;私有交易池 / 防夹 RPC;意图撮合