以太坊--Uniswap分享

Zeke Luo 2022-07-23 23:26:27 阅读数:834

以太uniswap分享

基礎介紹

Uniswap是一個用於以太坊上自動代幣交換的協議。它圍繞易用性、gas使用效率、抗審查性和零抽租而設計。其主要特點是拋弃了cex的訂單簿交易方式,采用設計的恒定乘積做市商機制。2020年9月發行了代幣Uni。

經濟模型

發行狀况

uni的初始創世總量為10億枚,初始量會在4年內按照每年2%的通貨膨脹增發,確保Uni持有者能繼續在Uniswap中參與和貢獻。初始發行的Uni按照60%在社區,21.66%給團隊,18.044%給投資人,0.69%給顧問的分配方案。後三者都設置了4年的鎖倉期。

分配情况

其中社區的6億枚空投給1.5億老用戶,通過4個池子各500萬的流動性挖礦獎勵釋放完成,剩餘4.3億枚也將通過逐年遞减的方式在4年釋放完成。

關於獲得和用例

Uni作為治理token,這些token的持有者都可以參與社區提案或投票,决定協議的運作方式。Uni沒有協議使用費用,並且Uni的4個流動性挖礦的池子已於2020年11月停止挖礦。

uniswap機制

1、消耗機制

  • 當LP為流動池提供流動性時,會返還LP token。當LP贖回流動性時,就會銷毀提供的token。
  • 贖回流動性時會扣除0.3%的手續費。
  • Uniswap v3為LP提供了四種不同的手續費收費標准——0.01%、0.05%、0.30%和1.00%。
  • 通常情况下,LP會按照目前流動性池裏代幣的比例來增加流動性,獲取LPS。如果新質押的代幣比例與流動性池中不一樣,會按照token數量少的來等比例質押,另一種多出來的不會去質押,避免損失。如果是直接去操作Pair合約,否則還是按token數量少的計算LPS,另一種多出來的將作為捐贈。

2、獎勵機制

  • LP為每個交易對提供流動性,維持這兩種資產的乘積不减少。LP將按提供的流動性的比例獲得每筆交易的手續費。
  • 在V1的基礎上,Uniswap v2引入了協議費用開關。交易費用將設置為名義交易量的0.3%,收取的費用分配到池的儲備金中。開啟協議後,Uni持有者將收取每次交易手續費的0.05%,而LP的獎勵將降低至0.25%。
  • Uniswap V3中,用戶可以參照所有個人曲線接合的流動性進行交易,且每個流動性提供者的gas費都不會增加。LP按一定價格區間收取交易費用,並按照他們在該區間貢獻的流動性數量按比例分攤。

