📣 Gate.io动态大使春日邀新大派送,赢精美周边及瓜分$2,000奖池!
💰️ 成功邀请人数前十名大使可获得Gate.io品牌冲锋衣、茶具套装、品牌卫衣等精美周边!
💰️ 其余大使每成功邀请一名好友可得 $10 奖励,总奖池高达 $2,000!
💰️ 您同时还可享受邀请好友完成任务的返佣福利和高达 500 USDT,累计福利丰厚!
还不是动态大使?立即报名👉️https://www.gate.io/questionnaire/4937
参与方式:
1️⃣ 成为动态大使,点击大使群邀请活动报名表单进行报名
2️⃣ 点击邀请页面“邀请好友”按钮,生成专属邀请链接,分享到Gate.io以外社交平台
邀请页面链接:https://www.gate.io/referral
立即加入成为Gate.io动态大使,解锁你的专属邀请福利!
活动时间: 3月20日17:00 - 3月30日24:00 (UTC+8)
活动详情:https://www.gate.io/announcements/article/43970
MEV三明治攻击全解析:从排序到闪兑的致命链条
作者:Daii 来源:mirror
上周三(3 月 12 日),一位加密交易者,被 MEV 攻击一次性损失 21.5 万美元的事情刷屏了。
简单来说,这位用户本想在 Uniswap v3 交易池中将价值 22.08 万美元的 USDC 稳定币兑换成等值的 USDT,结果却仅仅得到了 5,272 USDT,短短几秒内资产瞬间蒸发 21.57 万,见下图。
上图就是这笔交易的链上记录的截图。发生这种惨剧的根本原因,就是遭遇了区块链世界臭名昭著的「三明治攻击」(Sandwich Attack)。
最先披露此次 MEV 攻击的是 Michael(见上图),他解释说:
上面的内容存在笔误,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 个交易:
这一次 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 平台自身的安全性:
闪电兑换的设计初衷是为了更有效地进行链上套利(Arbitrage),但却不幸地被 MEV 攻击者利用,成为市场操纵的利器。
4.2 闪电兑换,是如何助攻的?
下面我们看图说画,一步一步来了解一下本次攻击的闪电兑换是如何实现的,见下图。
这笔交易(交易 1)过后,攻击者的账户余额减少了 109 万 USDC,因为归还给 Uniswap 的 1864 万 USDC 中只有 1755万 USDC 是从 Curve 换来的,其余的 109 万 USDC 是攻击者的自有资金。
你应该发现了,这一笔交易实际让攻击者损失了 109 万。但是,后面的交易 3,同样通过闪电交换的手法,不但把 109 万 USDC 拿回头了,而且,还赚了 20 多万。
下面我们根据 交易 3 的数据一步一步来分析一下。
你或许会惊讶,为什么攻击者愿意将高达 20 万美元的利润拱手让给验证者?
4.3 为什么要给 20 万美元的「小费」?
其实,这并不是慷慨,而是三明治攻击这种 MEV 攻击成功的必要条件:
因此,攻击者宁可牺牲绝大部分利润来确保攻击成功,并保留一定的利润给自己。
需要特别说明一下,MEV 攻击也是有成本的,在 Uniswap 闪电兑换有成本,在 Curve 交易也有成本,只是由于费率比较低大概是 0.01~0.05%,所以与攻击所得相比可以不值一提。
最后再提醒一下,MEV 攻击的防御其实也很简单,你只需:设定好滑点容忍度,不要超过 1%;大笔交易分几笔执行。所以,你大可不必因噎废食,从此不敢在 DEX(去中心化交易所)交易了。
结语:黑暗森林中的警示与启示
这起 21.5 万美元的 MEV 攻击事件,无疑是区块链世界“黑暗森林”法则的又一次残酷展现。它生动地揭示了在去中心化、无需许可的环境下,潜藏着利用机制漏洞攫取利益的复杂博弈。
从更高的层面来看,MEV 的出现是区块链透明性和可编程性双刃剑效应的体现。
这并非简单的黑客行为,而是对区块链底层机制的深刻理解和利用,它考验着协议设计的鲁棒性,也挑战着参与者的风险意识。
理解 MEV,认识其风险,才能更好地在这个充满机遇但也暗藏危机的数字世界中航行。记住,在区块链的“黑暗森林”中,唯有敬畏规则、提升认知,方能避免成为下一个被吞噬的猎物。
这也是我想通过本文努力达到的效果。