作者:Daii 來(lái)源:mirror
上周三(3 月 12 日),一位加密交易者,被 MEV 攻擊一次性損失 21.5 萬(wàn)美元的事情刷屏了。
簡(jiǎn)單來(lái)說(shuō),這位用戶(hù)本想在 Uniswap v3 交易池中將價(jià)值 22.08 萬(wàn)美元的 USDC 穩(wěn)定幣兌換成等值的 USDT,結(jié)果卻僅僅得到了 5,272 USDT,短短幾秒內(nèi)資產(chǎn)瞬間蒸發(fā) 21.57 萬(wàn),見(jiàn)下圖。
上圖就是這筆交易的鏈上記錄的截圖。發(fā)生這種慘劇的根本原因,就是遭遇了區(qū)塊鏈?zhǔn)澜绯裘阎摹溉髦喂簟梗⊿andwich Attack)。
最先披露此次 MEV 攻擊的是 Michael(見(jiàn)上圖),他解釋說(shuō):
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 機(jī)器人通過(guò)換出所有 USDC 流動(dòng)性來(lái)?yè)屜?tx。交易執(zhí)行后,他們放回流動(dòng)性。攻擊者向區(qū)塊構(gòu)建者 (bobTheBuilder) 打賞了 20 萬(wàn)美元,并從這筆交易中獲利了 8000 美元。
上面的內(nèi)容存在筆誤,MEV 攻擊機(jī)器人換出的是大量的 USDT,而不是 USDC。
不過(guò),看完了他的解釋和新聞報(bào)道,你可能還是一頭霧水,因?yàn)槔锩嬗刑嗟男旅~,像三明治攻擊(Sandwich Attack)、搶先(front-ran the tx)、放回流動(dòng)性(put back the liquidity)、向區(qū)塊構(gòu)建者打賞(tipped a block builder)等。
今天,我們將以這起 MEV 攻擊為例,拆解其全過(guò)程,帶你一探 MEV 這一黑暗世界。
首先,我們需要解釋一下什么是 MEV。
MEV 最初被稱(chēng)為礦工可提取價(jià)值(Miner Extractable Value),指的是礦工通過(guò)在區(qū)塊鏈區(qū)塊中對(duì)交易進(jìn)行重新排序、插入或排除操作所能獲得的額外利潤(rùn) 。這種操作可能導(dǎo)致普通用戶(hù)付出更高的成本,或者獲得更不利的交易價(jià)格 。
隨著以太坊等區(qū)塊鏈網(wǎng)絡(luò)從工作量證明(Proof-of-Work,PoW)共識(shí)機(jī)制轉(zhuǎn)向權(quán)益證明(Proof-of-Stake,PoS)共識(shí)機(jī)制,控制交易排序的權(quán)力從礦工轉(zhuǎn)移到了驗(yàn)證者手中。因此,術(shù)語(yǔ)也相應(yīng)地從“礦工可提取價(jià)值”(Miner Extractable Value)演變?yōu)椤白畲罂商崛r(jià)值” (Maximal Extractable Value)。
盡管名稱(chēng)發(fā)生了變化,但通過(guò)操縱交易順序來(lái)提取價(jià)值的核心概念仍然一樣。
上面的內(nèi)容還是有點(diǎn)專(zhuān)業(yè),你只需記?。篗EV 之所以存在,是因?yàn)橐郧暗牡V工、現(xiàn)在的驗(yàn)證者擁有一項(xiàng)權(quán)利,對(duì)內(nèi)存池(mempool)里的交易進(jìn)行排序。這個(gè)排序是發(fā)生在一個(gè)區(qū)塊里面,現(xiàn)在以太坊大概 11 秒左右出一個(gè)區(qū)塊,那就是說(shuō)每 11 秒就會(huì)有一次這樣的權(quán)力行使。同樣,這一次 MEV 攻擊也是通過(guò)驗(yàn)證者排序?qū)崿F(xiàn)的。
點(diǎn)擊這個(gè)鏈接,你會(huì)看到與本次攻擊相關(guān)的編號(hào)為 22029771 的區(qū)塊所包含的交易內(nèi)容,如下圖。
請(qǐng)注意,上圖 1、2、3 交易就是本文開(kāi)頭所說(shuō)的那個(gè) MEV 攻擊,這個(gè)順序是驗(yàn)證者(bobTheBuilder)排列好的。為什么可以這樣?
要理解 MEV 的工作原理,我們需要先明白區(qū)塊鏈?zhǔn)侨绾斡涗浐透滦畔⒌摹?/p>
區(qū)塊鏈可以被看作是一個(gè)不斷增長(zhǎng)的賬本,它記錄了所有發(fā)生的交易。這個(gè)賬本的狀態(tài),例如每個(gè)賬戶(hù)的余額、Uniswap 交易池中各種代幣的儲(chǔ)備量等,都是由之前的交易決定的。
當(dāng)一個(gè)新的區(qū)塊被添加到區(qū)塊鏈上時(shí),這個(gè)區(qū)塊中包含的所有交易都會(huì)被按照它們?cè)趨^(qū)塊中的排列順序逐一執(zhí)行。每執(zhí)行一筆交易,區(qū)塊鏈的全局狀態(tài)就會(huì)相應(yīng)地發(fā)生改變。
也就是說(shuō),不只是區(qū)塊的順序很重要,區(qū)塊中的交易排序也很重要。那么區(qū)塊中的交易排序又是如何決定的呢?
當(dāng)用戶(hù)在區(qū)塊鏈網(wǎng)絡(luò)上發(fā)起一筆交易時(shí),例如這一筆通過(guò) Uniswap 把 USDC 轉(zhuǎn)換為 USDT 的交易,首先會(huì)被廣播到網(wǎng)絡(luò)中的節(jié)點(diǎn)。經(jīng)過(guò)初步驗(yàn)證后,這筆交易會(huì)進(jìn)入一個(gè)名為“內(nèi)存池”(mempool)的區(qū)域。內(nèi)存池就像一個(gè)等待區(qū)域,其中的交易尚未被確認(rèn)并添加到區(qū)塊鏈的下一個(gè)區(qū)塊中。
以前的礦工(在 PoW 系統(tǒng)中),現(xiàn)在的驗(yàn)證者(在 PoS 系統(tǒng)中)有權(quán)從內(nèi)存池中選擇交易,并決定這些交易在下一個(gè)區(qū)塊中的排列順序。
區(qū)塊中交易的順序至關(guān)重要。?在一個(gè)區(qū)塊被最終確認(rèn)并添加到區(qū)塊鏈上之前,這個(gè)區(qū)塊中的交易會(huì)按照驗(yàn)證者(比如 bobTheBuilder)確定的順序執(zhí)行。這意味著,如果一個(gè)區(qū)塊中包含了多筆與同一個(gè)交易池交互的交易,那么這些交易的執(zhí)行順序?qū)⒅苯佑绊懙矫恳还P交易的結(jié)果。
這種能力使得驗(yàn)證者可以?xún)?yōu)先處理特定交易、延遲或排除其他交易,甚至插入自己的交易來(lái)最大化利潤(rùn)。
本次交易的排序,同樣重要,稍有差池就不可能攻擊成功。
我們先簡(jiǎn)單了解一下,本次 MEV 攻擊相關(guān)的 3 個(gè)交易:
交易 1(攻擊者的第一個(gè)交易):?在受害者的交易之前執(zhí)行。這個(gè)交易的目的通常是推高受害者想要交易的代幣的價(jià)格。
交易 2(受害者的交易):?在攻擊者的第一個(gè)交易之后執(zhí)行。由于攻擊者之前的操作,此時(shí)交易池中的價(jià)格對(duì)受害者不利,他需要付出更多的 USDC 才能換到等值的 USDT,或者只能換到更少的 USDT。
交易 3(攻擊者的第二個(gè)交易):?在受害者的交易之后執(zhí)行。這個(gè)交易的目的通常是利用受害者交易造成的新的價(jià)格變動(dòng)來(lái)獲利。
這一次 MEV 攻擊的驗(yàn)證者是 bob-The-Builder.eth,是他負(fù)責(zé)把交易排成 1、2、3 這樣的順序的。當(dāng)然,bobTheBuilder 也不是白干的,他參與此次排序獲得了 100 多個(gè) ETH 的收入,相反 MEV 攻擊發(fā)起者只有 8000 美元收入。他們的收入來(lái)源正是受害者的第二筆交易。
一句話,攻擊者(MEV 機(jī)器人)與驗(yàn)證者(bobTheBuilder)合謀,讓第二筆交易的受害者損失了 21.5 萬(wàn)美元,其中攻擊者得 8000 美元,驗(yàn)證者得 20 萬(wàn)美元(100 多 ETH)。
他們采用的攻擊方式有一個(gè)形象的名字——三明治攻擊。下面,我們來(lái)一個(gè)交易一個(gè)交易的去講解,讓你徹底明白 MEV 比較復(fù)雜的三明治攻擊到底是怎么一回事?
之所以稱(chēng)之為三明治攻擊(Sandwich Attack),是因?yàn)楣粽叩膬晒P交易(交易 1 和交易 3)分別被放置在受害者交易(交易 2)之前和之后,使得整個(gè)交易順序像三明治的結(jié)構(gòu)(見(jiàn)上圖)。
交易 1、交易 3 分別擔(dān)負(fù)著不同的功能。簡(jiǎn)單說(shuō),交易 1 交易負(fù)責(zé)作案,交易 3 交易負(fù)責(zé)收割分贓。具體來(lái)說(shuō)整個(gè)過(guò)程是這樣的:
點(diǎn)擊上圖?1 號(hào)交易的鏈接,你會(huì)看到 1 號(hào)交易的詳細(xì)內(nèi)容,攻擊者提高 USDT 的價(jià)格也很直接,就是用 1865 萬(wàn) USDC 把里面的 1758 萬(wàn)的 USDT全部換走了,見(jiàn)下圖。
此時(shí)流動(dòng)性池子里面的剩下的是大量的 USDC 和少量的 USDT。如果按照新聞報(bào)道所說(shuō),在攻擊前,Uniswap 的流動(dòng)性里分別有 1980 萬(wàn)左右的 USDC 和 USDT 的話,那么交易 1 執(zhí)行后,池內(nèi)僅剩 222 萬(wàn) USDT(=1980-1758),而 USDC 余額增至約 3845 萬(wàn)(=1980+1865)。
此時(shí)這個(gè)池的 USDC 與 USDT 之間的兌換比例就遠(yuǎn)遠(yuǎn)不是 1:1 了,而是 1:17 了,也就是說(shuō)此時(shí)需要 17 USDC 才能兌換到 1 個(gè) USDT,不過(guò)這個(gè)比例只是大概,因?yàn)檫@個(gè)池是 V3 的,里面的流動(dòng)性不是均勻分布的。
還有一點(diǎn),我要告訴你。實(shí)際上攻擊者并沒(méi)有一次性動(dòng)用 1865 萬(wàn)的 USDC,實(shí)際使用的 USDC 為 109 萬(wàn),連 6% 都不到。他是如何做到的呢?等我們把攻擊講完了會(huì)再詳細(xì)講。
點(diǎn)擊上圖交易 2 的鏈接可以看到下圖。
如上圖,受害者的交易 2 因?yàn)榻灰?1 的影響, 22 萬(wàn) USDC只得到了 5272 USDT,在不知不覺(jué)中損失了 17 萬(wàn) USDT。為什么說(shuō)是不知不覺(jué)呢?因?yàn)椋绻芎φ呤峭ㄟ^(guò) Uniswap 進(jìn)行交易的,那么他提交交易的時(shí)候看到會(huì)是如下界面。
通過(guò)上圖你會(huì)發(fā)現(xiàn),受害者最少得到 22 萬(wàn)應(yīng)該是有保障的。受害者之所以最后只得到了 5000 多 USDT 是因?yàn)楫a(chǎn)生了巨大的滑點(diǎn),達(dá)到 90% 以上。但是,Uniswap 是有默認(rèn)最大滑點(diǎn) 5.5% 限制的,見(jiàn)下圖。
也就是說(shuō),如果受害者是通過(guò) Uniswap 前端進(jìn)行交易的,那么他應(yīng)該至少會(huì)得到 208381 USDT(= 220510 * 94.5%)。你可能會(huì)有疑問(wèn)了,為什么上面區(qū)塊鏈記錄里面會(huì)顯示這筆交易是在「 Uniswap V3」進(jìn)行的呢。
因?yàn)?,區(qū)塊鏈交易的前端與后端是分開(kāi)的。上面所說(shuō)的「 Uniswap V3」是指的 Uniswap 的 USDC-USDT 的資金池,這個(gè)池是公開(kāi)的,任何交易的前端都可以通過(guò)這個(gè)池來(lái)交易。
也正因?yàn)檫@一點(diǎn),有人懷疑受害者不簡(jiǎn)單,不是一般人,否則不會(huì)產(chǎn)生這么大的滑點(diǎn),可能是利用 MEV 攻擊在洗錢(qián)。這個(gè),我們以后講。
點(diǎn)擊鏈接,可以查看交易 3 的詳情,如上圖。我們分別講一下 A、B、C 三筆交易。
交易 A,將池里的流動(dòng)性恢復(fù)正常,用 1732 萬(wàn) USDT 換回了交易 1860 萬(wàn) USDC;
交易 B,分贓準(zhǔn)備,將部分收益——20.4 萬(wàn) USDC 兌換為 105 ETH;
交易 C,分贓,將 100.558 ETH 支付給驗(yàn)證者 bob-The-Builder.eth。
至此,三明治攻擊結(jié)束。
現(xiàn)在來(lái)回答上面提到的一個(gè)很重要的問(wèn)題:攻擊者如何用 109 萬(wàn) USDC 實(shí)現(xiàn)了 1800 萬(wàn)的攻擊的。
攻擊者之所以能只用?109 萬(wàn) USDC?的本金,實(shí)現(xiàn)?1800 萬(wàn)美元級(jí)別?的攻擊,是因?yàn)閰^(qū)塊鏈?zhǔn)澜绱嬖谝粋€(gè)神奇又特殊的機(jī)制——Uniswap V3 的閃電兌換(Flash Swap)。
簡(jiǎn)單來(lái)說(shuō):
閃電兌換允許用戶(hù)在同一筆交易中先從 Uniswap 池中取出資產(chǎn),再用另一種資產(chǎn)(或同種資產(chǎn)加手續(xù)費(fèi))償還。
只要整個(gè)操作在同一個(gè)交易內(nèi)完成,Uniswap 就允許這種「先取貨、再付款」的行為。請(qǐng)注意,必須是在同一個(gè)交易內(nèi)完成。這樣設(shè)計(jì),是為了保障 Uniswap 平臺(tái)自身的安全性:
零風(fēng)險(xiǎn)借貸:Uniswap 允許用戶(hù)無(wú)抵押從池子臨時(shí)取走資金(類(lèi)似借貸),但必須在交易結(jié)束時(shí)立即償還。
原子性(Atomicity): 整個(gè)操作必須是原子的,要么完全成功(資金歸還),要么徹底失?。ń灰谆貪L)。
閃電兌換的設(shè)計(jì)初衷是為了更有效地進(jìn)行鏈上套利(Arbitrage),但卻不幸地被 MEV 攻擊者利用,成為市場(chǎng)操縱的利器。
下面我們看圖說(shuō)畫(huà),一步一步來(lái)了解一下本次攻擊的閃電兌換是如何實(shí)現(xiàn)的,見(jiàn)下圖。
F1 攻擊者通過(guò)自有的 701 WETH 從 AAVE 借出 109 萬(wàn) USDC;
F2 攻擊者發(fā)起閃電兌換請(qǐng)求,先從 Uniswap 池子取出 1758 萬(wàn) USDT(此時(shí)無(wú)需先付款)攻擊者賬戶(hù)臨時(shí)增加了 1758 萬(wàn) USDT;
F3 攻擊者迅速將這 1758 萬(wàn) USDT 投入 Curve 池,兌換回 1755 萬(wàn) USDC 攻擊者賬戶(hù) USDT 減少 1758 萬(wàn),USDC 增加 1755 萬(wàn)。通過(guò)下圖你會(huì)發(fā)現(xiàn),攻擊者之所以選擇 Curve 是因?yàn)檫@里的流動(dòng)性很充足,USDT 有 7054 多萬(wàn),USDC 也有 5071 萬(wàn),滑點(diǎn)相對(duì)較低。
F4 攻擊者再將 Curve 兌換來(lái)的 1755 萬(wàn) USDC,加上自己原本準(zhǔn)備的 109 萬(wàn) USDC(Aave借貸所得),共 1864 萬(wàn) USDC,一次性還給 Uniswap,閃電交換完成;
這筆交易(交易 1)過(guò)后,攻擊者的賬戶(hù)余額減少了 109 萬(wàn) USDC,因?yàn)闅w還給 Uniswap 的 1864 萬(wàn) USDC 中只有 1755萬(wàn) USDC 是從 Curve 換來(lái)的,其余的 109 萬(wàn) USDC 是攻擊者的自有資金。
你應(yīng)該發(fā)現(xiàn)了,這一筆交易實(shí)際讓攻擊者損失了 109 萬(wàn)。但是,后面的交易 3,同樣通過(guò)閃電交換的手法,不但把 109 萬(wàn) USDC 拿回頭了,而且,還賺了 20 多萬(wàn)。
下面我們根據(jù) 交易 3 的數(shù)據(jù)一步一步來(lái)分析一下。
K1 攻擊者,用閃電交換取出在 Uniswap 1860 萬(wàn) USDC;
K2 攻擊者,通過(guò)用剛剛從 Uniswap 取出的 USDC 中的一部分 1730 萬(wàn) USDC,換回了 1732 萬(wàn) USDT;
K1 攻擊者,把從 Curve 換回來(lái)的 1732 萬(wàn) USDT 還給了 Uniswap。閃電交換完成。你需要注意的是,攻擊者通過(guò) K2 只花了 1730 萬(wàn) USDC 就獲得了 1732 萬(wàn) USDT。余下的 130(= 1860-1730)萬(wàn) USDC 中,有 109 萬(wàn)的自有資金,其余的 21 萬(wàn) USDC 就是本次攻擊的利潤(rùn)了。
K3 攻擊者,把本金還回 AAVE,拿走自己 701 WETH,同時(shí)把 20 萬(wàn) USDC 兌換成了 105 ETH,并把其中的 100.558 ETH 發(fā)給驗(yàn)證者作為小費(fèi)(約 20 萬(wàn)美元),自己只留了 1 萬(wàn)美元不到的收益。
你或許會(huì)驚訝,為什么攻擊者愿意將高達(dá) 20 萬(wàn)美元的利潤(rùn)拱手讓給驗(yàn)證者?
其實(shí),這并不是慷慨,而是三明治攻擊這種 MEV 攻擊成功的必要條件:
攻擊成功的核心就是交易順序的精準(zhǔn)控制,而控制交易順序的正是驗(yàn)證者(bobTheBuilder)。
驗(yàn)證者不僅幫助攻擊者確保受害者的交易處于攻擊交易之間,更關(guān)鍵的是驗(yàn)證者能確保其他競(jìng)爭(zhēng)的 MEV 機(jī)器人無(wú)法插隊(duì)或干擾攻擊的順利完成。
因此,攻擊者寧可犧牲絕大部分利潤(rùn)來(lái)確保攻擊成功,并保留一定的利潤(rùn)給自己。
需要特別說(shuō)明一下,MEV 攻擊也是有成本的,在 Uniswap 閃電兌換有成本,在 Curve 交易也有成本,只是由于費(fèi)率比較低大概是 0.01~0.05%,所以與攻擊所得相比可以不值一提。
最后再提醒一下,MEV 攻擊的防御其實(shí)也很簡(jiǎn)單,你只需:設(shè)定好滑點(diǎn)容忍度,不要超過(guò) 1%;大筆交易分幾筆執(zhí)行。所以,你大可不必因噎廢食,從此不敢在 DEX(去中心化交易所)交易了。
這起 21.5 萬(wàn)美元的 MEV 攻擊事件,無(wú)疑是區(qū)塊鏈?zhǔn)澜纭昂诎瞪帧狈▌t的又一次殘酷展現(xiàn)。它生動(dòng)地揭示了在去中心化、無(wú)需許可的環(huán)境下,潛藏著利用機(jī)制漏洞攫取利益的復(fù)雜博弈。
從更高的層面來(lái)看,MEV 的出現(xiàn)是區(qū)塊鏈透明性和可編程性雙刃劍效應(yīng)的體現(xiàn)。
一方面,所有交易記錄公開(kāi)可查,使得攻擊行為能夠被追蹤和分析;
另一方面,智能合約的復(fù)雜邏輯和交易執(zhí)行的確定性,也為精明的參與者提供了可乘之機(jī)。
這并非簡(jiǎn)單的黑客行為,而是對(duì)區(qū)塊鏈底層機(jī)制的深刻理解和利用,它考驗(yàn)著協(xié)議設(shè)計(jì)的魯棒性,也挑戰(zhàn)著參與者的風(fēng)險(xiǎn)意識(shí)。
理解 MEV,認(rèn)識(shí)其風(fēng)險(xiǎn),才能更好地在這個(gè)充滿(mǎn)機(jī)遇但也暗藏危機(jī)的數(shù)字世界中航行。記住,在區(qū)塊鏈的“黑暗森林”中,唯有敬畏規(guī)則、提升認(rèn)知,方能避免成為下一個(gè)被吞噬的獵物。
這也是我想通過(guò)本文努力達(dá)到的效果。
登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其描述。文章內(nèi)容僅供參考,不構(gòu)成投資建議。投資者據(jù)此操作,風(fēng)險(xiǎn)自擔(dān)。