MEV三明治攻擊全解析:從排序到閃兌的致命鏈條

作者:Daii 來源:mirror

上週三(3 月 12 日),一位加密交易者,被 MEV 攻擊一次性損失 21.5 萬美元的事情刷屏了。

d40IzkNmiRRIQY5uP5wMz1zpFo0cMqNwhmogZmhk.png

簡單來說,這位用戶本想在 Uniswap v3 交易池中將價值 22.08 萬美元的 USDC 穩定幣兌換成等值的 USDT,結果卻僅僅得到了 5,272 USDT,短短几秒內資產瞬間蒸發 21.57 萬,見下圖。

yDgyTJBzWhnGWbbjWdCfwzNHy2RWfixeFPAhUl16.png

上圖就是這筆交易的鏈上記錄的截圖。發生這種慘劇的根本原因,就是遭遇了區塊鏈世界臭名昭著的「三明治攻擊」(Sandwich Attack)。

kf5CcjkRVjOcv2Tj5LM63tYSNd150MXNqxzlLXgj.png

最先披露此次 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 的區塊所包含的交易內容,如下圖。

gOBtJtdKthPSTi4uxT3qT8ZxgrXMXxlFAbOEp7RC.png

請注意,上圖 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 個交易:

dOFw7Sh0V9EIVxqeuCZIDFbCHSXZ7Sl9JXeXJUue.png

  • 交易 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全部換走了,見下圖。

vi4i8ramCtgyZuTSNZLLVLsqry8MONxhGPRUVOsC.png

此時流動性池子裡面的剩下的是大量的 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 的鏈接可以看到下圖。

x3kBJKcYVyM44HJSUHuIxVQ1ScIutWsoZ6JuRvM7.png

如上圖,受害者的交易 2 因為交易 1 的影響, 22 萬 USDC只得到了 5272 USDT,在不知不覺中損失了 17 萬 USDT。為什麼說是不知不覺呢?因為,如果受害者是通過 Uniswap 進行交易的,那麼他提交交易的時候看到會是如下界面。

rqLjmsxfcI06dN56OvKVyTctzoiWpvUPvCyEWYom.png

通過上圖你會發現,受害者最少得到 22 萬應該是有保障的。受害者之所以最後只得到了 5000 多 USDT 是因為產生了巨大的滑點,達到 90% 以上。但是,Uniswap 是有默認最大滑點 5.5% 限制的,見下圖。

Qlpu7GNLheCyBJtsy2LEgpo0vVP2oENI4sGcSiiW.png

也就是說,如果受害者是通過 Uniswap 前端進行交易的,那麼他應該至少會得到 208381 USDT(= 220510 * 94.5%)。你可能會有疑問了,為什麼上面區塊鏈記錄裡面會顯示這筆交易是在「 Uniswap V3」進行的呢。

因為,區塊鏈交易的前端與後端是分開的。上面所說的「 Uniswap V3」是指的 Uniswap 的 USDC-USDT 的資金池,這個池是公開的,任何交易的前端都可以通過這個池來交易。

也正因為這一點,有人懷疑受害者不簡單,不是一般人,否則不會產生這麼大的滑點,可能是利用 MEV 攻擊在洗錢。這個,我們以後講。

3.3 交易 3,收割 + 分贓

hco4wljEJ9HngbaT8S3asZcEGGNpt9HjUPoAA1ka.png

點擊鏈接,可以查看交易 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 閃電兌換,是如何助攻的?

下面我們看圖說畫,一步一步來了解一下本次攻擊的閃電兌換是如何實現的,見下圖。

S6eRIwZXTXtWBU7tUaAjr9bvAm2RIPpdoyjiHnhn.png

  • 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 萬,滑點相對較低。

o1LnGSaUlzRjt7vqs5YOy0wqTRznOxzRkjVHSdEw.png

  • 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 多萬。

oKE3vvGoW8lIISTane5LmOrh3BrDYyLV5PxHLXkM.png

下面我們根據 交易 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,認識其風險,才能更好地在這個充滿機遇但也暗藏危機的數字世界中航行。記住,在區塊鏈的“黑暗森林”中,唯有敬畏規則、提升認知,方能避免成為下一個被吞噬的獵物。

這也是我想通過本文努力達到的效果。

查看原文
本頁面內容僅供參考,非招攬或要約,也不提供投資、稅務或法律諮詢。詳見聲明了解更多風險披露。
  • 讚賞
  • 留言
  • 分享
留言
0/400
暫無留言
交易,隨時隨地
qrCode
掃碼下載 Gate.io APP
社群列表
繁體中文
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • ไทย
  • Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)