3、底層機制

  • Uniswap的底層機制概述

    不需要傳統的訂單簿,也不需要對手盤。通過恒定的計算公式,讓智能合約來做市商進行交易。在每個交易對中,兩種代幣X和Y的資金量决定了價格。在$x * y = k$**(k為常數)**公式中,維持k不變。x的數量越多,y的數量越少,相應的該交易對中x的價格也會降低,y的價格會上漲。

  • V1

    Uniswap V1建立了存儲A和B兩種貨幣資產的供給池。用戶在用A兌換B的過程中,用戶的A會發送到供給池,使供給池中的A增多,同時,供給池的B會發送給用戶。而A和B的兌換之間的匯率(定價)會根據$**x * y = k$ (k為常數)**公式自動定價,通過供需關系實現自動調價。

  • V2

    1. 自動做市

      V2中在V1的基礎上增加了機制自動化做市商(Automated Market Maker,AMM)。用x從流動性池中交換y,假設輸入x的量為deltax,交易換回的y為deltay,在交易池中的資產足够的前提下,滿足:

      $(x +delat x) *(y-deltay)=k$(其中delatx,delaty等為微小變量)

      $delta y = y - k/(x+deltax)= deltax * y/ x + deltax$

      就是指交易前後,流動性池中兩種代幣的乘積是恒定不變的。因此,如果交易的量相對於流動池中的量很小的話,那麼交易價格就近似為當前兩種代幣的比:

      $price(y) = deltax/deltay = x/y$ (近似於)

    2. 去中心化預言機

      Uniswap v2推出了時間加權平均價格(TWAP)的預言機。V2 預言機通過累計以每秒為基礎存儲Uniswap交易對價格總和來工作。這些價格總和可以在一個時期的開始和結束時檢查一次,以計算該時期的准確時間加權平均價格(TWAP)。

  • V3

    1. 集中流動性

      在v3中,LP可以將資金集中在自定義的價格範圍內,並在期望的價格上提供更多的流動性。這樣一來,LP就能構建出反映自己偏好的個性化價格曲線。這樣LP可以將自動化做市商形態和訂單簿形式做到近似。用戶可以參照所有個人曲線接合的流動性進行交易,且每個流動性提供者的gas費都不會增加。LP按一定價格區間收取交易費用,並按照他們在該區間貢獻的流動性數量按比例分攤。

    2. Architectural Changes 架構變動

      Uniswap v3為每個交易對引入了多個池子,允許分別設置不同的交易手續費。所有池子都使用相同的工廠合約創建。默認允許創建三個手續費等級:0.05%,0.30%和1%。可以通過UNI治理添加更多手續費等級。

    3. Governance 治理

      工廠合約擁有一個owner(一個TimeLock合約),該地址初始時被UNI代幣持有者控制。owner沒有權限暫停core合約的任何操作。UNI治理有權利將owner轉移給其他地址。

    4. Oracle Upgrades 預言機昇級

      1. Uniswap v3無需預言機用戶在外部記錄曆史累計價格。v3將累計檢查點放到core合約,允許外部合約直接計算最近一段時間的鏈上TWAP,無需額外保存累計價格。
      2. Uniswap v3不再使用累計價格之和計算算術平均數TWAP,而是通過記錄$log$價格之和計算幾何平均數TWAP。
      3. Uniswap v3還增加了一個流動性累計數,每秒累計L分之一(即流動性倒數)。累計流動性對於那些基於Uniswap v3實現流動性挖礦的外部合約很有用。它也可以被其他合約用於判斷一個交易對的哪個池子具有最可信的TWAP。
  • 其他機制

    1. 維持流動性機制(Uniswap V2)

      Pair智能合約對應的LPS是有18比特小數的(以太坊中最大的小數比特數),理論上有一種情况是LPS的最小量Minlps(即0.000,000,000,000,000,001 LPS)價值非常大,導致後續小流動性提供者很難再提供流動性了,因為提供流動性的成本太高了,例如Minlps = $100的,要增加流動性就至少質押$100美金才能獲得LPS,而隨著LPS增值,流動性成本越來越高,不利於維持交易的流動性。在Uniswap白皮書中把這種極端情况認為是一種可能的人為攻擊,為了提高這種攻擊的成本,在新創建流動性池的時候,設置了最小流動性值Minlps15=0.000,000,000,000,001,即LPS最小單比特的1000倍,任何流動性池在啟用之初都要在零地址中鎖定Minlps的LPS。

      維持流動性機制之下,如果人為把LPS價值提昇到Minlps = $100,就需要在零地址中鎖定價值 $100,000 的LPS,這樣就極大地提昇了攻擊成本。而且在通常情况下,Minlps15的價值是很小的,甚至可以忽略,所以第一次質押後獲得的LPS雖然要减少Minlps15,但約等於10,000不變。

    2. Pair的流動性跟踪機制(Uniswap V2)

      在初始化一個pair合約之後,其中兩種代幣的初始值為0,為了使流動性池可以開始促成交易,必須有流動性提供者(LP)質押移動量的兩種代幣來啟動流動性池,第一個LP就是這盯著流動性池初始價格的人,並且獲得流動性池份額(LPS)。每次交易完之後由於兩種代幣的數量會發生變化,價格會遵循自動定價公式,將LP初始化質押的兩種代幣量分為X0和Y0,則獲得的流動性池份額(LPS)為s0:

      $S0^2 = X0 * Y0$

      這樣的計算的好處是可以是LPS在任何時候都不受質押的兩種代筆的比例影響,因為兩種token在流動性池中的比例可能與市場價格不符。

      按照LPS初始值的計算公式,一個LPS的價值不會低於Pair中兩種質押代幣的幾何平均數,而且隨著交易手續費的積累會使LPS的價值昇高,因為交易手續費在流動性池中積累,針對這部分手續費並不會產生新的LPS,效果就是池子變大,但是LPS總量沒變,兩者的比值即LPS的價值就昇高了。

    3. 無常損失(Uniswap V2/V3)

      這種損失是由於代幣價格背離引起的。當價格回歸時,這種損失也就沒有了。損失不等同虧損。當一對代幣存入Uniswap後,如果一種代幣以另一種進行計價的價格上昇,那麼在價格上昇後你把他們取出,得到的總價格比直接手握這兩種代幣要低一些,低的這一部分就是損失,價格偏離越大損失就越大,所以可能造成虧損,特別是當兩種代幣在實際中都要以其他穩定幣來計價時。

    4. Uniswap V2 ERC20優化AMM機制

      Uniswap V2 ERC20要求owner在鏈下對某個Dapp授權操作的簽名,將其一起發給DApp的智能合約,在DApp智能合約中發起的ERC-20的執行交易中,先驗證授權簽名,然後再調用提取函數進行owner賬戶下的token提取,這樣整個交易流程就只有一個鏈上交易,將大幅降低gas費。

      Uniswap V2 Pair主要提供了三個功能:

      1. 流動性追踪

        追踪交易池中的代幣餘額,並且提供流動性代幣。

        流動性:指合約裏的兩種ERC-20代幣的綜合,同時質押兩種代幣稱為增加流動性。

        流動性池(Pool):所有流動性匯集成的池子,即AMM的資產池,Uniswap協議通過流動性池提供個人對合約的交易撮合。

      2. 流動性提供者(Liquidity Pool / LP)

        Uniswap V2 Pair本身也是一種ERC-20合約,它的代幣用來作為流動性代幣,在LP提供流動性時自動增發(mint)代幣給LP,提供流動性時燃燒(burn)LP的代幣。

      3. 流動性池份額(LPS)

        計算所占有的流通的流通型代幣的份額值,用來記錄每個LP的流動性貢獻比例。

