搶先交易機器人:以太坊黑暗森林中的怪物

買賣虛擬貨幣

這是一個恐怖且真實發生的故事。

1

挑戰

像任何正常人一樣,我花了很多時間潛伏在Uniswap Discord的支援頻道里(披露:Uniswap是Paradigm的投資組合公司)。

週三下午,有人問是否能夠收回意外傳送到配對合約的Uniswap流動性代幣。

我最初的想法是,這些代幣將被永遠鎖定,但那天深夜,我突然意識到,如果這些代幣仍在那裡,那任何人都可以去恢復它們。

當任何人呼叫Uniswap核心合約上的burn函式時,該合約會測量自己的流動性代幣餘額並將其燒掉,將提取的代幣提供給呼叫者指定的地址。這是Uniswap v2預期行為的核心部分(基本機制在Uniswap v2白皮書的第3.2節中描述)。

我找到了這個合約,這些流動性代幣仍然在那裡,它們的價值大約為12000美元。

這意味著三件事:

有一個滴答作響的時鐘,即使沒有其他人注意到這筆免費資金,任何人都可以在任何時候移除自己的流動資金,並意外地從合約中獲得這些代幣;

我可以戴上我的白帽,試著幫失主找回他的代幣,這很簡單,我只需要呼叫池子的burn函式,將我自己的地址傳遞給它。

只是…我知道這不簡單。

2

黑暗森林

以太坊區塊鏈是一個高度敵對的環境,這一點已經不是什麼秘密。如果一個智慧合約可以被用來牟利,那它最終就會被利用。駭客攻擊的頻繁發生表明,一些非常聰明的人花了大量時間來檢查合約中的漏洞。但這種無情的環境與Mempool(一組等待中、未確認的交易)相比顯得相形見絀。如果說區塊鏈本身就是一個戰場,那麼mempool就是更糟糕的東西:一片黑暗的森林。

《黑暗森林》是我最喜歡的科幻小說,它引入了“黑暗森林”的概念,在這種環境中,探測意味著某些高階捕食者的死亡。在這種環境下,公開識別別人的位置和直接摧毀他們一樣好。(這一概念也是以太坊測試網上的Dark Forest遊戲的靈感來源。)

在以太坊Mempool中,這些頂級捕食者會採取“套利機器人”的形式。套利機器人監控等待中的交易,並試圖利用它們創造盈利機會。對於這些機器人,沒有哪個白帽比Phil Daian更瞭解這些機器人,他和他的同事一起撰寫了《Flash Boys 2.0》論文,並創造了術語“礦工可提取價值”(MEV)。

Phil 曾經告訴了我一個他稱之為“廣義搶跑者”的宇宙恐怖存在。套利機器人通常在Mempool中尋找特定型別的交易(比如DEX交易或預言機更新),並嘗試按照預先確定的演算法進行搶先交易。通用的搶跑者透過複製並用自己的地址替換來尋找任何可使搶跑獲利的交易。

這就是為什麼這次救援行動不會簡單的原因。任何人都可以呼叫這個burn函式,如果我提交了一筆呼叫burn函式的交易,它就像一個閃爍的“免費貨幣”標誌,直接指向這個有利可圖的機會。如果這些怪物真的在mempool中,它們會看到,複製然後變異,並在我的交易被接受之前搶先完成交易。

請注意,這種環境比以太坊區塊鏈狀態本身更殘酷。這些免費的資金已經在區塊鏈上停留了大約8個小時,它們尚未被發現,等待著被任何一個呼叫burn函式的人從池子中提取出流動性代幣。但任何試圖撿起它的嘗試,都會在飛行過程中立即遭到阻擊。

3

營救行動

為了在不通知機器人的情況下提取到資金,我需要混淆這筆交易,這樣機器人就無法檢測到它對Uniswap對的呼叫,這將涉及編寫和部署定製合約。儘管我是一個專業的DeFi思想領袖,但我以前從未在以太坊上部署過合約。

