上周三(3 月 12 日),一位加密交易者,被 MEV 攻击一次性损失 21.5 万美元的事情刷屏了。
简单来说,这位用户本想在 Uniswap v3 交易池中将价值 22.08 万美元的 USDC 稳定币兑换成等值的 USDT,结果却仅仅得到了 5,272 USDT,短短几秒内资产瞬间蒸发 21.57 万,见下图。
上图就是这笔交易的链上记录的截图。发生这种惨剧的根本原因,就是遭遇了区块链世界臭名昭著的「三明治攻击」(Sandwich Attack)。
最先披露此次 MEV 攻击的是 Michael(见上图),他解释说:
An MEV bot front-ran the tx by swapping all the USDC liquidity out. After the transaction executed, they put back the liquidity. The attacker tipped a block builder (bobTheBuilder) $200k and profited $8k from this transaction.
译文:MEV 机器人通过换出所有 USDC 流动性来抢先 tx。交易执行后,他们放回流动性。攻击者向区块构建者 (bobTheBuilder) 打赏了 20 万美元,并从这笔交易中获利了 8000 美元。
上面的内容存在笔误,MEV 攻击机器人换出的是大量的 USDT,而不是 USDC。
不过,看完了他的解释和新闻报道,你可能还是一头雾水,因为里面有太多的新名词,像三明治攻击(Sandwich Attack)、抢先(front-ran the tx)、放回流动性(put back the liquidity)、向区块构建者打赏(tipped a block builder)等。
今天,我们将以这起 MEV 攻击为例,拆解其全过程,带你一探 MEV 这一黑暗世界。
首先,我们需要解释一下什么是 MEV。
1. MEV 是什么?
MEV 最初被称为矿工可提取价值(Miner Extractable Value),指的是矿工通过在区块链区块中对交易进行重新排序、插入或排除操作所能获得的额外利润 。这种操作可能导致普通用户付出更高的成本,或者获得更不利的交易价格 。
随着以太坊等区块链网络从工作量证明(Proof-of-Work,PoW)共识机制转向权益证明(Proof-of-Stake,PoS)共识机制,控制交易排序的权力从矿工转移到了验证者手中。因此,术语也相应地从“矿工可提取价值”(Miner Extractable Value)演变为“最大可提取价值” (Maximal Extractable Value)。
尽管名称发生了变化,但通过操纵交易顺序来提取价值的核心概念仍然一样。
上面的内容还是有点专业,你只需记住:MEV 之所以存在,是因为以前的矿工、现在的验证者拥有一项权利,对内存池(mempool)里的交易进行排序。这个排序是发生在一个区块里面,现在以太坊大概 11 秒左右出一个区块,那就是说每 11 秒就会有一次这样的权力行使。同样,这一次 MEV 攻击也是通过验证者排序实现的。
点击这个链接,你会看到与本次攻击相关的编号为 22029771 的区块所包含的交易内容,如下图。
请注意,上图 1、2、3 交易就是本文开头所说的那个 MEV 攻击,这个顺序是验证者(bobTheBuilder)排列好的。为什么可以这样?
2. MEV 的原理
要理解 MEV 的工作原理,我们需要先明白区块链是如何记录和更新信息的。
2.1 区块链状态更新机制
区块链可以被看作是一个不断增长的账本,它记录了所有发生的交易。这个账本的状态,例如每个账户的余额、Uniswap 交易池中各种代币的储备量等,都是由之前的交易决定的。
当一个新的区块被添加到区块链上时,这个区块中包含的所有交易都会被按照它们在区块中的排列顺序逐一执行。每执行一笔交易,区块链的全局状态就会相应地发生改变。
也就是说,不只是区块的顺序很重要,区块中的交易排序也很重要。那么区块中的交易排序又是如何决定的呢?
2.2 验证者决定交易排序
当用户在区块链网络上发起一笔交易时,例如这一笔通过 Uniswap 把 USDC 转换为 USDT 的交易,首先会被广播到网络中的节点。经过初步验证后,这笔交易会进入一个名为“内存池”(mempool)的区域。内存池就像一个等待区域,其中的交易尚未被确认并添加到区块链的下一个区块中。
以前的矿工(在 PoW 系统中),现在的验证者(在 PoS 系统中)有权从内存池中选择交易,并决定这些交易在下一个区块中的排列顺序。
区块中交易的顺序至关重要。在一个区块被最终确认并添加到区块链上之前,这个区块中的交易会按照验证者(比如 bobTheBuilder)确定的顺序执行。这意味着,如果一个区块中包含了多笔与同一个交易池交互的交易,那么这些交易的执行顺序将直接影响到每一笔交易的结果。
这种能力使得验证者可以优先处理特定交易、延迟或排除其他交易,甚至插入自己的交易来最大化利润。
本次交易的排序,同样重要,稍有差池就不可能攻击成功。
2.3 本次 MEV 攻击的交易排序
我们先简单了解一下,本次 MEV 攻击相关的 3 个交易:
交易 1(攻击者的第一个交易):在受害者的交易之前执行。这个交易的目的通常是推高受害者想要交易的代币的价格。
交易 2(受害者的交易):在攻击者的第一个交易之后执行。由于攻击者之前的操作,此时交易池中的价格对受害者不利,他需要付出更多的 USDC 才能换到等值的 USDT,或者只能换到更少的 USDT。
交易 3(攻击者的第二个交易):在受害者的交易之后执行。这个交易的目的通常是利用受害者交易造成的新的价格变动来获利。
这一次 MEV 攻击的验证者是 bob-The-Builder.eth,是他负责把交易排成 1、2、3 这样的顺序的。当然,bobTheBuilder 也不是白干的,他参与此次排序获得了 100 多个 ETH 的收入,相反 MEV 攻击发起者只有 8000 美元收入。他们的收入来源正是受害者的第二笔交易。
一句话,攻击者(MEV 机器人)与验证者(bobTheBuilder)合谋,让第二笔交易的受害者损失了 21.5 万美元,其中攻击者得 8000 美元,验证者得 20 万美元(100 多 ETH)。
他们采用的攻击方式有一个形象的名字——三明治攻击。下面,我们来一个交易一个交易的去讲解,让你彻底明白 MEV 比较复杂的三明治攻击到底是怎么一回事?
3. 三明治攻击全解析
之所以称之为三明治攻击(Sandwich Attack),是因为攻击者的两笔交易(交易 1 和交易 3)分别被放置在受害者交易(交易 2)之前和之后,使得整个交易顺序像三明治的结构(见上图)。
交易 1、交易 3 分别担负着不同的功能。简单说,交易 1 交易负责作案,交易 3 交易负责收割分赃。具体来说整个过程是这样的:
3.1 交易 1 ,负责提高 USDT 的价格
点击上图1 号交易的链接,你会看到 1 号交易的详细内容,攻击者提高 USDT 的价格也很直接,就是用 1865 万 USDC 把里面的 1758 万的 USDT全部换走了,见下图。
此时流动性池子里面的剩下的是大量的 USDC 和少量的 USDT。如果按照新闻报道所说,在攻击前,Uniswap 的流动性里分别有 1980 万左右的 USDC 和 USDT 的话,那么交易 1 执行后,池内仅剩 222 万 USDT(=1980-1758),而 USDC 余额增至约 3845 万(=1980+1865)。
此时这个池的 USDC 与 USDT 之间的兑换比例就远远不是 1:1 了,而是 1:17 了,也就是说此时需要 17 USDC 才能兑换到 1 个 USDT,不过这个比例只是大概,因为这个池是 V3 的,里面的流动性不是均匀分布的。
还有一点,我要告诉你。实际上攻击者并没有一次性动用 1865 万的 USDC,实际使用的 USDC 为 109 万,连 6% 都不到。他是如何做到的呢?等我们把攻击讲完了会再详细讲。
3.2 交易 2,执行 22 万 USDC 兑换 USDT
点击上图交易 2 的链接可以看到下图。
如上图,受害者的交易 2 因为交易 1 的影响, 22 万 USDC只得到了 5272 USDT,在不知不觉中损失了 17 万 USDT。为什么说是不知不觉呢?因为,如果受害者是通过 Uniswap 进行交易的,那么他提交交易的时候看到会是如下界面。
通过上图你会发现,受害者最少得到 22 万应该是有保障的。受害者之所以最后只得到了 5000 多 USDT 是因为产生了巨大的滑点,达到 90% 以上。但是,Uniswap 是有默认最大滑点 5.5% 限制的,见下图。
也就是说,如果受害者是通过 Uniswap 前端进行交易的,那么他应该至少会得到 208381 USDT(= 220510 * 94.5%)。你可能会有疑问了,为什么上面区块链记录里面会显示这笔交易是在「 Uniswap V3」进行的呢。
因为,区块链交易的前端与后端是分开的。上面所说的「 Uniswap V3」是指的 Uniswap 的 USDC-USDT 的资金池,这个池是公开的,任何交易的前端都可以通过这个池来交易。
也正因为这一点,有人怀疑受害者不简单,不是一般人,否则不会产生这么大的滑点,可能是利用 MEV 攻击在洗钱。这个,我们以后讲。
3.3 交易 3,收割 + 分赃
点击链接,可以查看交易 3 的详情,如上图。我们分别讲一下 A、B、C 三笔交易。
交易 A,将池里的流动性恢复正常,用 1732 万 USDT 换回了交易 1860 万 USDC;
交易 B,分赃准备,将部分收益——20.4 万 USDC 兑换为 105 ETH;
交易 C,分赃,将 100.558 ETH 支付给验证者 bob-The-Builder.eth。
至此,三明治攻击结束。
现在来回答上面提到的一个很重要的问题:攻击者如何用 109 万 USDC 实现了 1800 万的攻击的。
4. 攻击者是如何实现 1800 万 USDC 的池攻击的
攻击者之所以能只用109 万 USDC的本金,实现1800 万美元级别的攻击,是因为区块链世界存在一个神奇又特殊的机制——Uniswap V3 的闪电兑换(Flash Swap)。
4.1 什么是闪电兑换(Flash Swap)?
简单来说:
闪电兑换允许用户在同一笔交易中先从 Uniswap 池中取出资产,再用另一种资产(或同种资产加手续费)偿还。
只要整个操作在同一个交易内完成,Uniswap 就允许这种「先取货、再付款」的行为。请注意,必须是在同一个交易内完成。这样设计,是为了保障 Uniswap 平台自身的安全性:
零风险借贷:Uniswap 允许用户无抵押从池子临时取走资金(类似借贷),但必须在交易结束时立即偿还。
原子性(Atomicity): 整个操作必须是原子的,要么完全成功(资金归还),要么彻底失败(交易回滚)。
闪电兑换的设计初衷是为了更有效地进行链上套利(Arbitrage),但却不幸地被 MEV 攻击者利用,成为市场操纵的利器。
4.2 闪电兑换,是如何助攻的?
下面我们看图说画,一步一步来了解一下本次攻击的闪电兑换是如何实现的,见下图。
F1 攻击者通过自有的 701 WETH 从 AAVE 借出 109 万 USDC;
F2 攻击者发起闪电兑换请求,先从 Uniswap 池子取出 1758 万 USDT(此时无需先付款)攻击者账户临时增加了 1758 万 USDT;
F3 攻击者迅速将这 1758 万 USDT 投入 Curve 池,兑换回 1755 万 USDC 攻击者账户 USDT 减少 1758 万,USDC 增加 1755 万。通过下图你会发现,攻击者之所以选择 Curve 是因为这里的流动性很充足,USDT 有 7054 多万,USDC 也有 5071 万,滑点相对较低。
F4 攻击者再将 Curve 兑换来的 1755 万 USDC,加上自己原本准备的 109 万 USDC(Aave借贷所得),共 1864 万 USDC,一次性还给 Uniswap,闪电交换完成;
这笔交易(交易 1)过后,攻击者的账户余额减少了 109 万 USDC,因为归还给 Uniswap 的 1864 万 USDC 中只有 1755万 USDC 是从 Curve 换来的,其余的 109 万 USDC 是攻击者的自有资金。
你应该发现了,这一笔交易实际让攻击者损失了 109 万。但是,后面的交易 3,同样通过闪电交换的手法,不但把 109 万 USDC 拿回头了,而且,还赚了 20 多万。
下面我们根据 交易 3 的数据一步一步来分析一下。
K1 攻击者,用闪电交换取出在 Uniswap 1860 万 USDC;
K2 攻击者,通过用刚刚从 Uniswap 取出的 USDC 中的一部分 1730 万 USDC,换回了 1732 万 USDT;
K1 攻击者,把从 Curve 换回来的 1732 万 USDT 还给了 Uniswap。闪电交换完成。你需要注意的是,攻击者通过 K2 只花了 1730 万 USDC 就获得了 1732 万 USDT。余下的 130(= 1860-1730)万 USDC 中,有 109 万的自有资金,其余的 21 万 USDC 就是本次攻击的利润了。
K3 攻击者,把本金还回 AAVE,拿走自己 701 WETH,同时把 20 万 USDC 兑换成了 105 ETH,并把其中的 100.558 ETH 发给验证者作为小费(约 20 万美元),自己只留了 1 万美元不到的收益。
你或许会惊讶,为什么攻击者愿意将高达 20 万美元的利润拱手让给验证者?
4.3 为什么要给 20 万美元的「小费」?
其实,这并不是慷慨,而是三明治攻击这种 MEV 攻击成功的必要条件:
攻击成功的核心就是交易顺序的精准控制,而控制交易顺序的正是验证者(bobTheBuilder)。
验证者不仅帮助攻击者确保受害者的交易处于攻击交易之间,更关键的是验证者能确保其他竞争的 MEV 机器人无法插队或干扰攻击的顺利完成。
因此,攻击者宁可牺牲绝大部分利润来确保攻击成功,并保留一定的利润给自己。
需要特别说明一下,MEV 攻击也是有成本的,在 Uniswap 闪电兑换有成本,在 Curve 交易也有成本,只是由于费率比较低大概是 0.01~0.05%,所以与攻击所得相比可以不值一提。
最后再提醒一下,MEV 攻击的防御其实也很简单,你只需:设定好滑点容忍度,不要超过 1%;大笔交易分几笔执行。所以,你大可不必因噎废食,从此不敢在 DEX(去中心化交易所)交易了。
结语:黑暗森林中的警示与启示
这起 21.5 万美元的 MEV 攻击事件,无疑是区块链世界“黑暗森林”法则的又一次残酷展现。它生动地揭示了在去中心化、无需许可的环境下,潜藏着利用机制漏洞攫取利益的复杂博弈。
从更高的层面来看,MEV 的出现是区块链透明性和可编程性双刃剑效应的体现。
一方面,所有交易记录公开可查,使得攻击行为能够被追踪和分析;
另一方面,智能合约的复杂逻辑和交易执行的确定性,也为精明的参与者提供了可乘之机。
这并非简单的黑客行为,而是对区块链底层机制的深刻理解和利用,它考验着协议设计的鲁棒性,也挑战着参与者的风险意识。
理解 MEV,认识其风险,才能更好地在这个充满机遇但也暗藏危机的数字世界中航行。记住,在区块链的“黑暗森林”中,唯有敬畏规则、提升认知,方能避免成为下一个被吞噬的猎物。
这也是我想通过本文努力达到的效果。