投票治理過程

  • Uniswap 的提案流程

    發起人/團隊進行社區民意調查→發起人/團隊發起提案→委員會進行審核→投票環節→提案通過,發起人/團隊獲得資金或其他支持→完成提案,驗收。

  • Uniswap 持有者提交提案

    任何地址中持有超過 2,500,000 個 UNI 可以提交修改或引入新功能的提案,並獲得其他社區成員的批准。UNI 持有者可以自己投票或將他們的投票委托給其他用戶,持有者認為他們會做出代錶 Uniswap 生態系統最佳利益的决定。

    • 第一階段是溫度檢查,提議者需要向社區介紹想法並獲得足够的選票以進入下一階段。在這裏,該提案必須獲得多達 25,000 個 UNI 贊成票才有資格進行進一步審議。
    • 第二階段是共識檢查。在這個階段,提議者必須啟用正式的討論,以突出提議的核心變化和優勢。對於擴大這一階段的提案,提案必須吸引不少於 50,000 個 UNI 的贊成票。
    • 第三階段是治理提案。這是提議者提交經過審計的代碼以進行最終審議的地方。與其他兩個階段一樣,有一個最低投票要求來决定提案是否被采納——每個提案必須獲得多達 40,000,000 個 UNI 贊成票才有資格實施。