我需要幫助,而當時已經過了午夜。幸運的是,我認識的一些最好的智慧合約工程師生活在歐洲時區。我在Paradigm的同事Georgios Konstantopoulos同意幫助部署合約並提交交易。我們另一家投資組合公司Yield的首席工程師Alberto Cuesta Cañada則自願執行合約。

一些優秀的以太坊安全工程師幫助我們想出了一個混淆方案。除了將呼叫隱藏為內部交易外,我們還將交易分為兩部分:一筆是啟用我們合約的set交易,另一筆是在合約被啟用的情況下拯救資金的get交易。具體實施如下:

部署一個Getter合約,當所有者呼叫它時,它只在啟用時發出burn呼叫,否則將恢復;

部署一個Setter合約,當所有者呼叫它時,它將啟用Getter合約;

在同一個區塊中提交set交易和get交易;

圖:我們自定義智慧合約的程式碼

如果攻擊者只嘗試執行get交易,它將在沒有呼叫set交易的情況下恢復。我們希望在攻擊者按順序執行這兩筆交易之前,我們的交易能夠先被區塊納入。

圖:我們的救援指令碼

令我們驚訝的是,即使我們手動調高了gas費用,set交易依舊被Infura拒絕了。在幾次失敗的嘗試和重置之後,時間給了我們壓力,然後我們開始變得草率了。我們讓第二筆交易溜到了之後的一個區塊。

而這成了一個致命錯誤!

我們的get交易確實被納入了,但是出現了一個UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED錯誤,這意味著流動性代幣沒了。結果是,在我們的get交易進入mempool後的幾秒鐘內,就有人執行了呼叫,並掃蕩走了資金。

怪物吞噬了我們。

4

教訓

教訓1: 怪物是真實存在的!

儘管從理智上,我們知道這些搶先交易機器人普遍存在,但在你真正看到它們的行動之前,你很可能低估了它們。

我們抱著一絲僥倖,透過授權合約將救援作為內部呼叫,我們原本以為它能保護我們,但現實並不是。

如果你發現自己也處於這樣的情況,我們建議你聯絡Scott Bigelow,他是一位一直在研究該主題的安全研究人員,而他有一個更好的混淆原型實現。

教訓2: 別草率

即使在時間緊迫的情況下,我們也應該堅持原計劃。如果我們花更多的時間在指令碼上,調整合約(也許將Getter合約改為什麼都不做,而不是在啟用前恢復呼叫),或者甚至同步我們自己的節點以避免使用Infura,我們可能就能將兩筆交易放入同一個區塊中。

教訓3:不要依賴一般的基礎設施

你所做的事情越奇怪,你就越難透過現有的基礎設施,比如Infura。在我們的案例中,我們試圖提交一筆基於當前區塊鏈狀態看起來會失敗的交易,Infura對此有合理的保護措施。而使用我們自己的節點可以避免這個問題。

或者,如果你碰巧認識一個大礦工(我們不認識),你可以讓他們直接在一個區塊中納入你要提交的交易,完全跳過mempool和怪物。

教訓4: 未來只會變得更可怕

這只是發生在我們身上的搶先交易事件的一個例子,而類似的事情每天會發生很多次。今天,搶先交易者只是機器人,而明天,則可能會是礦工。

今天,礦工們並沒有抓住這些機會,把錢留在了原地,但誰也不能保證,他們將來是否會重新排序並提交自己的交易,為其自身利益服務。更糟糕的是,他們可能會重構其他礦工開採的區塊,試圖竊取他們沒有認領的MEV,從而導致區塊鏈的不穩定。

我們認為這種未來是可以避免的。Optimism(另一家Paradigm 投資組合公司)有一個雄心勃勃的願景,即如何將MEV重新定向以造福於生態系統,以作為其layer 2 擴充套件性解決方案optimistic rollup的一部分。

如果你正在思考關於MEV的事,或在這一領域建設些什麼,請聯絡我們!

感謝Alberto Cuesta Cañada、Scott Bigelow、Phil Daian、Charlie Noyes以及Sam Sun對這篇文章提供的幫助。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;