uniswap白皮書翻譯(部分)

白皮書原版:https://uniswap.org/whitepaper.pdf

Uniswap v2 Core

Hayden Adams hayden@uniswap.org

Noah Zinsmeister noah@uniswap.org

Dan Robinsondan@paradigm.xyz

摘要

本技術白皮書說明了Uniswap v2核心合約的一些設計方案。涵蓋了合約的新特性---包括任意ERC20交易對,一個硬化的價格oracle機制,允許其他合約在給定的時間間隔內估算時間加權的平均價格,“flash swaps”允許交易者在付款之前收取資產并且把它們用在別的地方,還有可以在將來被打開的協議手續(xù)費開關。V2重構了合約,減少了供給面。本白皮書描述了Uniswap v2核心合約的機制,包含存儲了LP資金的pair合約和用于實例化pair合約的factory合約。

1.介紹

Uniswap v1是一個基于以太坊的智能合約鏈上系統(tǒng),實現了一個基于“常量乘積公式”的自動流動性協議。每一對Uniswap v1都存儲了兩種資產的資金池,并且提供了這兩種資產的流動性,維持了這兩種資產池內資金乘積保持不變。交易者需要支付每筆交易0.3%的手續(xù)費,這些費用將會給流動性提供者(LP)。這個合約是不可升級的。

Uniswap v2是基于同一個公式的新實現,具有幾個非常理想的新特性。最重要的是,它允許創(chuàng)建任意的ERC20/ERC20交易對,而不是只支持ERC20和ETH之間的交易對。它還提供了一個硬化了的價格oracle機制,在每個區(qū)塊最開始累計兩種資產的相對價格。這鄖西以太坊上的其他合約在給定的時間間隔內估算時間加權的平均價格。最后,它支持“flash swaps”,使交易者免費獲取資產并把它們用在鏈上的其他地方,只需要在交易的最后支付或返還資產。

雖然合約使不可以被升級的,但是有一個私鑰可以更新factory合約內的變量,打開1/6手續(xù)費的開關。這個開關最開始是關閉的,也許會在以后打開,屆時LP將只能收取0.25%的手續(xù)費,而不是0.3%。

在第三章會討論到,Uniswap v2修復了Uniswap v1的很多小錯誤,同時重構了整個實現,減少了Uniswap的供給面,并且通過最小化核心合約中存儲LP基金的邏輯,使整個系統(tǒng)更容易升級。

本白皮書描述了核心合約的機制,以及用于實例化合約的factory合約。實際上,使用Uniswap v2需要通過一個路由合約調用pair合約,計算交易或存款金額,并將資金轉移到pair合約。

2.新特性

2.1 ERC-20對

Uniswap v1使用ETH作為資產之間的橋接。每一對pair都需要ETH作為其中一種資產。這讓路由變得簡單,每一次ABC和XYZ之間的交易都要通過ETH/ABC和ETH/XYZ,減少了流動性的分散。

然而,這個規(guī)則給LP增加了大量的花費。所有LP都必須接觸ETH,并且需要承受ETH價格相對其他資產變動時帶來的的無常形損失。當兩種資產ABC和XYZ相關時----比如,如果他們都是USD穩(wěn)定幣---那么ABC/XYZ的LP承受的損失會少于ABC/ETH或XYZ/ETH對。

使用ETH作為強制的橋接資產同時還會增加交易者的花費。相比ABC/XYZ交易對,使用ETH最為橋接,交易者必須支付兩倍的手續(xù)費,同時承受兩次下滑。

Uniswap v2允許LP創(chuàng)建任意ERC20pair合約。

對任意ERC20pair的擴散會讓找到最佳路徑交易特定pair變得更難,但是更高層的路由可以解決這一點(無論是鏈上還是鏈下)

2.2 價格Oracle

Uniswap在時間t內提供的臨界價格(不包含手續(xù)費)可以用資產a的池內資金除以資產b的池內資金來計算。


由于價格不正確時,套利者會在Uniswap上交易以此套利。所以Uniswap提供的價會傾向相關市場里資產的價格,如Angeris et al [2]所示。這意味著它可以用作一個近似的價格oracle。

然而,Uniswap v1作為一個鏈上價格oracle并不安全,因為它很容易被操控。假設其他合約使用當前的ETH-DAI價格結算一個衍生品。一個希望操控價格的攻擊者可以從ETH-DAIpair購買ETH,出發(fā)衍生品合約的結算(導致它用膨脹后的價格結算),然后再將ETH賣回ETH-DAI pair,讓ETH回到它真正的價格上。這些操作甚至可以發(fā)生在原子操作中,或者由一個控制了交易順序的礦工打包在一個區(qū)塊里。

Uniswap v2通過在每個區(qū)塊的第一筆交易(換句話說,就是在上一個區(qū)塊最后一筆交易以后)中計算和記錄價格,改進了這個oracle的功能。在同一個塊中,價格會變得難以操控。如果一個攻擊者提交了一筆交易,在區(qū)塊的最后嘗試去修改價格,其他套利者可以在同一區(qū)塊提交另一筆交易將價格迅速修改回來。一個礦工(或者一個可以用足夠gas填充一整個區(qū)塊的攻擊者)還是可以操控一個block內的價格,但是除非他們能繼續(xù)挖出下一個區(qū)塊,否則套利的結果并沒有優(yōu)勢。