版本的區別

  • V1&V2

    1. V2支持ERC20 token/ERC20 token交易對

      v1使用ETH作為過渡貨幣,每個交易對都包含ETH。這使得路由更簡單(不同token之間都要進行與ETH的轉換進行),並且减少了流動性的分散。但所有LP都有ETH的敞口,增加了LP的成本,並且由於其他資產相對於ETH的價格而變化遭受無常損失。使用ETH作為强制性過渡貨幣也會給交易者帶來成本。交易者必須支付的費用是直接購買交易對的兩倍費用,因此會遭到兩次滑點。

    2. V2强化的價格預言

      合約無法知道用戶想要哪個資產作為賬戶單比特,所以會同時追踪兩個價格;用緩存的資金儲備更新價格預言而不用當前資金儲備。

    3. 快速互換

      允許用戶在支付前接受和使用資產,只要他們在同一個原子的轉賬中完成支付。swap函數調用一個可選的用戶指定的回調合約,在這之間轉出用戶請求的token並且强制確保不變。一旦回調完成,合約檢查餘額並且確保滿足不變(在經過支付手續費調整後)。如果合約沒有足够的資金,它會回滾整個交易。用戶也可以用同樣的代幣返還給Uniswap資金池而不完成互換。這高效地讓任何人從Uniswap資金池快速借取任何資產(Uniswap收取同樣的0.3%的交易手續費)

    4. 協議手續費

      Uniswap v2包括0.05%協議手續費,默認情况下是關閉的。打開後手續費會被發送給工廠合約中制定的feeTo地址。初始時,feeeTo沒有被定義,不收手續費。一個預先指定的地址feeToSetter可以在Uniswap v2工廠合約上調用setFeeTo函數,設置feeTo地址。feeToSetter也可以自己調用setFeeToSrtter修改feeToSetter地址。如果feeTo地址被設置,協議會收取0.05%的手續費,從流動性提供者的0.3%手續費中抽取1/6.交易者將在所有交易商支付0.3%手續費,83.3%的手續費給LP,16.6%手續費給feeTo地址。總共收集的手續費可以用自從上次手續費收集以來的增長來計算。

  • V2&V3

    1. Layer 2中的Uniswap

      因以太坊交易費的增長,個體用戶在使用Uniswap面臨巨大的經濟壓力。而v3將部署在“Optimistic Rollup”的Layer 2擴展解决方案中。這可以在擴展智能合約的同時享受以太坊網絡的安全性。該部署應該會推動交易吞吐量大幅增長,用戶的交易費用也會顯著降低。

    2. Non-Fungible Liquidity 不可互換的流動性

      在Uniswap v3,由於頭寸的不可互換性,複利將變得不再可能。相反,手續費被獨立保存,並且以支付手續費的代幣形式持有。由於每個頭寸的價格區間都不一樣,因此v3的流動性不再像v2一樣分布在所有價格區間,也就是說,v2流動性是可互換的,因此可以使用ERC-20代幣錶示。而v3流動性實際上是一個NFT(不可互換代幣),使用ERC-721 錶示。

    3. 移除原生流動性代幣 。在Uniswap v1和v2,交易對池子合約本身是一個ERC-20合約,它的代幣錶示池子持有的流動性。Uniswap v3引入的改動讓可互換的流動性代幣變成不可能。由於自定義流動性的特性,現在手續費以獨立的代幣被池子收集並持有,而不是自動複投為池子的流動性。

uniswap的審計公司介紹

  • ConsenSys Diligence

    母公司是ConsenSys,該公司作為知名以太坊軟件公司。旗下有Infura、Quorum、Truffle、Codefi、MetaMask和Diligence。

    1. 提供的服務

      智能合約審計、自動化安全分析、智能合約測試、自動屬性檢查、企業安全諮詢、威脅建模、時間響應計劃

    2. 審計報價

      根據合約項目制定一對一方案

    3. Uniswap合約完整審計報告

      GitHub - ConsenSys/Uniswap-audit-report-2018-12

    4. 該公司審計的其他重要合約

      ENS、AAVE。liquality

      更多參考下面鏈接:

      Public Smart Contract Audits and Security Reviews | ConsenSys Diligence

