TWAMM:一種在Uniswap高效處理大額訂單的新構想
概述
Odaily 譯者| Moni

概述
概述
本文介紹了一種新型的自動化做市商(AMM),可以幫助以太坊上的交易者有效地執行大額訂單。
簡介
簡介
我們稱其為時間加權平均做市商,縮寫為TWAMM(發音為“tee-wham”)。
簡介
假設Alice想在鏈上購買價值1 億美元的ETH,那麼如果在像Uniswap這種現有的AMM 上執行這種規模的訂單將是非常昂貴的,這是為了防止Alice知道一些他們不知道的內幕,所以它必須向Alice 收取高昂的費用。
二級標題
假如她發送了幾個大規模的子訂單,那麼每個訂單仍然會對價格產生重大影響,並且容易受到對抗性交易者的三明治攻擊。另一方面,如果她發送許多小規模的子訂單,她將不得不承擔主動交易的所有工作和風險,並將以交易gas費用的形式向礦工支付高額成本。
1. 做市商
二級標題
二級標題
兩個與“做市”有關的基礎概念
1. 做市商
2. 逆向選擇
二級標題
二級標題
正文
二級標題
自動化做市商
正文
為了在X 和Y 這兩種資產之間創建新的常數交易AMM (CPAMM),被稱為流動性提供者(LP)的用戶會存入這兩種資產的準備金x 和y。
正文
2. 示例
這些資產在任何給定時間內的比率代表著在AMM 上的即時價格,或者是它向一個非常小的訂單收取的價格。例如,如果CPAMM 的儲備中包含2,000 USDC 和1 ETH,則其ETH 的瞬時價格將為2,000 USDC。
正文
正文
2. 示例
比如一個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。
由於交易者用2000 USDC 購買了0.5 ETH,因此他們支付的平均價格為每個ETH 4,000 USDC。這種相對於瞬時價格的高價反映出了有關AMM 流動性的大訂單規模。
二級標題
3. 價格影響和逆向選擇
在上述情況下,當小訂單的成本僅為每個ETH 2,000 USDC 時,交易者則必須為其大訂單支付每個ETH 4,000 USDC的費用。這種價格差異稱為訂單的價格影響。當新進訂單規模越大,對價格的影響就越大。
二級標題
二級標題
在當前AMM 上執行大訂單
1. 手動拆分訂單
正如我們所見,在AMM上執行單筆大訂單的交易成本被設定得很高。這篇優秀的文章深入探討了這個問題,並推薦了一些解決方案。
2. 對子訂單大小的權衡
二級標題
顯然,如果將一個規模非常大的訂單分成幾部分,那麼每個單獨的子訂單仍然會很大,並會相應地產生價格影響。這時候,要將訂單拆分成得更小才會有用,不過這同時會帶來兩個新的問題。
第一個問題是操作的複雜性,這意味著風險和工作量的增加。交易者可能會將他的交易拆分成錯誤的數量或是選擇了錯誤的方向。另一方面,他的計算機為了阻止執行部分訂單可能會發生崩潰。而即便一切都很順利,這個過程也需要付出時間和精力,這會影響人們對於更有價值的東西的嘗試。
二級標題
二級標題
與傳統金融類比
在傳統金融領域,如果投資者或者機構想購買1 億美元的蘋果股票,他們不會直接向交易所發送1 億美元的市場買單。同樣他們也不會發送10個價值1000 萬美元得訂單。對於沒有專門的交易人員和基礎設施的絕大多數人來說,將訂單分成比這小得多的子訂單是不切實際的。
也許最基本的算法交易類型是時間加權平均價格或是TWAP(發音為“tee-whap”)訂單。顧名思義,就是假如在八小時內執行價值1 億美元的蘋果股票的TWAP 訂單,那麼最終將以該時段內接近蘋果股票時間加權平均價格的價格成交。
二級標題
二級標題
1. 概述
1. 概述
二級標題
時間加權平均做市商
1. 概述
1. 概述
每個TWAMM 都會促進特定的資產對之間進行交易,例如ETH 和USDC。
交易者可以向TWAMM 提交長期訂單,這些訂單是在固定數量的區塊上出售固定數量的一種資產的訂單——例如,在接下來的2,000 個區塊中出售100 ETH 的訂單。
2. 以太坊更新
TWAMM 將這些長期訂單分解為無數個無限小的虛擬子訂單,這些子訂單將隨著時間的推移勻速地與嵌入式AMM 進行交易。要知道,單獨處理這些虛擬子訂單的交易將花費無限多的gas費用,但封閉式數學公式允許我們僅在需要時計算它們的累積影響。
隨著時間的推移,長期訂單的執行將推動嵌入式AMM 的價格遠離其他市場的價格。發生這種情況時,套利者將根據嵌入的AMM 價格進行交易,使其保持一致,從而確保長期訂單的良好執行。
假如長期出售使得嵌入式AMM 上的ETH 比特定中心化交易所要便宜,那麼套利者將從嵌入式AMM 購買ETH,當其價格回升以後再在中心化交易所進行出售以獲取利潤。
2. 以太坊更新
2.1 區塊
以太坊將交易打包成連續的組塊,這個組塊也被稱為是區塊(block),大約每13 秒進行一次。在本文裡,我們將對每個區塊進行編號:區塊1 之後是區塊2,然後是區塊3,依此類推。
2.2 礦工
分散式的礦工組群開始競相處理每一個區塊,而任何能連接到互聯網的人都可以成為礦工。這意味著在以太坊上運行類似AMM 這樣的程序是不保密的:每個人都必須精確地計算出在給定輸入的情況下會產出些什麼。
2.3 Gas 費用
算力在以太坊上是一種稀缺資源,因此用戶必須以gas 費用的形式向礦工支付費用。給定交易中涉及的計算量越大,它消耗的gas 就越多。而這筆gas費用完全是由提交交易的人支付的。
3. 基礎交易設計概念
3.1 長期訂單
Alice 想在接下來的8 小時內購買價值1 億USDC 的ETH,即大約2,000 個區塊。她在TWAMM 中輸入了一個長期訂單來購買價值1 億USDC 的2,000 個區塊ETH,相當於每個區塊50,000 個USDC。
如上所述,我們事先不知道哪些礦工將會在TWAMM 上處理這些未來的交易。這也就意味著Alice 的訂單必須對所有人可見,從而引發了我們即將在下面討論的信息洩漏問題。
3.2 訂單池
假設Bob 想要在接下來的5,000 個區塊中以USDC 價格出售500 ETH,相當於每個區塊出售0.1 ETH。
而Charlie想在接下來的2,000 個區塊中以USDC 價格出售100 ETH,即每個區塊出售0.05 ETH。
等到Charlie的訂單在2,000 個區塊內一到期,Bob和Charlie的訂單就會被組合在一個池中。
3.3 虛擬訂單
3.4 套利
對於接下來的2,000 個區塊,TWAMM 必須代表Alice 購買價值50,000 USDC 的ETH,並代表ETH 銷售池以USDC 的形式出售0.15 ETH。
我們可以想像,TWAMM 將這兩個子訂單再拆分為數萬億個微小的子訂單的子訂單,我們稱之為虛擬訂單(實際上,它將它們拆分為無數個無窮小的虛擬訂單) 。
然後TWAMM 輪流針對其嵌入的AMM 執行這些虛擬訂單:第一個是Alice 的虛擬訂單,然後是ETH 銷售池中的一個,再然後是Alice 的另一個訂單,依此類推。
3.4 套利
因為Alice 購買的ETH 比ETH 池出售的多得多,因此嵌入式AMM 上的ETH 價格將在每個區塊上上漲。
當這個價格相對於其他地方的ETH 價格足夠高時,套利者將在其他交易所購買更便宜的ETH 並在嵌入式AMM 上出售,使其價格與市場平均水平保持一致並確保較好地執行Alice的訂單。 '
除非有任何其它外部活動,否則隨著時間的推移,這將迫使嵌入式AMM 上的ETH 價格走低,也將促使套利者一旦脫離價格後使得價格可以回升。
正文
3.6 代幣經濟
因為Alice、Bob 或Charlie 都不急於執行他們的訂單,所以其他市場參與者可以推斷出他們的訂單所代表的逆向選擇比其他情況要少,並且可以為他們提供低價格影響的執行。
正文
正文
4. 無窮小虛擬訂單(Infinitesimal Virtual Orders)
在極端情況下,由於有無數個無限小的交易,因此執行虛擬交易時價格變動非常平穩。