特別地,Uniswap v2通過在每個區(qū)塊第一筆與該合約交互的交易中,追蹤該區(qū)塊開始時的累計價格來積累這個價格。每個價格都被上一次更新的區(qū)塊的時間間隔加權。這意味著任意時間點的累計價格(更新后)都是之前每一秒價格的總和。


為了估算從時間t1到時間t2的時間加權平均價格,一個外部調用者可以在t1和t2分別檢查累計價格,用t2的累計價格減去t1的累計價格,然后除以t2減去t1(注意合約本身并不會記錄歷史的累計值,調用者需要在周期開始時自己讀取和存儲這個值)


該oracle的用戶可以自己選擇何時開始和結束這個階段。選擇較長的時間間隔會讓攻擊者花費更大的代價操控價格,但是會使價格更新更不及時。

一個復雜的問題是:我們應該計算A相對B的價格,還是B相對A的價格?雖然在特定的時間點,A相對B的價格永遠是B相對A的價格的倒數,但是在一個期間的加權平均值卻不是這樣。比如,加入USD/ETH的價格在Block1時為100,Block2時為200,那么USD/ETH的平均價格則是200,但是ETH/USD的平均價格確實1/150。由于合約并不知道用戶會使用哪一個資產作為計算單位,Uniswap v2會同時追蹤這兩個價格。

另一個復雜的問題是,有人可以將資產發(fā)送到pair合約,改變其余額和編輯價格,不需要與合約交互,因此也不會觸發(fā)oracle價格的更新。如果合約只是簡單的檢查自己的余額并且基于當前價格更新oracle,那么一個攻擊者可以通過在一個區(qū)塊中第一次調用該合約之前迅速發(fā)送資產到合約地址來操控價格。如果上一筆交易是在X秒之前的去快速,那么該合約會錯誤的將新價格乘以X并累計它,雖然沒有人有機會用該價格交易。為了防止這樣的事,核心合約會在每一次交互后緩存資金池的金額,用緩存中的數字更新oracle,而不是使用當前的數字。除了保護oracle免受操縱之外,此更改還支持下面章節(jié)3.2中描述的契約重新架構。

2.2.1 精度

由于solidity對非整數數字數據類型沒有很好的支持,因此Uniswap v2使用簡單的二進制定點格式來編碼和操縱價格。具體地說,給定時刻的價格存儲為UQ112.112數字,這意味著在小數點的兩邊指定了112個小數位的精度,沒有符號。這些數字的范圍為[0,2的112次方?1],精度為1/2的112次方。

選擇UQ112.112格式是出于一個實用的原因-因為這些數字可以存儲在uint224中,這在uint256中留下了32位的存儲槽空閑。Reserve變量每個存儲在一個uint112,也留下32位在一個(打包)256位存儲槽空閑。特別的,最近一次更新的區(qū)塊時間戳和reserve一次存儲,會用2的32次方取膜讓它可以被房價32位的存儲中。另外,盡管在任何給定時刻的價格(存儲為UQ112.112號)被保證適合224位,但這個價格在一個間隔內的積累卻不是。存儲槽的末端額外的32位用于存儲A/B和B/A的累計價格,用于存儲重復累加價格導致的溢出位。這種設計意味著oracle在每個區(qū)塊的第一次交易中只增加了額外的三個SSTORE操作(目前的成本約為1.5萬gas)。

主要的缺點是32位不足以存儲不會溢出的時間戳值。事實上,Unix時間戳溢出一個uint32的日期是02/07/2106。為了確保這個系統(tǒng)在這個日期之后繼續(xù)正常運行,并且在2的32次方 - 1秒之后,oracle只需要在每個時間間隔(大約136年)至少檢查一次價格。這是因為累積的核心方法(以及時間戳的修改)實際上是溢出安全的,這意味著,如果oracle使用適當的(簡單的)溢出算法來計算增量,那么跨溢出區(qū)間的交易可以適當地考慮。

2.3 Flash Swaps

在Uniswap v1中,用戶使用XYZ購買ABC需要將XYZ先發(fā)送給合約之后才可以收到ABC。如果用戶需要購買的ABC來獲得他們支付的XYZ,這是不方便的。比如,用戶也許想在其他合約中用ABC去買XYZ來套利,或者他們可能通過出售抵押品來償還Uniswap來在Maker或Compound平倉。

Uniswap v2增加了一個新特性,使用戶可以在支付資產之前獲取并使用使用它,只要他們可以將支付操作包含在一個原子性交易中。swap函數在轉移用戶請求的token和執(zhí)行不變式之間調用一個可選的用戶指定的回調合約。一旦回調完成,合約會檢查新的余額并確定條件可以滿足(扣除手續(xù)費后)。如果該合約沒有足夠的資金,則整個交易都會被返回。

2.4 協議手續(xù)費

。。。看不懂公式了,反正有個開關打開以后就會把手續(xù)費的1/6給feeTo地址,現在還沒有打開。然后因為每次有人交易都進行手續(xù)費階段的花會花很多gas,所以只在池子金額變化時進行結算。白皮書里給了計算累計手續(xù)費的公式但是我沒看明白,感興趣的自己去看吧。

可以再參考這個:https://blog.csdn.net/sanqima/article/details/109667469

2.5池股的元交易

由Uniswap v2對創(chuàng)建的池共享本身支持元事務。這意味著用戶可以通過簽名授權池共享的轉讓,而不是通過他們的地址進行鏈上交易。任何人都可以通過調用permit函數、支付gas費以及在同一事務中執(zhí)行其他操作來代表用戶提交這個簽名。

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容