關於Uniswap的思考

  • Uniswap v2中滑點過大,夾子問題

    1、什麼是夾子

    機器人通過檢測Uniswap所有交易對尋找滑點利潤,當機器人檢測到大額掛單後通過提高gas來提前買入抬高價格,隨後再出貨從而實現利潤。

    2、具體操作

    整個流程最核心的操作就是在交易對中出現大額買賣,將引起價格劇烈波動時,夾子機器人搶先交易,從而實現利益最大化。而這個操作的前提是大額交易,由於恒定乘積公式的原因,池子中出現大額的交易,會影響池中代幣價格劇烈波動。

    3、解决方法

    綜上,解决這一問題的辦法就是避免大額交易,根據池中的總額度選擇適當的金額進行交易;若有大額交易需求,可以分為多筆進行交易,這雖然會產生多筆gas費,但是相較於被夾子套利來講,多筆交易產生的gas費是可以接受的。

    4、壞處

    將對用戶造成巨額損失,降低用戶使用積極性,减少Defi的交易活躍度。

    5、好處

    使交易者不會貿然進行大額交易,能使交易對在合理的區間波動,避免致使池子流動性枯竭。

  • Uniswap2中快速互換機制,出現閃電貸操作

    1、什麼是閃電貸

    因為Uniswap v2增加了快速交換機制,這樣就導致出現了在傳統的金融市場中不可能出現的操作——閃電貸。顧名思義就是快速的借貸還貸,而無需任何的抵押物。

    2、具體操作

    在Uniswap中實現閃電貸,首先套利者需要找到有價差的交易對,然後使用A代幣到交易對中貸出B代幣,再將B代幣用於另一個交易對貸出代幣C,隨後將代幣C置換回代幣A,最後在保證和貸出時的交易塊是同一個區塊的前提下將貸出額度進行償還,整個流程結束。套利者獲得中間的價差,而成本只是交易中產生的手續費。而貸出額度越大。交易的交易對越多,獲利越多。

    3、解决方法

    閃電貸的交易條件很苛刻,要求有大額的資金、足够的套利空間交易對、需要在一個區塊中完成多筆交易、最後需要有足够的資金償還貸款金額。如果這其中一個環節失敗都將會導致交易回滾,損失gas交易費。因為uniswap機制的緣故,又有大量的人湧入這個操作中,出現為了保證交易鏈的完整性,需要用更多的gas費來賄賂礦工,最後套利者收益减少,更多的收益流到了礦工手上,這導致了很多人放弃該逐利操作。也能通過提高預言機價格獲取延遲和增加交易延遲。

    4、壞處

    若出現預言機攻擊,導致價格在短時間內出現錯誤,使套利者借出更多的錢,這將對LP造成巨大損失;大量的閃電貸交易會引發gas war,這不利於後續交易者交易,降低人們交易需求;使真正有借貸需求的用戶沒有足够額度,减少LP收益。

    5、好處

    持有一個可清算的借款頭寸,實現鏈上清算,加强資金流動;快速鑄造ERC20的代幣,需在區塊結束時銷毀代幣;鑄造新的代幣進行抵押物替換。讓池子中代幣的價格回到正常值。

Uni v2套利流程:

 

代碼分析:

Uinswap V3 主要由工廠Factory合約 池子Pool合約組成。加路由合約 (工廠會部署很多不同的池子)

  • factory

工廠定義了生成池的邏輯。池由構成資產對的兩個代幣和費用定義。同一資產對可以有多個池,僅通過交換費用來區分

  • pool

礦池主要作為配對資產的自動做市商。此外,它們公開價格預言機數據,並可用作閃存交易的資產來源。

  • router

交換路由器支持前端產品交易的所有基本要求。它本身支持單次交易(x 到 y)和多跳交易(例如 x 到 y 到 z)

版权声明:本文为[Zeke Luo]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/204/202207232325350280.html