建構套利機器人:MEV 機器人簡介(文章 0/n)
source : https://blog.blockmagnates.com/building-an-arbitrage-bot-introduction-to-mev-bots-article-0-n-cb439da58651 by Emile Amajar
本文是 MEV 機器人開發系列的入門書。在本系列中,我們將開發一個具有中等複雜性的 MEV 機器人。提供的大部分資訊僅適用於以太坊和 EVM 相容的區塊鏈(BSC、Polygon 等)。本系列中介紹的一些技巧和技術可能仍會提供一些競爭優勢,但預計策略需要進行重大更改才能產生任何重大收入。在開始之前,我們先來定義什麼是 MEV。
區塊鏈上的可提取價值
MEV 最初指定礦工可以從區塊中提取的值。該值是區塊的預期價值與礦工開採的區塊價值之間的差值。一個區塊的預期價值是該區塊中包含的所有交易的費用總和。人們意識到,透過修改交易的順序或在開採區塊之前將私人交易插入區塊中,礦工可以增加區塊的價值。這稱為礦工可提取價值(MEV)。如今,隨著 PoS 的盛行,礦工已被驗證者取代(儘管仍然使用 MEV 一詞)。儘管礦工和驗證者在從區塊中提取價值方面處於領先地位,但他們可能沒有最佳策略來提取所有價值。有一些機制允許任何擁有更精細策略的代理商與驗證者分享利潤。這些代理商普遍使用稱為 MEV 機器人的自動化程式。
最受歡迎的 MEV 機器人類型
去中心化金融(DeFi)自然是 MEV 機器人的遊樂場:區塊鏈的無需許可的性質和所涉及的大量資金使其成為非常有吸引力的目標。機器人的明顯行動領域使它們可以分為幾個類別。下面的段落將描述最流行的。
清算機器人
DeFi 見證了出色的金融服務的出現,例如借貸協議(Compound、Aave、MakerDAO 等)。這些協議允許用戶將其資產借給其他用戶以換取收益。借款人必須提供超過借款金額的抵押品。如果隨著時間的推移,抵押品的價值低於某個門檻,則抵押品將被清算,貸方將獲得償還。事實證明,這是一種透過去信任系統向借款人提供槓桿的簡單方法,正如 DeFi 生態系統各個部分所期望的那樣。大多數這些協議的亮點在於清算過程對協議外部的任何參與者開放。任何人都可以監控協議的狀態並啟動抵押不足頭寸的清算。智能合約檢查抵押品的價值確實低於某個閾值,並透過向清算人提供一部分抵押品來激勵他們。這正是清算機器人所做的:自動清算部位。在某些時候,這是一個非常有利可圖的策略,但隨著越來越多的人開始這樣做,利潤已大幅減少。
套利機器人
DeFi 生態系統的很大一部分是由去中心化交易所(DEX)組成的。這些交易所允許用戶無需可信任第三方即可交易資產。以太坊上最受歡迎的 DEX 是 Uniswap。Uniswap 目前版本是 V3。這是大多數活動發生的地方,但 Uniswap V2 仍然有一定的交易量,部分原因是 LP 從未費心將資金轉移到 V3。Uniswap V2 非常容易理解,並且已經被許多其他競爭的 DEX 分叉,例如 Sushiswap、Pancakeswap 等…在任何時間點,DEX 上資產的價格都是由兩者的儲備金比例決定的流動資金池中的資產。如果某個 DEX 上的某種資產的價格與另一個 DEX 上的相同資產的價格不同,那麼就有機會在較便宜的 DEX 上購買該資產並在較貴的 DEX 上出售。這就是所謂的套利。套利機器人是最受歡迎的 MEV 機器人類型。新手也可以使用它們,因為原始機器人可以在有限的時間內開發出來。簡單的機器人不太可能盈利,但它們是了解交易的良好起點。簡單的策略可以透過多種方式進行改進,僅受限於開發人員的創造力。由於這些原因,本系列將重點放在套利機器人。請注意,在實踐中,大部分的套利利潤是由在中心化和去中心化交易所之間進行交易的機器人產生。
三明治機器人
三明治是另一種非常流行的 MEV 機器人類型。它利用了這樣一個事實:由不熟練的用戶在區塊鏈上發送的交易通常在交易池(通常稱為內存池)上公開。機器人可以透過多種方式讀取記憶體池,找到要利用的目標交易,並偽造將在目標交易之前開採的交易。DeFi 中的掉期交易是 Sandwich 機器人的主要目標,因為 DeFi 用戶需要設定一些滑點,這意味著他們接受稍差的交易執行價格。他們這樣做是因為 AMM 的價格可能會在交易發送時間和挖礦時間之間波動,這可能導致交易失敗,從而產生潛在的巨額天然氣成本。每次 AMM 買入/賣出都會使價格與互換提供的代幣數量成正比,並與流動性提供者先前在池中提供的代幣數量成反比。機器人可以在用戶合法「購買」訂單之前下達惡意「購買」訂單。只要自下訂單以來價格沒有上漲太多(價格的相對變動稱為滑點),合法訂單仍然可以通過。這將使機器人操作員的價格進一步上漲,然後他們可以以更高的價格出售先前購買的代幣。此操作稱為夾心,因為機器人操作員在合法訂單之前放置買入訂單,在合法訂單之後放置賣出訂單,從而有效地將其夾在兩個訂單之間。也使用「搶先交易」一詞,其意義與傳統金融中的意義相同。三明治機器人的開發比套利機器人更複雜,但它們通常也更有利可圖,因為它們還可以在同一交易包中實施套利策略。請注意,與套利和清算不同,夾心可以被視為不道德,因為它迫使合法用戶的交易以比預期更差的價格執行。在傳統金融市場中,搶先交易其實是非法的。這種策略的一個在道德上可接受但利潤較低的版本稱為「倒退」。它僅在目標交易之後放置交易。更複雜的反向運行機器人也實施完整的套利策略,通常會佔據常規套利機器人可用的大部分份額。
更邊緣類型:狙擊
狙擊機器人會在數位資產向公眾開放後立即嘗試取得該資產。例如,從新開放鑄造的集合中獲取 NFT,或從新推出的代幣銷售中購買代幣。在 Uniswap 上市後立即購買代幣的簡單機器人曾經是有利可圖的,但隨著無用代幣數量的爆炸式增長,如果現在運行,所有機器人都會耗盡自己的 ETH。狙擊機器人可以專為單一用途/目的而設計,但它需要為單一用例投入大量時間和精力,以及對區塊鏈生態系統的良好常識。
MEV 機器人的架構
無論類型為何,MEV 機器人往往具有相似的架構。他們執行三項主要任務:
- 解讀區塊鏈
- 尋找機會
- 執行鏈上操作
以下是每項任務內容的一般描述。
解讀區塊鏈
由於 MEV 機器人旨在與每隔幾秒鐘(以太坊為 12 秒)生成新交易區塊的區塊鏈進行交互,因此它們必須能夠持續有效地讀取區塊鏈的狀態。Sandwhich 機器人還必須能夠讀取記憶體池,這是尚未包含在區塊中的交易池。
要與區塊鏈交互,機器人必須連接到節點。節點是區塊鏈以精確副本分佈在其中的電腦。這些節點相互連接,並在產生新區塊時更新其內部狀態。他們還負責將待處理的交易儲存在自己的記憶體池中,並將其傳播到其他節點。用於運行以太坊節點的最受歡迎的軟體是 Go-Ethereum,通常稱為Geth。它是用 Go 編寫的,是以太坊協議的參考實作。它是目前最常用的以太坊客戶端。另一種不太流行的方法是用 Rust 寫的Parity。許多提供者提供對節點的免費訪問,例如 Infura、Alchemy 或 Quicknode。必須花時間比較它們的報價,因為有些節點比其他節點更可靠,有些節點比其他節點提供更多功能。例如,Infura 不允許存取記憶體池,而這對於三明治機器人來說是必要的。可以透過 JSON-RPC API 遠端查詢節點軟體。該 API 允許獲取區塊鏈的狀態,並將交易發送到節點。下面是一個範例 Python 程式碼,它透過 Infura 託管的節點的 JSON-RPC API 取得以太坊主網鏈的當前區塊號:
import requests
import json
def get_block_number():
url = "https://mainnet.infura.io/v3/YOUR_INFURA_PROJECT_ID"
headers = {'content-type': 'application/json'}
data = {
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}
response = requests.post(url, data=json.dumps(data), headers=headers)
return int(response.json()['result'], 16)
print(get_block_number())
結果:
17388115
像 Web3.py 或 Web3.js 這樣的函式庫可以讓這部分變得更容易。它們還提供許多其他常見功能,例如簽署交易或解析節點發送/接收的資料。請注意,更複雜的機器人操作員將運行自己的節點以避免網路延遲。這很容易每月花費數百美元,因此對於初學者來說可能不值得。JSON-RPC 請求可能需要幾秒鐘才能回傳回應,因此它極大地限制了每個區塊之間可以獲得的資訊量。為了避免這個瓶頸,大多數機器人運營商部署了一個智能合約,該合約將讀取他們在鏈上所需的所有信息,並在單個交易中返回它。非常複雜的MEV 搜尋者甚至可以透過將機器人的大部分程式碼包含在節點軟體的修改版本中來完全避免這一部分,從而避免任何通訊瓶頸或資料表示轉換,但代價是更複雜的開發過程和更大的成本。運作/維護成本。
尋找機會
一旦機器人從區塊鏈中提取了所需的所有資訊,它就可以開始尋找機會。這是機器人最重要的部分,因為它將決定其獲利能力。每個機器人的策略都是獨一無二的。對於一個簡單的三明治機器人,它將包括尋找哪些交易是有效的掉期交易,並計算將它們夾在中間可以賺取的最大利潤。對於套利機器人來說,它將包括找到透過在同一代幣具有不同價格的兩個交易所之間交換給定數量的代幣可以獲得的最大利潤。
鏈上行動
一旦運營商發現了可利用的機會,它必須發送交易以在鏈上對其進行操作。這始終是透過將交易發送到包含此鏈上邏輯的智能合約來完成的。這個邏輯可以簡單地執行一些交換,並檢查原始利潤是否大於天然氣成本。營運商在製定運行其策略的合約時必須小心,以確保交易消耗盡可能少的天然氣,從而實現利潤最大化。智能合約可以用不同的語言編寫,並編譯為 EVM 字節碼。最受歡迎的是 Solidity,它很大程度上受到了 Javascript 的啟發。也可以用 Vyper 寫智慧合約,Vyper 是一種類似 Python 的語言。更複雜的機器人的操作員經常使用 Yul 彙編語言編寫,以便完全控制將在鏈上執行的字節碼。大多數機器人實際上都在爭奪相同的機會。營運商相對於其他營運商的唯一競爭優勢是其智慧合約程式碼的效率,這最終決定了哪些交易將包含在下一個區塊中。
交易執行
以太坊區塊由訂單後執行的交易組成。此順序由產生下一個區塊的礦工/驗證者決定。該訂單是為礦工帶來最大利潤的訂單。直到 2020 年,機器人營運商必須透過發送公開交易來競爭納入。現在,他們可以透過 Flashbots 拍賣系統將交易直接發送給驗證者。下一節將比較這兩種機制,以便更好地理解 Flashbots 系統的優勢。
過去是如何進行的:優先天然氣拍賣(PGA)
在發送公開交易時,如果機器人運營商設置的 Gas 價格低於某些競爭對手,則交易將失敗並給運營商帶來非常高的成本。這是因為驗證者希望最大化他們的利潤,並且總是首先包含支付最多 Gas 的交易。為了增加包含的可能性,營運商會設定非常高的 Gas 價格,這將導致營運商的 Gas 成本非常高,即使交易沒有包含在區塊中。機器人必須不斷監控記憶體池,以確保沒有競爭對手設定更高的價格。如果是這樣,則必須發送另一筆具有相同隨機數的交易來替換前一筆交易,但汽油價格更高。該系統效率非常低,因為它導致了大量的氣體浪費,並使機器人設計比所需的複雜得多。
Flashbot 捆綁包
2020 年,出現了一個名為 Flashbots 的新系統。它允許任何人直接向礦工發送交易,而無需與記憶體池中的其他參與者競爭。該系統稱為捆綁拍賣。它為機器人操作者帶來了巨大的優勢:
- 失敗的交易不會包含在下一個區塊中,從而消除了失敗交易的天然氣成本。任何人都可以從這個系統中受益,即使他們不運行機器人。失敗的交易現在已成為過去。
- 交易可以作為交易束發送給礦工。礦工可以保證三明治捆綁的交易之間不會包含其他交易,從而降低夾心的風險。如果一筆交易失敗,則整個捆綁包將被丟棄,從而提供與單一交易相同的保證。
- 消除搶先交易風險。由於交易不是公開的,因此它們不能被其他機器人搶先運行。
- 程序化支付:智慧合約可以選擇要向礦工支付的天然氣量,例如取決於它將賺取的利潤(這並不總是事先知道的)。這可以最大化機器人的利潤,並允許他們避免支付過高的天然氣費用。最終支付不足(或根本不支付)的交易將被礦工丟棄。
自合併(巴黎升級)以來,以太坊是一個權益證明區塊鏈。這意味著共識不再是由礦工達成,而是由驗證者達成。Flashbots 系統也適應了這個新的共識機制,團隊提出了一個名為mev-boost 的中間件,允許將套件傳送給驗證者。這個新系統也將區塊生產者與驗證者分開。現在,MEV 搜尋者和其他希望將私人捆綁包發送給提議的驗證器的用戶透過中介進行這樣做。然而,這對於先前發送交易包的方式並沒有太大改變。
開源程式碼範例
在開始編寫機器人之前,明智的做法是查看現有的開源機器人,以便更好地了解它們的工作原理。這裡有幾個例子:
- Flashbots simple- Arbitage:由 Flashbots 團隊建立的 TypeScript 儲存庫,它建立了一個簡單的套利機器人,可以將捆綁包傳送到 Flashbots。
- Alcibiades Capital mev_bundle_generator:此儲存庫是用 Rust 編寫的。您可能會發現 Yul 智能合約特別有趣。接下來的文章中將介紹的智能合約進一步改進了它們。
您不應該花太多時間嘗試詳細了解這些機器人的程式碼。如果您打算建立自己的機器人,則應該花時間理解自己的程式碼。
結論
本文介紹了 MEV 的基礎知識,但沒有深入討論技術細節。本系列的下一篇文章將解釋所有需要了解的內容,並提供完整 Python 實作的程式碼範例,並附帶 Solidity 和 Yul 智能合約。