4.2 效率
執行
執行
4.2 效率
執行
二級標題
執行
1. 惰性評估(Lazy Evaluation)
TWAMM 將虛擬子訂單視為發生在區塊之間的空間中,這對於躲避三明治攻擊很重要。
為了以一種節省gas費用的方式實現這一點,TWAMM 會使用惰性評估,僅在需要確定交互結果時才計算虛擬交易的影響。
每次用戶與TWAMM 交互時(例如,通過使用嵌入式AMM 進行交易或添加新的長期訂單),TWAMM 都會追溯計算自上次交互以來發生的所有虛擬交易的影響。
由於這些虛擬交易僅與TWAMM 的嵌入式AMM 交互,因此TWAMM 行為在外部交互之間是完全確定的。即使TWAMM 外部交互之間移動了100 萬個區塊,下次有人與之交互時,它還是能夠準確計算所有介入虛擬交易的結果。
對於插入TWAMM 的前端而言,可以通過跟踪當前區塊編號並自行進行TWAMM 計算來處理尚未在鏈上表示的虛擬交易。
2. Gas 優化
2.1 資金池訂單(Pooling Orders)
如示例所示,當我們在同一交易方向有多個長期訂單(即以USDC 出售ETH)時,我們會將它們集中在一起,然後把它們拆分為虛擬訂單。然後,TWAMM 可以使用算法來追踪餘額,而這個算法與跟踪Compound 和Uniswap 等協議中數十億美元LP代幣激勵的算法版本一樣。
從技術上講,每個TWAMM 總是有兩個長期訂單池,每個資產一個:例如,賣出USDC 的訂單池和賣出ETH 的訂單池。值得一提的是,在任何給定時間內,這些訂單池中的一個或兩個可能是空的。
2.2 長期訂單過期(Long-Term Order Expiration)
將訂單池與惰性求值結合使用時會出現一種複雜情況。
想像一下,Bob 下了一個長期訂單,將在接下來的100 個區塊中出售100 ETH,而Charlie 也下了一個訂單,將在在接下來的200 個區塊中出售200 ETH,兩個訂單都以每區塊1 ETH 的價格出售。
假設在接下來的150 個塊中沒有人與TWAMM 交互,此時就會發生新的外部交互。在Bob 和Charlie 下訂單後的前100 個區塊中,他們的訂單將會匯集到一個共同訂單中,每個區塊出售2 ETH。然而,對於之後的50 個區塊,Charlie的訂單就變成是獨立的了,每個區塊只會出售1 個ETH。
這意味著我們必須進行兩次單獨的交易計算才能找出發生了什麼:
* 一次計算前100 個區塊的結果;
* 一次計算最後50 個區塊的結果。
在最壞的情況下,如果過去150 個區塊的每個區塊都有訂單到期,這意味著TWAMM 將不得不每個區塊處理一筆交易,從而破壞了gas 效率。
針對這個問題,最簡單的解決方法是限制符合訂單到期條件的區塊數量:例如,TWAMM 可以指定訂單只能每250 個區塊到期一次,或者大約每小時到期一次。
2.3 長期訂單取消(Canceling Long-Term Orders)
用戶可以隨時取消長期訂單。在實踐中,這將允許用戶為他們自己的訂單選擇取消時間(cancelation time)直到區塊完成訂單交易。在這種情況下,系統的gas 負擔不會增加,因為所有取消操作都是用戶自己做出的決定,因此需要他們自己支付gas。
3. 虛擬交易數學(Virtual Trade Math)
假設自TWAMM 上次執行任何虛擬交易以來已經產生了t 個區塊。
3.2 公式
那麼在此期間售出的X 總量為tx_{rate} = x_{in},而在此期間售出的Y 總量為ty_{rate}=y_{in}。

