搶先交易機器人:以太坊黑暗森林中的怪物
編者按:本文來自巴比特資訊(ID:bitcoin8btc)編者按:本文來自
巴比特資訊(ID:bitcoin8btc)
挑戰
二級標題
二級標題
挑戰
挑戰這是一個恐怖且真實發生的故事。二級標題
挑戰
像任何正常人一樣,我花了很多時間潛伏在Uniswap Discord的支持頻道裡(披露:Uniswap是Paradigm的投資組合公司)。
週三下午,有人問是否能夠收回意外發送到配對合約的Uniswap流動性代幣。
我最初的想法是,這些代幣將被永遠鎖定,但那天深夜,我突然意識到,如果這些代幣仍在那裡,那任何人都可以去恢復它們。
Uniswap v2白皮書
的第3.2節中描述)。
二級標題
二級標題Dark Forest黑暗森林
我可以戴上我的白帽,試著幫失主找回他的代幣,這很簡單,我只需要調用池子的burn函數,將我自己的地址傳遞給它。Flash Boys 2.0只是…我知道這不簡單。
二級標題
黑暗森林
《黑暗森林》是我最喜歡的科幻小說,它引入了“黑暗森林”的概念,在這種環境中,探測意味著某些高級捕食者的死亡。在這種環境下,公開識別別人的位置和直接摧毀他們一樣好。 (這一概念也是以太坊測試網上的
遊戲的靈感來源。 )
Phil 曾經告訴了我一個他稱之為“廣義搶跑者”的宇宙恐怖存在。套利機器人通常在Mempool中尋找特定類型的交易(比如DEX交易或預言機更新),並嘗試按照預先確定的算法進行搶先交易。通用的搶跑者通過複製並用自己的地址替換來尋找任何可使搶跑獲利的交易。
二級標題
二級標題
這就是為什麼這次救援行動不會簡單的原因。任何人都可以調用這個burn函數,如果我提交了一筆調用burn函數的交易,它就像一個閃爍的“免費貨幣”標誌,直接指向這個有利可圖的機會。如果這些怪物真的在mempool中,它們會看到,複製然後變異,並在我的交易被接受之前搶先完成交易。
請注意,這種環境比以太坊區塊鏈狀態本身更殘酷。這些免費的資金已經在區塊鏈上停留了大約8個小時,它們尚未被發現,等待著被任何一個調用burn函數的人從池子中提取出流動性代幣。但任何試圖撿起它的嘗試,都會在飛行過程中立即遭到阻擊。
營救行動
部署一個Getter合約,當所有者調用它時,它只在激活時發出burn調用,否則將恢復;
圖片描述
圖片描述
圖片描述
圖片描述
圖片描述
如果攻擊者只嘗試執行get交易,它將在沒有調用set交易的情況下恢復。我們希望在攻擊者按順序執行這兩筆交易之前,我們的交易能夠先被區塊納入。
圖片描述
而這成了一個致命錯誤!
二級標題
二級標題
我們的get交易確實被納入了,但是出現了一個UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED錯誤,這意味著流動性代幣沒了。結果是,在我們的get交易進入mempool後的幾秒鐘內,就有人執行了調用,並掃蕩走了資金。
怪物吞噬了我們。
二級標題
教訓
教訓1: 怪物是真實存在的!儘管從理智上,我們知道這些搶先交易機器人普遍存在,但在你真正看到它們的行動之前,你很可能低估了它們。
我們抱著一絲僥倖,通過授權合約將救援作為內部調用,我們原本以為它能保護我們,但現實並不是。
如果你發現自己也處於這樣的情況,我們建議你聯繫Scott Bigelow,他是一位一直在研究該主題的安全研究人員,而他有一個更好的混淆原型實現。
教訓2: 別草率即使在時間緊迫的情況下,我們也應該堅持原計劃。如果我們花更多的時間在腳本上,調整合約(也許將Getter合約改為什麼都不做,而不是在激活前恢復調用),或者甚至同步我們自己的節點以避免使用Infura,我們可能就能將兩筆交易放入同一個區塊中。教訓3:不要依賴一般的基礎設施你所做的事情越奇怪,你就越難通過現有的基礎設施,比如Infura。在我們的案例中,我們試圖提交一筆基於當前區塊鏈狀態看起來會失敗的交易,Infura對此有合理的保護措施。而使用我們自己的節點可以避免這個問題。


