目录
3 月 12 日星期三,加密货币社区遭受了一次重大 MEV(最大可提取值)攻击, 一名交易员在一次事件中损失了 215,000 美元。
简单来说,这位交易员打算在 Uniswap v3 交易池中用价值 220,800 美元的 USDC 换取等量的 USDT。然而,他们并没有收到预期的金额,而是只得到了 5,272 USDT。短短几秒钟内,215,700 美元就被抹去了——见下图。
上图是此次交易的区块链记录截图,而这场灾难的根源,是区块链世界里一个臭名昭著的漏洞,被称为 “三明治攻击”。
第一个披露这次 MEV 攻击的是一位名叫 Michael 的用户(见上图) 。他解释道:
“MEV 机器人通过交换所有 USDC 流动性抢先完成了交易。交易执行后,他们又放回了流动性。攻击者给区块构建者 (bobTheBuilder) 200,000 美元小费,并从这笔交易中获利 8,000 美元。”
然而 Michael 的解释有一个错误:MEV 攻击机器人并没有换出 USDC 而是换出了大量 USDT 。即使阅读了新闻和迈克尔的解释,您可能仍然会感到困惑,因为其中涉及许多技术术语,例如夹心攻击、抢先交易、恢复流动性和给区块建造者小费。
今天,我们将详细剖析这次 MEV 攻击,带您了解整个过程,揭开 MEV 背后的黑暗机制。
一、什么是 MEV?
MEV 最初被称为 “矿工可提取价值”
, 指的是矿工通过重新排序、插入或排除区块链区块内的交易而获得的额外利润。这些操纵可能会迫使普通用户支付更高的成本或获得更差的交易执行价格。
随着以太坊等区块链网络从工作量证明 (PoW) 过渡到权益证明 (PoS), 交易排序的控制权从矿工转移到验证者。 因此,该术语从“矿工可提取价值”
演变为 “最大可提取价值”
。
尽管名称发生变化,但根本概念保持不变:通过操纵交易订单来获取价值。
简而言之: MEV 的存在是因为矿工(以前)和验证者(现在)有权在将交易纳入区块之前对内存池中的交易进行排序。
由于以太坊大约每 11 秒生成一个新区块, 这意味着每 11 秒就会有人有机会重新排序交易以获取潜在利润。在这种情况下,MEV 攻击是通过验证者控制的排序来执行的。
点击这里 传送🚪查看区块#22029771 ,其中包含与此次攻击相关的交易。
如图所示,交易 1、2、3 构成了 MEV 攻击序列。这些交易是由验证者(bobTheBuilder)按照这个特定顺序排列的。 但为什么这是可能的呢?
二、MEV 的工作原理
要了解 MEV 如何运作,我们首先需要了解区块链如何记录和更新信息。
2.1 区块链状态更新机制
区块链可以看作是一个不断增长的账本,记录所有交易。区块链的状态 (包括 Uniswap 流动性池中的账户余额和代币储备)由过去的交易决定。当新区块添加到区块链时,该区块内的所有交易都会按其排列顺序依次执行。 每笔执行的交易都会更新区块链的全局状态。这意味着,不仅区块的顺序很重要, 区块内交易的顺序也同样重要。那么这个顺序是如何确定的呢?
2.2 验证者控制交易排序
当用户发起交易时,例如在 Uniswap 上将 USDC 兑换为 USDT,该交易首先被广播到网络节点。经过初步验证后,它会进入一个临时的内存池 ,作为未确认交易的等待区。过去, 矿工(在 PoW 下)控制交易顺序
;现在,在 PoS 下, 验证者继承了这一角色
。
由于区块内交易的顺序直接影响其执行结果,因此验证者可以优先处理某些交易、延迟或排除其他交易,甚至插入自己的交易以实现利润最大化
。这种能力在 MEV 攻击中至关重要—— 交易顺序的细微调整可能意味着成功与失败之间的差异。
2.3 此次 MEV 攻击中的交易排序
让我们简单分析一下此次攻击涉及的三笔交易 :
-
交易 1(攻击者的首次交易): 在受害者交易之前执行。此交易人为地抬高了受害者打算购买的资产的价格。
-
交易 2(受害者的交易): 在攻击者的第一笔交易后执行。由于价格操纵,受害者必须支付更多 USDC 才能获得相同数量的 USDT — 或者更糟的是,收到的 USDT 会少得多。
-
交易 3(攻击者的第二笔交易): 在受害者交易后执行。此交易利用受害者的损失来获取利润。
参与此次 MEV 攻击的验证者是 bob-The-Builder.eth
,他负责将交易按照 1、2、3 的顺序排列。当然, bobTheBuilder 做这些事也不是白做的 ,他从整理交易顺序中获利 100 多个 ETH 。相比之下,MEV 攻击者只赚了 8000 美元 ,他们的收入都是直接从受害者的交易(交易 2)中榨取
的。
简单来说, 攻击者(MEV bot
)和验证者(bobTheBuilder)
合谋 ,导致交易 2 中的受害者损失 215,000 美元 ,其中攻击者获得了 8,000 美元 ,而验证者拿走了 200,000 美元(超过 100 ETH)。
他们使用的攻击方法有一个相当描述性的名称——“三明治攻击”。 让我们逐一分解交易,以帮助您全面了解这种复杂的 MEV 攻击形式。
三、三明治攻击的全面分析
这种攻击之所以被称为 “三明治攻击” ,是因为攻击者策略性地将两笔交易(交易 1 和交易 3)放在受害者的交易(交易 2)周围,有效地将其“夹在中间”。 该序列类似于三明治的结构(见上图)。
每笔交易都有不同的功能:
交易一:执行攻击
交易二:受害者执行交换
交易三:攫取利润,分配战利品
整个过程如下:
3.1 交易 1——提高 USDT 的价格
点击交易 1 的链接(传送🚪) ,可以看到详细的交易数据, 攻击者推高 USDT 价格的方法简单直接, 用 1865 万美元的 USDC 从流动性池中换出 1758 万 USDT (如下图所示)。
此时,流动资金池中剩余大量 USDC 和极少的 USDT 。据新闻报道,在攻击发生之前,Uniswap 流动资金池中约有 1980 万 USDC 和 1980 万 USDT 。在交易 1 之后,池中只剩下 222 万 USDT (19.8M — 17.58M),而 USDC 余额增加至 3845 万(19.8M + 18.65M)。
这意味着 USDC 兑 USDT 的汇率不再是 1:1,而是飙升至 1:17——这意味着需要 17 USDC 才能兑换 1 USDT。 然而,这个汇率只是一个近似值,因为 Uniswap v3 的流动性分布并不均匀。
重点是: 攻击者实际上并没有一次性动用 1865 万美元, 实际动用的金额只有 109 万美元 ,不到总额的 6%。 这是如何做到的?我们将在分析攻击过程后进行解释。
3.2 交易 2 — 受害者执行交换(220,000 USDC → USDT)
点击交易 2 的链接(传送🚪) ,您将看到详细的交易数据。
由于交易 1 的影响,受害者的 220,000 USDC 只产生了 5,272 USDT,实际上在不知情的情况下损失了 170,000 USDT。 为什么说在不知情的情况下 ?因为如果受害者通过 Uniswap 的官方前端执行此交换,他们会看到一个非常不同的界面。
上图显示,受害者本应收到 Uniswap 保证的至少 220,000 USDT 。然而,由于滑点严重(超过 90%) ,他们最终只得到了 5,000 多 USDT 。但 Uniswap 默认的最大滑点限制为 5.5% (见下图)。
这意味着, 如果受害者使用了 Uniswap 的官方前端,他们应该至少收到 208,381 USDT(220,510 × 94.5%)。 你可能会想: 为什么区块链记录显示这笔交易是在“Uniswap V3”上执行的?
这是因为前端界面和实际的区块链交易是分开的。 这里的 “Uniswap V3” 是指 USDC-USDT 流动性池,它是公开的。 任何第三方前端都可以通过这个池子执行交易。因此,有人怀疑受害者可能不是普通用户。 异常大的滑点表明他们可能故意触发 MEV 攻击以达到洗钱的目的
。 这是我们未来将要探讨的话题。
3.3 交易3——获取利润并分配战利品
单击交易 3 的链接(传送🚪) ,我们可以将其分解为三个关键子交易 :
- 交易 A: 恢复流动性——攻击者将 1732 万 USDT 换回 1860 万 USDC 。
- 交易 B: 准备分配利润——攻击者将 204,000 美元的 USDC 兑换成 105 ETH 。
- 交易 C: 分配利润——向验证者 bob-The-Builder.eth 支付 100.558 ETH
至此, 三明治攻击完毕。
现在,我们来回答一个关键问题: 攻击者如何仅用 109 万美元 USDC 实施价值 1800 万美元的攻击?
四、攻击者如何仅用 109 万美元 USDC 执行 1800 万美元的掉期交易?
攻击者之所以能够仅利用 109 万美元的 USDC 来实施 1800 万美元的攻击, 得益于区块链世界中独特的机制——Uniswap v3 的 Flash Swap。
4.1 什么是闪电兑?
闪电兑允许用户首先从 Uniswap 池中提取资产,然后在同一笔交易中使用另一种资产(或同一资产加上费用)偿还。
只要整个操作在单笔交易内完成 ,Uniswap 就允许这种 “先取后付” 的行为
。系统这样设计是为了保护 Uniswap 本身:
- Zero-Risk Lending:(零风险借贷): Uniswap 允许用户无需抵押即可从池中暂时提取资产,但必须在同一笔交易内偿还。
- Atomicity(原子性): 整个操作必须是原子的 ——要么成功完成(偿还资金),要么完全失败(交易回滚)。
闪电交换最初旨在促进链上套利, 但不幸的是,它被 MEV 攻击者利用作为市场操纵工具。
4.2 闪电交换如何助长攻击?
让我们一步一步分析一下这次攻击中闪存交换机制是如何使用的。请参阅下图以获得更清晰的理解。
-
F1: 攻击者在 AAVE 上使用 701 WETH 作为抵押借入了 109 万美元的 USDC 。
-
F2: 攻击者发起闪电互换 , 从 Uniswap 流动性池中提取 1758 万美元 USDT (不立即偿还)。攻击者的余额暂时增加了 1758 万美元 USDT 。
-
F3: 攻击者将 1758 万美元的 USDT 换入 Curve 流动性池 ,获得 1755 万美元的 USDC 。攻击者之所以选择 Curve,是因为其流动性强 ——该池中有超过 7054 万美元的 USDT 和 5071 万美元的 USDC ,确保滑点最小 。
-
F4: 攻击者将来自 Curve 的 1755 万美元 USDC 与原本从 AAVE 借入的 109 万美元 USDC 合并 ,总计 1864 万美元 USDC ,全额偿还 Uniswap, 完成闪电互换 。
在交易 1 之后,攻击者的余额减少了 109 万美元 USDC ,因为在偿还给 Uniswap 的 1864 万美元 USDC 中, 只有 1755 万美元来自 Curve ,剩下的 109 万美元 USDC 是他们的自有资金。
你可能注意到,这笔交易给攻击者造成了 109 万美元的损失 。然而,在交易 3 中,通过另一笔闪电互换 ,攻击者不仅收回了 109 万美元 ,还额外赚了 20 万美元 。
现在,我们来一步步分析一下交易 3 。
- K1: 攻击者执行了另一次闪兑 , 从 Uniswap 中提取了 1860 万美元的 USDC 。
- K2: 攻击者用提取的 1730 万美元 USDC 换取了 1732 万美元的 USDT 。
- K3: 攻击者将 1732 万美元 USDT 偿还给 Uniswap ,完成了闪兑过程 。 需要注意的是,攻击者只需要 1730 万美元 USDC 就能在 K2 中获得 1732 万美元 USDT ,也就是说还有 130 万美元 USDC ( 1860 万美元 — 1730 万美元 )的盈余,其中 109 万美元是攻击者的本金 ,剩余的 21 万美元是攻击的纯利润 。
- K4: 攻击者偿还了原始 AAVE 贷款,取回了 701 WETH 。
- K5: 攻击者用 200,000 美元的 USDC 换取 105 ETH ,然后向验证者 bob-The-Builder.eth 支付 100.558 ETH 作为“小费”(价值约 200,000 美元 )。攻击者自己保留了不到 10,000 美元 。
此时,你可能会想: 为什么攻击者愿意将 20 万美元的利润交给验证者?
4.3 攻击者为什么要向验证者支付 20 万美元的“小费”?
这并不是慷慨 ,而是确保三明治袭击成功所必需的代价 。
- 成功的 MEV 攻击的核心是精确的交易排序。
- 交易顺序由 bobTheBuilder 等验证器控制。
- 验证器确保受害者的交易夹在攻击者的交易之间,并防止竞争的 MEV 机器人干扰。
通过提供很大一部分利润 ,攻击者获得了顺利执行三明治攻击的独家访问权 ,确保没有其他 MEV 机器人能够抢先一步。
此外,MEV 攻击还有其固有成本 :
Uniswap 上的闪电交换需要收取费用。然而,这些费用通常很低(约为 0.01%-0.05%) ,与攻击带来的利润相比可以忽略不计。
五、总结
这次 215,000 美元的 MEV 攻击再次残酷地提醒了我们区块链的“黑暗森林”法则
,生动地说明了在去中心化、无需许可的系统中,如何利用复杂的博弈论和协议机制的利用来获取经济利益。从更广泛的层面来看,MEV 代表着区块链透明度和可编程性的双刃剑 :
从积极的一面
来看 ,所有交易记录都是公开的,从而可以追踪和分析攻击。
不利的一面
是 ,智能合约执行的确定性为老练的参与者提供了利用漏洞的机会。
这不是一次简单的黑客攻击 ,而是对区块链底层机制的深度理解和运用,考验协议设计的稳健性 , 考验市场参与者的风险意识 。
为了保护自己免受 MEV 攻击 ,请考虑以下简单的预防措施:
设置滑点公差 ——避免将其设置为高于 1% 。
因此, 没有必要恐慌或完全避开 DEX 。相反,了解 MEV 及其风险将帮助你驾驭这个机遇与危险并存的数字环境 。在区块链的“黑暗森林” 中,只有尊重规则、增强知识的人,才能避免成为下一个不知情的猎物。