其中

讓我們將時間段開始時嵌入的AMM 儲備分別表示為x_{ammStart} 和y_{ammStart}。

其中

二級標題

從常數乘積公式,我們知道
二級標題
1.1 描述
二級標題
潛在的攻擊媒介
1. 三明治攻擊
1.1 描述
在三明治攻擊中,攻擊者Atticus 看到交易者Trey 即將在AMM 上進行交易。 Atticus 發送了兩個訂單,夾住了Trey 的訂單,從而從中獲利。
想像一下,Trey 向AMM 發送了一個用USDC 購買ETH 的訂單,此時該訂單被Atticus 發現了,於是Atticus 在Trey 之前下單並在AMM 上購買ETH,推動價格上漲。由於他正在向AMM 支付費用並產生價格影響,因此Atticus 在此訂單上正在虧損。
當Trey 的訂單被執行時,他不得不以更高的價格購買ETH,因為Atticus 推高了價格,此時Trey的實際訂單價格又被進一步推高了。
現在,Atticus 將他的ETH 賣回給AMM。由於自Trey 買入以來,Trey 推高了AMM 的價格,因此他賣出的價格其實是高於買入價格的,所以能夠實現盈利。
但是,只有當Atticus 能夠保證在Trey 購買後立即將他的ETH 賣回給AMM,那麼這種攻擊對Atticus 才有意義。在給定的區塊內,如果Atticus 是一名礦工、與某個礦工達成交易或使用Flashbots 之類的服務時,這種類型的攻擊其實是可能發生的。
1.2 夾心訂單和虛擬訂單
乍一看,虛擬訂單似乎特別容易受到三明治攻擊,因為每個人都知道他們會來。
但是,由於它們在一定數量的區塊之間執行,因此訂單能得以保存。想要“夾住”TWAMM的虛擬訂單攻擊者,必須在一個區塊的末尾與嵌入的AMM 進行交易,這樣會導致虛擬訂單在區塊之間以糟糕的價格執行,然後在在下一個區塊開始時往另一個方向交易。
2 信息洩露
2.1 示例
由於用戶可以隨時取消他們的長期訂單,我們預計過於激進的大訂單交易者會被其他交易者利用,因此,我們需要控制信息洩漏的整體影響。
二級標題
二級標題
此處此處二級標題
Python 參考實現Jupyter Notebook GitHub 上的
結論
結論
展示了TWAMM 的行為,其中包含多個被取消的長期訂單和套利者的操作行為。
結論

