注:原文作者是 paradigm 研究合伙人 Dave White、Dan Robinson 以及 Uniswap 創始人 Hayden Adams,在這篇文章中,他們描述了一種稱為時間加權平均做市商(TWAMM)的新型 AMM,它可以幫助以太坊上的交易者有效地執行大訂單,而其工作原理是將長期的大訂單分解為無限多個無限小的虛擬訂單,并根據嵌入的恒定乘積 AMM 隨時間平滑地執行它們。
目錄
1、介紹
2、概要
3、做市基礎
3.1 做市商
3.2 逆向選擇
4、自動化做市商
4.1 恒定乘積公式
5、在當前 AMM 上執行大訂單
5、1 手動拆分訂單
5、2 子訂單大小權衡
6、傳統金融類比
6.1 TWAP 訂單
7、時間加權平均做市商(TWAMM)
7.1 概述
7.2 以太坊術語復習
7.3 基礎設計
7.4 無窮小虛擬訂單
8、實施
8.1 延遲計算(Lazy Evaluation)
8.2 Gas 優化
8.3 虛擬交易涉及的數學
9、潛在的攻擊向量
9.1 三明治攻擊(又名夾心攻擊)
9.2 資訊泄露
10、Python 參考實現
11、結論
1.介紹
本文介紹了一種新型的自動化做市商(AMM),它可幫助以太坊上的交易者有效地執行大訂單。
我們稱其為時間加權平均做市商,或 TWAMM (發音為“tee-wham”),
它的工作原理是將長期訂單分解為無限多個無限小的訂單,并根據嵌入的恒定乘積 AMM 隨時間平滑地執行它們。
2.概要
假設 Alice 想在鏈上購買價值 1 億 USDC 的 ETH,那么她在 Uniswap 等現有 AMM 上執行這種規模的訂單將是昂貴的,如果 Alice 知道別人所不知道的事情(內幕消息),則其執行這樣的大額交易會遭遇很大的滑點,
在今天,Alice 的最佳選擇是手動將她的訂單分成幾部分,并在幾個小時內執行,讓市場有時間意識到她沒有內幕資訊,因此可以給她一個更好的價格,
如果她發送了幾筆大的子訂單,而每個子訂單仍將對市場價產生重大影響,并且很容易受到對手交易者的三明治攻擊。另一方面,如果她發送了許多小的子訂單,她將不得不承擔所有的工作和活躍交易的風險,并向礦工支付大量的 gas 交易費用,
TWAMM 通過代表 Alice 進行交易來解決這一難題,它將 Alice 的訂單分解為無限多個無限小的虛擬訂單,以確保隨時間的推移完美平滑地執行,并且,使用帶有嵌入式 AMM 的特殊數學關系,能夠在這些虛擬訂單中分攤 gas 成本,此外,因為 TWAMM 是在區塊之間執行的交易,所以它也不太容易受到三明治攻擊的影響。
3.做市基礎
3.1 做市商
考慮一個由兩種金融資產組成的市場(比如 USDC 和 ETH),而做市商就是這個市場的參與者,他們在任何時候都愿意用其中一個資產交易另一個資產。
如果你有 1 億 USDC 并想用它來購買 ETH,你可能找不到另一個人在同一時間做相反的交易,相反,你很可能會去一個由單個或多個做市商組成的市場,并與他們進行交易,
3.2 逆向選擇
做市商從價差中獲利,即他們對每筆交易收取的費用,當價格與他們相反時,他們會賠錢(比如當他們購買價格下跌的資產,或者出售價格上漲的資產。)
不幸的是,對于做市商來說,市場價格往往與他們相反,這種現象被稱為逆向選擇,發生這種情況,是因為擁有有關未來價格走勢資訊的交易者,更有可能與做市商進行大額交易。
一般而言,最危險的訂單就是那些規模又大又緊急的訂單,因為這些訂單正是知情交易者傾向于下的訂單類型,因此,最基本的做市策略就是淡化入市訂單,即當大量買入訂單進來時,調高價格;當大量賣出訂單進來時,調低價格。
4.自動化做市商
在過去的一年中,以 Uniswap 為首的自動化做市商 (AMM) 在以太坊上變得非常受歡迎,這些 AMM 每天處理數十億美元的交易量,顧名思義,AMM 自動化了大部分的做市過程。
4、1 恒定乘積公式
恒定乘積公式是一個簡單的規則,它允許任何人立即為一對新資產創建新市場和新 AMM。
為了在兩個資產 X 和 Y 之間創建新的乘積 AMM (CPAMM) ,稱為流動性提供者(LP)的用戶存入這兩種資產的 x 和 y 儲備金,
這些資產在任何給定時間的比率代表 AMM 上的即時價格。例如,如果 CPAMM 的儲備中包含 2,000 USDC 和 1 ETH,則 ETH 的瞬時價格將為 2,000 USDC。
當交易者與 AMM 進行交易時,它會根據公式 x * y = k 決定給他們什么價格,其中 x 和 y 是儲備規模,k 是常數,這意味著其儲備規模的乘積在交易期間保持不變(忽略費用)。
例子:
考慮一個 ETH/USDC CPAMM,其儲備中有 2,000 USDC 和 1 ETH,因此此時 x = 2,000、y = 1 以及 x * y = k = 2,000,該 AMM 的瞬時價格為每 ETH 2,000 / 1 = 2,000 USDC。
如果交易者來購買價值 2,000 USDC 的 ETH,這意味著他們將 2,000 USDC 存入 X 儲備,因此我們的 x 變成 4,000 (2000+2000)。
然后,由于 k = 2000,在這筆交易后,我們的 y 就變成了 0.5 (y = x/k=2000/4000),由于 y 最初是 1,因此有 0.5 ETH 流向了交易者。
由于交易者用 2000 USDC 購買了 0.5 ETH,因此他們支付的 ETH 平均價格為 4,000 USDC,
價格影響與逆向選擇
在上述情況下,交易員必須為其大額訂單支付 4000 美元 /ETH,而小額訂單的成本僅為 2000 美元 /ETH,這種價格差異被稱為訂單的價格影響,訂單越大,價格影響(滑點)就越大,
這就是 AMM 對抗逆向選擇的方式:大訂單更有可能和內幕消息有關,因此 AMM 讓他們付出了高昂的代價,它是淡化訂單的自動化等價物,
5.在當前 AMM 上執行大訂單
5.1 手動拆分訂單
正如我們所看的,在單筆交易中對 AMM 執行一個大訂單是昂貴的,這篇優秀的文章深入探討了這個問題,并推薦了一些解決方案,
簡而言之,希望在 AMM 上執行大訂單的交易者不應該在單筆交易中執行:他們最好將訂單分成幾個部分,這可能涉及一次向多個 AMM 發送訂單,但這些 AMM 在任何給定時間點的流動性也有限,訂單越大,隨著時間的推移將其拆分就越有吸引力,
例如,假設一個投資者想在鏈上購買價值 1 億 USDC 的 ETH,他們沒有關于 ETH 價格的任何短期資訊,因此不介意其訂單是否需要一些時間來執行,在這種情況下,他們可能會將訂單拆分成 10 個小訂單,每個訂單 1000 萬美元,并且每隔 1 個小時執行一次,從而減小訂單的價格影響。
5.2 子訂單大小權衡
很明顯,如果一個非常大的訂單被拆分成幾個部分,每個單獨的子訂單仍然會很大,并且會相應地產生價格影響。將訂單分成更小的部分會有所幫助,但這會引入兩個新的問題。
第一個問題是操作復雜性,這意味著風險和工作量的增加,交易者可能會為給定的交易輸入錯誤的交易數量或錯誤的方向。或者她的計算機可能會崩潰,從而阻止她執行部分訂單。即使一切順利,這個過程也需要時間與精力,它會分散人們對更有利可圖的努力的注意力。
第二個問題是每筆交易都會產生固定的交易成本,例如支付給以太坊礦工處理交易的 gas,如果交易者將她的訂單分成太多部分,其最終可能在交易費用上消耗的資金超過了其實際購買到的 ETH。
6.傳統金融類比
在傳統金融領域,如果投資者或機構想購買 1 億美元的蘋果股票,他們不會直接向交易所發送 1 億美元的市場買單,他們也不會發送 10 個價值 1000 萬美元的訂單,而對于沒有專門的交易人員和基礎設施的大多數人來說,將訂單分成比這小得多的部分是不切實際的,
相反,他們很可能會將大筆訂單發送給經紀商,經濟商會為他們進行算法交易以換取費用。經紀商將在指定的時間段內執行交易,比如八小時,并且價格類似于某個基準。經紀商將有一個專門負責安全且廉價地執行此類交易的團隊。
6.1 TWAP 訂單
也許最基本的算法交易類型是時間加權平均價格或 TWAP (發音為“tee-whap”)訂單。顧名思義,在八小時內購買價值 1 億美元的蘋果股票的 TWAP 訂單,將以接近該時期蘋果股票時間加權平均價格的價格成交,
例如,如果蘋果股票在四個小時的定價為 100 美元,另外四個小時的定價為 120 美元,那么時間加權平均價格將為($1004+$1204)/8=$110,經紀商將執行接近該價格的 TWAP 訂單,
細節各不相同,但經紀商最有可能通過在一天內將其分成許多個小塊并將它們發送到市場來執行此交易。在 8 小時內購買 1 億美元的蘋果股票,相當于每 100 毫秒購買大約 350 美元的蘋果股票,我們可能預計經紀商或多或少會這樣做。
經紀商擁有減少或消除如此多小額交易的操作復雜性的基礎設施,并且由于他們與市場有直接聯系,因此可能無需支付太多的交易成本。
7.時間加權平均做市商 (TWAMM)
時間加權平均做市商 (TWAMM) 提供 TWAP 訂單的鏈上等價物。
TWAMM 具有用于訂單拆分的專門邏輯以及與嵌入式交易所的直接連接,以低 gas 成本提供平穩執行,套利者將 TWAMM 嵌入式交易所的價格與市場價格保持一致,確保在資產的時間加權平均價格附近執行。
7.1 概述
每個 TWAMM 實例促進特定資產對之間的交易,例如 ETH 和 USDC,
TWAMM 包含一個嵌入式 AMM,這是這兩種資產的標準恒定乘積做市商。任何人都可隨時使用這個嵌入式 AMM 進行交易,就好像它是一個普通的 AMM。
交易者可以向 TWAMM 提交長期訂單,這些訂單是在固定數量的區塊上出售固定數量資產的訂單 -例如,在接下來的 2,000 個區塊中出售 100 ETH 的訂單。
TWAMM 將這些長期訂單分解為無限多個無限小的虛擬子訂單,這些子訂單隨著時間的推移以均勻的速率與嵌入式 AMM 進行交易,單獨處理這些虛擬子訂單的交易將花費無限的 gas,但封閉形式的數學公式允許我們僅在需要時計算它們的累積影響。
隨著時間的推移,長期訂單的執行將推動嵌入式 AMM 的價格遠離其他市場的價格。發生這種情況時,套利者將根據嵌入 AMM 的價格進行交易,使其恢復一致,從而確保長期訂單的良好執行,
例如,如果長期賣出使得嵌入式 AMM 上的 ETH 比特定中心化交易所便宜,套利者將從嵌入式 AMM 購買 ETH,使其價格回升,然后在中心化交易所出售以獲取利潤。
7.2 以太坊術語復習
區塊(Block):以太坊將交易捆綁成稱為區塊(Block)的連續組,大約每 13 秒一次,出于本文的目的,我們將對每個區塊進行編號:區塊 1 之后是區塊 2,然后是區塊 3,依此類推,
礦工(Miner):分布式礦工組競爭處理每個區塊。任何能連接互聯網的人都可以成為礦工,這意味著在以太坊上運行的 AMM 之類的程式不能保守任何秘密:每個人都必須能夠準確地計算出在給定輸入的情況下他們會做什么,
Gas: 以太坊上的計算是一種稀缺資源,因此用戶必須以 gas 的形式向礦工支付費用,給定交易中涉及的計算越多,它消耗的 Gas 就越多。這種 gas 費用完全由提交交易的人支付。
7.3 基礎設計
長期訂單:Alice 想在接下來的 8 小時內購買價值 1 億 USDC 的 ETH,即大約 2,000 個區塊,她在 TWAMM 中輸入了一個長期訂單,以在接下來的 2,000 個區塊購買價值 1 億 USDC 的 ETH,或每個區塊 50,000 USDC。
如上所述,我們事先不知道哪些礦工將在 TWAMM 上處理未來的交易,這意味著 Alice 的訂單必須對所有人可見,從而引入了我們在下面討論的資訊泄漏問題。
訂單池:Bob 想在接下來的 5,000 個區塊中將 500 ETH 兌換成 USDC,或者每個區塊出售 0.1 ETH。
Charlie 想在接下來的 2,000 個區塊中將 100 ETH 兌換成 USDC,即每個區塊出售 0.05 ETH。
直到 Charlie 的訂單在 2,000 個區塊內到期,Bob 和 Charlie 的訂單將被分組到一個池中。
該 ETH 銷售池將在接下來的 2,000 個區塊中以每個區塊 0.15 ETH 的速率出售 ETH。Bob 將獲得 USDC 池子的 ≈ 66%( 0.1/0.15),Charlie 將獲得 USDC 池子的 ≈ 33%(0.05/0.15)。
虛擬訂單:
對于接下來 2,000 個區塊的每一個區塊,TWAMM 必須代表 Alice 購買價值 50,000 USDC 的 ETH,并代表 ETH 銷售池出售 0.15 ETH 以換取 USDC,
我們可以想象,TWAMM 將這兩個子訂單中的每一個拆分為數萬億個微小的子子訂單,我們稱之為虛擬訂單(實際上,是將它們分解為無數個無窮小的虛擬訂單)。
然后 TWAMM 輪流針對其嵌入的 AMM 執行這些虛擬訂單:第一個是 Alice 的虛擬訂單,然后是 ETH 銷售池的一個虛擬訂單,然后是 Alice 的另一個虛擬訂單,依此類推,
套利:
因為 Alice 購買的 ETH 要比 ETH 銷售池出售的多得多,嵌入式 AMM 上的 ETH 價格將在每個區塊經歷上漲,
當這個價格相對于其他地方的 ETH 價格足夠高時,套利者將在其他交易所購買更便宜的 ETH 并在嵌入式 AMM 上出售,使其價格回到市場平均水平,并確保 Alice 的良好執行,
訂單到期:
在第 2,000 個區塊之后,Alice 的訂單將被完全執行,Charlie 的訂單也是如此,而 Bob 出售 ETH 的訂單在接下來的 3,000 個區塊內仍然有效,在此期間 TWAMM 將繼續以每個區塊 0.1 ETH 的速度執行它。
除非有任何外部活動,否則隨著時間的推移,這將推低嵌入式 AMM 上的 ETH 價格,這一次促使套利者在價格完全脫節后重新拉回至市場價,
經濟學:
由于 Alice、Bob 或 Charlie 都不急于執行訂單,因此其他市場參與者可以推斷出,他們的訂單所代表的逆向選擇比其他情況下要少,并且可以為他們提供低價格影響的執行。
由于 TWAMM 將是像 Alice、Bob 和 Charlie 這樣的人進行交易的最佳場所,所以 TWAMM 嵌入式 AMM 上的 LP 可能會與他們這樣的大量未知 flow 進行交互。這有助于從費用中賺錢,同時減少逆向選擇的風險。
7.4 無窮小虛擬訂單
上面我們提到 TWAMM 將長期訂單拆分為無限多個無限小的子訂單,這樣做有兩個原因:平滑度和效率
平滑度
TWAMM 的主要目標是隨著時間的推移平滑執行其長期訂單,以便它們的執行價格接近現行的時間加權平均價,
隨著我們減少虛擬交易的規模,AMM 上的價格波動變得越來越不規則。
在極限狀態下,由于有無限多個無限小的交易,當執行虛擬交易時,價格運動是完全平滑的,
見 https://github.com/para-dave/twamm/blob/master/splitting_exploration.ipynb
效率
由于 TWAMM 旨在用于以太坊,因此為每個區塊明確計算多筆虛擬交易的交易成本會高得驚人,然而,當我們有無限多個無限小的交易時,我們可以在一次計算中計算交易者的結果(無論自上次檢查以來已經有多少個區塊),
8.實施優化方案
8.1 延遲計算(Lazy Evaluation)
TWAMM 將虛擬子訂單視為發生在區塊之間的空間中,這對于避免三明治攻擊而言是很重要的。
為了以一種節省 gas 的方式實現這一點,TWAMM 使用了延遲計算(Lazy Evaluation),僅在需要確定交互結果時才計算虛擬交易的影響。
每次用戶與 TWAMM 交互時(例如,通過使用嵌入式 AMM 進行交易或添加新的長期訂單),TWAMM 都會追溯計算自上次交互以來發生的所有虛擬交易的影響,
由于這些虛擬交易僅與 TWAMM 的嵌入式 AMM 交互,因此 TWAMM 的行為在外部交互之間是完全確定的。即使 TWAMM 在外部交互之間移動了 100 萬個區塊,下次有人與之交互時,它也能夠準確計算所有介入虛擬交易的結果,
插入 TWAMM 的前端將能通過跟蹤當前區塊編號并自行進行 TWAMM 計算來考慮尚未在鏈上表示的虛擬交易,
8.2 Gas 優化
匯集訂單
如示例所示,當我們在同一方向有多個長期訂單(即出售 ETH 并兌換成 USDC)時,我們將它們匯集在一起,然后將它們拆分為虛擬訂單,然后,TWAMM 可使用用于跟蹤 Compound 和 Uniswap 等協議中 LP 獎勵的十億美元算法來跟蹤余額,
從技術上講,每個 TWAMM 總是有兩個長期訂單池(每個資產一個):例如,賣 USDC 的訂單池和賣 ETH 的訂單池。在任何給定時間,這些訂單池中的一個或兩個可能是空的,
長期訂單到期
將訂單池與延遲計算結合使用時會出現一種復雜情況,
想象一下,Bob 下訂單在接下來的 100 個區塊中出售 100 ETH,而 Charlie 下訂單在接下來的 200 個區塊中出售 200 ETH,這兩個訂單都以每個區塊 1 ETH 的速率出售,
假設在接下來的 150 個區塊中沒有人與 TWAMM 交互,此時會發生新的外部交互。他們的第一批訂單是 Bob 和 Charlie 的共同訂單,每個區塊賣出 2 ETH。然而,在那之后的 50 個區塊,Charlie 的訂單是獨立的,每個區塊只賣出 1 ETH,
這意味著我們必須進行兩次單獨的交易計算才能找出發生了什么:一次計算前 100 個區塊的結果,一次計算后 50 個區塊的結果。在最壞的情況下,如果過去 150 個區塊的每個區塊都有訂單到期,這意味著 TWAMM 將不得不為每個區塊處理一筆交易,從而破壞 gas 效率。
對此最簡單的解決方法,是限制符合訂單到期條件的區塊數量:例如,TWAMM 可以指定訂單只能每 250 個區塊到期一次,或者大約每小時一次。
取消長期訂單
用戶可以隨時取消長期訂單,在實踐中,這允許用戶為他們的訂單選擇取消時間。這不會增加系統的 gas 負擔,因為想要取消的用戶需要自己支付 gas 費用,
8.3 虛擬交易涉及的數學
定義:
假設自 TWAMM 上次執行任何虛擬交易以來已經有 t 個區塊。
為簡單起見,假設沒有長期訂單過期,因此在整個時間段內,出售 X 的池子以每區塊 x_rate 的速率出售,而出售 Y 的池子在整個時間段內以每個區塊 y_rate 的速率出售。
那么在此期間售出的 X 總量為
,而在此期間售出的 Y 總量為
。
讓我們將時間段開始時嵌入的 AMM 儲備分別表示為
以及
。
公式:
在處理完所有虛擬交易后,嵌入式 AMM 將有 X 儲備
其中
從這個恒定乘積公式,我們知道
出售 X 的池子獲得了所有沒有出現在嵌入式 AMM 中的 Y,換句話說,
以及類似的,
9.潛在的攻擊向量
9.1 三明治攻擊(又名夾心攻擊)
描述:在三明治攻擊中,攻擊者 Atticus 看到交易者 Trey 即將在 AMM 上進行一筆交易,隨后 Atticus 發送了兩個訂單并夾住了 Trey 的訂單,以此實現獲利。
想象一下,Trey 向 AMM 發送了一筆用 USDC 購買 ETH 的訂單,而攻擊者 Atticus 在看到這個訂單后,搶先在 rey 之前在 AMM 上購買 ETH,以此推動 ETH 價格上漲,由于他正在向 AMM 支付費用并產生價格影響,因此 Atticus 在操作完這個訂單后是虧錢的,
當 Trey 的訂單被執行時,他會以更高的價格購買 ETH,因為 Atticus 推高了價格,而 Trey 的訂單進一步推高了 ETH 的價格。
現在,Atticus 立即將他的 ETH 賣回給 AMM,此時他賣出的價格要高于其買入的價格,因此能夠實現盈利,
如果 Atticus 能夠保證在 Trey 購買后立即將他的 ETH 賣回給 AMM,那么這種攻擊對 Atticus 才有意義。在給定的區塊內,如果 Atticus 是一名礦工、與某個礦工達成交易或使用 Flashbots 之類的服務,則這是可能的,
三明治攻擊和虛擬訂單
乍一看,虛擬訂單似乎特別容易受到三明治攻擊,因為每個人都知道它們會來。
但由于它們在**區塊之間執行,因此要進行攻擊是不容易的,要夾住 TWAMM 的虛擬訂單的攻擊者必須在一個區塊的末尾與嵌入的 AMM 進行交易,導致虛擬訂單在區塊之間以糟糕的價格執行,然后在另一個方向交易,在下一個區塊開始時結束交易,
目前,攻擊者沒有辦法保證實施這類攻擊,當這種多區塊 MEV 變得更加普遍,允許交易者在多個區塊之間進行夾心交易時,這可能會成為一個更大的問題。
9.2 資訊泄露
長期交易者在 TWAMM 中可能遇到的最大權衡是,他們在下公開可見訂單時會面臨資訊泄露的問題,這是以太坊的性質所導致的,
如果一個交易者下了足夠大的長期訂單,其他交易者可能會試圖搶先在 TWAMM 的嵌入式 AMM 和其他地方購買資產,以便在長期訂單推高價格后將其出售給交易者,
由于用戶可以隨時取消他們的長期訂單,我們預計過于激進的搶先交易者會被其他交易者利用,從而控制資訊泄漏的整體影響,
例子:
想象一下,欺騙者 Sally 已經注意到 TWAMM 上的攻擊性搶先交易,她從流動性聚合商那里購買了價值 100 萬 USDC 的 ETH,從而推高了整個市場的價格。然后她在 TWAMM 上下了一個巨大的長期訂單,在接下來的 24 小時內每個區塊購買 10 萬 USDC 的 ETH。
搶先交易者 Frank 立即看到了這個訂單,并通過聚合器購買了價值 100 萬 USDC 的 ETH,進一步推高了價格,Sally 通過聚合商賣回她的 ETH 以獲取利潤,這導致 ETH 價格下降,并讓 Frank 蒙受損失,最后,她在任何訂單完成之前取消了她的長期訂單,
10.Python 參考實現
你可以在此處查看 TWAMM 的 Python 參考實現,
這個 Jupyter 筆記演示了 TWAMM 在多個長期訂單和套利者存在下的情況,
為了簡單起見,這個 Python 版本并沒有實施 gas 優化,比如訂單池順序或真正的延遲計算。
11.結論
我們已經勾勒出了 TWAMM 的設計,但我們的工作才剛剛開始。如果你有興趣解決此問題或類似問題,可以發郵件至 [email protected] 或者在 Twitter 上給我發私信,或者你也可以通過 [email protected] 聯系 Uniswap Labs。
致謝:Sam Sun, Georgios Konstantopoulos, Michael Bently, Michael Kustermann, Kevin Pang, Hasu, Sam Bankman-Fried, Henry Prior, Tom Cadwell, Alex Wice, Mewny, Big Magic, Lily Francus, Tarun Chitra, Moody Salem, Noah Zinsmeister, Teo Leibowitz。