Uniswap原理
1 Uniswap簡介
1.1 Uniswap是什么
Uniswap is a protocol for automated token exchange on Ethereum. It is designed around ease-of-use, gas efficiency, censorship resistance, and zero rent extraction.
Uniswap是一個基于以太坊的自動代幣交換協(xié)議,它的設計目標是:易用性、gas高利用率、抗審查性和零抽租。
- Ease-Of-Use(易用性): TokenA換TokenB,在Uniswap也只要發(fā)出一筆交易就能完成兌換,在其它交易所中可能需要發(fā)兩筆交易:第一筆將TokenA換成某種媒介貨幣,如ETH, DAI 等,然后再發(fā)第二筆交易換成TokenB。
- Gas Efficiency(gas高利用率): 在Uniswap上消耗的gas量是以太坊上的幾家主流去中化交易所中最低的,也就代表在Uniswap交易要付的礦工費最少。
- Censorship Resistance(抗審查性): 抗審查性體現(xiàn)在Uniswap上架新Token沒有門檻,任何人都能在Uniswap上架任何Token。這在去中心交易所中很少見,雖然大多數(shù)的去中心化交易所不會像中心化交易所那樣向你收取上幣費,但還是需要提交上幣申請,通過審查后運營團隊才會讓你的Token可以在他們的交易所上交易。
- zero rent extraction(零抽租): 在Uniswap協(xié)議設計中,開發(fā)團隊不會從交易中抽取費用,交易中的所有費用都歸還給流動性提供者。
1.2 Uniswap特點
- A simple smart contract interface for swapping ERC20 tokens.
Uniswap是一種自動流動性協(xié)議,用于基于以太坊的ERC-20代幣交換。 - A formalized model for pooling liquidity reserves.
Uniswap采用了固定的算法,并在以太坊區(qū)塊鏈上的不可升級智能合約系統(tǒng)中實施,它取消了對受信任的中介機構(gòu)的需求,從而優(yōu)先考慮了權(quán)力下放和安全性。 - An open source frontend interface for traders and liquidity providers.
是一個為交易者和流動性提供者提供的開源的前端接口,基于GPL許可的開源軟件。 - A commitment to free and decentralized asset exchange
致力于免費且分布式的資產(chǎn)交換。每個Uniswap智能合約(或交易對合約)管理由兩個ERC-20代幣的儲備組成的流動代幣池。
2 做市
在前面的部分我們知道Uniswap可以實現(xiàn)將一種token換成另外一種token,那uniswap是怎么做到的呢?他和傳統(tǒng)的做市商有什么區(qū)別呢?
2.1 傳統(tǒng)市場上的交易
傳統(tǒng)的交易所一般采用的是訂單簿來撮合買賣雙方,如下圖所示:
簡單來說就是:買方掛自己的購買數(shù)量和價格、賣方掛出自己的賣出數(shù)量和價格,交易所對買賣雙方進行配對,當買價>=賣價時就促成交易,同時產(chǎn)生一個當前最新價。其特點是:
- 市場上必須要有用戶進行掛單,沒有訂單就沒有流動性(市場流動)。
- 訂單必須重疊才能成交,即買價高于或等于賣價。
- 需要將資產(chǎn)存儲在交易所。
2.2 做市商
傳統(tǒng)的交易所(訂單薄模型市場)中,買家期望買入某一資產(chǎn),則賣家必須賣出同一種資產(chǎn),并且要在價格上達成共識,而買家期望以最低的價格購買,賣家期望以最高的價格賣出,如果兩者在價格上無法達成共識,那么將無法達成交易,此時如果想達成交易,要么是買家提價、要么是賣家降價,但當市場上此種資產(chǎn)的流通性較小時,價格達成共識將變得困難,市場流通性變差,此時就需要依靠做市商的參與。簡單來說,做市商會在買賣兩個方向上掛單,讓交易得以達成,避免出現(xiàn)因一方?jīng)]有掛單而導致流動性降低。資產(chǎn)的流動性對其價值影響極其巨大,如果資產(chǎn)無法在需要的時候變現(xiàn),那么和白紙無異。在金融市場中,做市商扮演著非常重要的角色,它負責為市場提供充分的流動性,撮合買家和賣家以促成交易。
2017年涌現(xiàn)出的眾多DEX都采用傳統(tǒng)的訂單簿形式(OrderBook)做市商,即由做市商在交易所中上不斷創(chuàng)建和調(diào)整訂單,等待對手吃單,因此也叫被動做市商。
3 Uniswap上的交易
Uniswap是一個運行在以太坊區(qū)塊鏈上的流動性協(xié)議,支持免信任的代幣互換,也即是說,該交易所上的所有交易都是由智能合約自動執(zhí)行的,用戶無需依靠某個中介也無需信任某個第三方。
3.1 提供流動性
在uniswap上,我們也可以查看當前的流動性情況,如下圖所示:
我們可以為某一個交易對增加流動性,點擊圖中「增加流動性」按鈕;也可以看某一個交易對流動性的詳細信息,如下圖所示:
上述的操作可以通過api來實現(xiàn),Uniswap是一種基于以太坊的協(xié)議,旨在促進ETH和ERC20 代幣數(shù)字資產(chǎn)之間的自動兌換交易。Uniswap完全部署在鏈上,任何個人用戶,只要安裝了去中心化錢包軟件(當前已經(jīng)支持的錢包包括MetaMask、WalletConnect、Coinbase Wallet、Fortmatic、Portis),都可以使用這個協(xié)議。
3.2 換幣
在uniswap上我們可以方便的將我們的ERC20 token換成另外一種ERC20 token,如下所示:
4 uniswap交易做市原理
4.1 整體模型
以Dai-ETH交易對為例,其整體模型如下:
- 任何人可以在uniswap上建立一個雙幣種之間兌換的池子,由創(chuàng)建者往這個池子里添加這兩個幣種,添加的數(shù)量由第一個創(chuàng)建者決定。池子的創(chuàng)建者也屬于流動性提供者。
- 做市商即流動性添加者。以DAI-ETH的池子為例,做市商往池子里添加這兩種幣種,并獲得LP Token(做市憑證)。
- 在做市商提供了流動性以后,用戶就可以和這個池子進行交易了,可以選擇把DAI換成ETH,也可以把ETH換成DAI。
- 交易的過程中,需要給流動性提供者支付手續(xù)費,目前是收取支付幣種的0.3%。由于交易用戶的手續(xù)費直接全部分給做市商,吸引了大資金的玩家進入uniswap提供流動性,大資金的進入會使得用戶在交易的時候以更優(yōu)的價格進行成交,進一步吸引用戶進入uniswap進行交易,繁榮了交易的生態(tài)。
- LP token用于跟蹤用戶資產(chǎn)在總資產(chǎn)池的比率,當用戶取消做市時,通過LP token確定贖回資產(chǎn)的份額,同時將LP Token換成DAI和ETH,并同時獲得做市期間獲得的交易手續(xù)費。
4.2 智能合約
Uniswap是通過智能合約來管理兩種ERC20代幣組成的代幣池,每一筆存入、兌換記錄都可查可追溯。下圖為uniswap網(wǎng)站ETH-DAI兌換的一個截圖:
進入以太坊區(qū)塊查詢網(wǎng)站查找區(qū)塊,其中可以看到這一筆兌換記錄(0xeebec7874f46c4452610a11fa6be0264f7f0557f),如下圖所示:
4.3 AMM(Automated Market Maker,自動化做市機制)
4.3.1 恒定乘積
uniswap中,代幣交易對示例如下圖所示:
對uniswap中的任意一個代幣交易對,其都遵守:
x*y=k
公式,x、y分別代表交易對的兩種代幣。協(xié)議保證:
當用戶要從一個資金池中換出資產(chǎn)時,交易前和交易后池內(nèi)兩種資產(chǎn)的具體數(shù)量的乘積相等。
此公式的曲線圖如下所示:
從上述圖可以看出,由于曲線的斜率是變化的,當交易的數(shù)量不同時,價格是不同的。假設交易使得池子里的數(shù)量從old position點移動到了new position點,交易的價格等于A tokens spent/B tokens spent( price=△x /△y )。從圖可得,若支付2倍的A token,獲得的B token小于原來的2倍,根據(jù)公式可得價格是變大的。
此機制的核心在于:
報價直接取決于訂單的大小
越往曲線右端移動,單位投入獲得的收益越少
4.3.2 價格變動推演(不考慮手續(xù)費)
接下來以ETH/DAI交易對為例,推演一下在進行代幣兌換過程中,兩種代幣的價格變化。假設做市商已經(jīng)為這一流動性池注入了10000 DAI(x)和100 ETH(y)的資金,初始時k = 10000 x 100 = 1,000,000。根據(jù)公式x*y=k可知,在代幣兌換過程中,x、y不斷變化,但是k一直保持不變。
4.3.2.1 通過Dai兌換ETH
價格變化如下:
| 初始 | 0 | 100 | 10000 | 100 | 0 | 1000000 |
| 第1次兌換 | 1 | 99 | 10101.01 | 102.030 | 102.030 | 1000000 |
| 第2次兌換 | 4 | 95 | 10526.316 | 110.803 | 443.213 | 1000000 |
| 第3次兌換 | 5 | 90 | 11111.111 | 123.457 | 617.284 | 1000000 |
| 第4次兌換 | 10 | 80 | 12500 | 156.25 | 1562.5 | 1000000 |
| 第5次兌換 | 20 | 60 | 16666.667 | 277.778 | 5555.556 | 1000000 |
| 第6次兌換 | 20 | 40 | 25000 | 625 | 12500 | 1000000 |
| 第7次兌換 | 20 | 20 | 50000 | 2500 | 50000 | 1000000 |
| 第8次兌換 | 10 | 10 | 100000 | 10000 | 100000 | 1000000 |
| 第9次兌換 | 9 | 1 | 1000000 | 1000000 | 9000000 | 1000000 |
價格變化趨勢如下所示:
說明:x軸為ETH數(shù)量
4.3.2.2 通過ETH兌換Dai
價格變化如下:
| 初始 | 0 | 100 | 10000 | 0.01 | 0 | 1000000 |
| 第1次兌換 | 100 | 101.01 | 9900 | 0.010 | 1.020 | 1000000 |
| 第2次兌換 | 400 | 105.263 | 9500 | 0.011 | 4.432 | 1000000 |
| 第3次兌換 | 500 | 111.111 | 9000 | 0.012 | 6.173 | 1000000 |
| 第4次兌換 | 1000 | 125 | 8000 | 0.016 | 15.625 | 1000000 |
| 第5次兌換 | 2000 | 166.667 | 6000 | 0.028 | 55.556 | 1000000 |
| 第6次兌換 | 2000 | 250 | 4000 | 0.0625 | 125 | 1000000 |
| 第7次兌換 | 2000 | 500 | 2000 | 0.25 | 500 | 1000000 |
| 第8次兌換 | 1000 | 1000 | 1000 | 1 | 1000 | 1000000 |
| 第9次兌換 | 900 | 10000 | 100 | 100 | 90000 | 1000000 |
價格變化趨勢如下所示:
說明:x軸為Dai數(shù)量
4.3.3 價格變動推演(考慮手續(xù)費)
為了鼓勵用于向Uniswap的流動池中提供更多的流動性,Uniswap會從每筆交易總額中抽取0.3%當成交易手續(xù)費,并將手續(xù)費全額交給那些將注資金到Uniswap資金池提供流動性的流動性提供者。Uniswap需要手續(xù)的地方包括:
- 用ETH兌換ERC20代幣,其手續(xù)費為ETH的0.3%;
- ERC20代幣兌換ETH,其手續(xù)費為ERC20代幣的0.3%;
- Uniswap v1中,ERC20代幣兌換ERC20代幣,其手續(xù)費包括了兩部分:一是從ERC20代幣兌換為ETH的交易,手續(xù)費為ERC20代幣的0.3%;從將兌換來的ETH兌換為新ERC20代幣,手續(xù)費為ETH的0.3%。
注意:Uniswap v1中所有的換幣操作都要以ETH為媒介,不過在Uniswap v2中,不依賴ETH就可以換幣。
這里還繼續(xù)使用上面的示例,我們推演一下價格。
4.3.3.1 通過Dai兌換ETH
價格變化如下:
| 初始 | 0 | 100 | 10000 | 100 | 0 | 0 | 1000000 | 1000000 |
| 第1次兌換 | 1 | 99 | 10101.010 | 102.030 | 102.030 | 31.231 | 1000000.000 | 1000031.231 |
| 第2次兌換 | 4 | 95 | 10526.645 | 110.807 | 443.227 | 147.338 | 1000031.231 | 1000178.568 |
| 第3次兌換 | 5 | 90 | 11113.095 | 123.479 | 617.394 | 228.705 | 1000178.568 | 1000407.274 |
| 第4次兌換 | 10 | 80 | 12505.091 | 156.314 | 1563.136 | 733.019 | 1000407.274 | 1001140.292 |
| 第5次兌換 | 20 | 60 | 16685.672 | 278.095 | 5561.891 | 4640.194 | 1001140.292 | 1005780.486 |
| 第6次兌換 | 20 | 40 | 25144.512 | 628.613 | 12572.256 | 23709.243 | 1005780.486 | 1029489.730 |
| 第7次兌換 | 20 | 20 | 51474.486 | 2573.724 | 51474.486 | 397443.414 | 1029489.730 | 1426933.143 |
| 第8次兌換 | 10 | 10 | 142693.314 | 14269.331 | 142693.314 | 6108414.587 | 1426933.143 | 7535347.730 |
| 第9次兌換 | 9 | 1 | 7535347.730 | 7535347.730 | 67818129.573 | 1533099566240.870 | 7535347.730 | 1533107101588.600 |
價格變化趨勢如下所示:
說明:x軸為ETH數(shù)量
4.3.3.2 通過ETH兌換Dai
價格變化如下:
| 初始 | 0 | 100 | 10000 | 0.01 | 0 | 0 | 1000000 | 1000000 |
| 第1次兌換 | 100 | 101.010 | 9900 | 0.010 | 1.020 | 0.306 | 1000000.000 | 1000000.306 |
| 第2次兌換 | 400 | 105.263 | 9500 | 0.011 | 4.432 | 5.319 | 1000000.306 | 1000005.625 |
| 第3次兌換 | 500 | 111.112 | 9000 | 0.012 | 6.173 | 9.259 | 1000005.625 | 1000014.884 |
| 第4次兌換 | 1000 | 125.002 | 8000 | 0.016 | 15.625 | 46.876 | 1000014.884 | 1000061.760 |
| 第5次兌換 | 2000 | 166.677 | 6000 | 0.028 | 55.559 | 333.354 | 1000061.760 | 1000395.114 |
| 第6次兌換 | 2000 | 250.099 | 4000 | 0.063 | 125.049 | 750.296 | 1000395.114 | 1001145.410 |
| 第7次兌換 | 2000 | 500.573 | 2000 | 0.250 | 500.573 | 3003.436 | 1001145.410 | 1004148.846 |
| 第8次兌換 | 1000 | 1004.149 | 1000 | 1.004 | 1004.149 | 3012.447 | 1004148.846 | 1007161.293 |
| 第9次兌換 | 900 | 10071.613 | 100 | 100.716 | 90644.516 | 244740.194 | 1007161.293 | 1251901.487 |
價格變化趨勢如下所示:
說明:x軸為ETH數(shù)量。這里是兩條線,只是藍色和橙色幾乎完全重疊
從上面分析可以看到,大單交易并不是很適合在uniswap上進行,隨著一種幣種的減少,價格變動劇烈,而大單交易容易滑點從而導致價格變化加劇。
更多信息,參考uniswap-數(shù)據(jù)推演.xlsx
5 Uniswap V2
Uniswap V1上的每個交易對中都有ETH,如果要將代幣兌換成代幣B,必須先用代幣A買入ETH,然后再用ETH買入代幣B,因此,交易者需要支付兩筆交易費和gas費,Uniswap V2將不受此限制。具體見下圖(這里的圖來自有關(guān) Uniswap V2 的一切,因為別人畫的比較好,所以就沒有自己畫)。
- 在Uniswap V2中,直接通過Dai兌換Link幣
- 在Uniswap V2中,通過Dai兌換ETH然后兌換Link幣。
- 在Uniswap V2中,實現(xiàn)任意幣種之間的兌換。
6 流動性資產(chǎn)損失
6.1 示例說明
Uniswap中存在流動性資產(chǎn)損失,下面以ETH(X)-DAI(Y)作為示例進行解釋。繼續(xù)使用上面表格中的數(shù)據(jù),假設開始的時候X=100、Y=10000,其中有個流動性提供者往池中注入了1個ETH和100個DAI,占整個流動性池中代幣總量的 1%。經(jīng)過幾筆交易之后,價格發(fā)生了變化(交易費忽略不計)。第三次兌換后,池子中ETH減少5個,DAI增加23.457個。如下所示:
| 初始 | 0 | 100 | 10000 | 100 | 0 | 1000000 |
| 第1次兌換 | 1 | 99 | 10101.01 | 102.030 | 102.030 | 1000000 |
| 第2次兌換 | 4 | 95 | 10526.316 | 110.803 | 443.213 | 1000000 |
| 第3次兌換 | 5 | 90 | 11111.111 | 123.457 | 617.284 | 1000000 |
流動性提供者投入的代幣價值(占總量的1%),即擁有ETH=0.9、DAI=111.111,假設此時提取并這算成DAI,折算后=222.324DAI;對于此時擁有1ETH、100DAI的用戶,折算后其擁有223.457DAI,二者對比即少了1.124DAI,這就是Uniswap中的流動性資產(chǎn)損失。
實際中,因為每次兌換都有手續(xù)費,手續(xù)費的累加將比較客觀,所以流動性提供者最終的收益是手續(xù)費收益 - 流動性資產(chǎn)損失的結(jié)果。
收益分析
流動性提供者實際可獲得的收益是用累計的交易費減去由價格差導致的暫時性虧損所得的余額。
如果長期以來價格起伏過大,造成的損失將遠遠超過交易費帶來的收益。
如果Uniswap能夠能夠吸引到足夠多的流動資金,流動性提供者就能從價格波動中獲得收益。
6.2 公式解釋
這里暫不考慮費用的影響。
6.2.1 恒定乘積公式
恒定乘積公式: X * Y = K;X、Y代表兩種代幣在池子中的數(shù)量,即流動性
uniswap中價格取決于兌換關(guān)系,所以有:
X兌換Y的價格: Pxy = X / Y
Y兌換X的價格: Pyx = Y / X
uniswap提供的服務其實就是用X來換Y或者用Y來換X,這里我們假設通過X來換Y,經(jīng)過一段時間以后X減少了△x、Y增加了△y,同時需要保持恒定乘積,即
恒定乘積公式:(X-△x) * (Y+△y) = K;
假設我們用Pxy表示uniswap池子中X兌換Y的價格,那么有:
結(jié)論:被兌換的token越多,uniswap中兌換價格越高。
6.2.2 流動性公式
由以上公式可以得出,在總流動性恒定的情況下,我們可以計算出特定價格下每個流動性池的大小。
X的流動性為:
Y的流動性為:
整理一下上面公式后得到:
X的流動性變化值:
Y的流動性變化值:
結(jié)論:uniswap池中token流動性受兌換價格影響。
6.2.3 資產(chǎn)損益公式
假設期初時候X的價格為Px1,Y的價格為Py1,經(jīng)過一段時間后X的價格為Px2,Y的價格是Py2,那么最開始時存入資產(chǎn)價值為:
期初存入價值:M1 = X * Px1 + Y * Py1
提現(xiàn)時(假設全部提出)存入價值:M2 = (X - △x) * Px2 + (Y + △y) * Py2
價值變化△m = M2 - M1
整理后的公式為:
假設Y是DAI,而DAI是穩(wěn)定幣,那么公式可以調(diào)整為:
結(jié)論:
- 資產(chǎn)損益受X期初、期末價格以及uniswap中x-y兌換價格影響;
- 如果uniswap池中的x-y兌換價格較大和市場上二者價格偏離,會有套利者進場從而逐步拉平兌換價格,最終價值變化還是收x價格變化影響。
更多信息可以參考:Uniswap 會是下一個聚寶盆嗎?、最強Defi協(xié)議Uniswap原理分析
7 閑話
Uniswap協(xié)議本質(zhì)是在搶交易所的生意,用戶不用依賴任何交易所即可完成代幣之間的兌換;在Uniswap上,無需掛買單或賣單,也不用進行繁重的計算。流動性提供者也可以一勞永逸,訂單和倉位管理方面的開銷也明顯減少。
值得注意的一點是:既然可以不依賴交易所就能完成代幣兌換,那么必然可以實現(xiàn)發(fā)幣功能,即,可以簡單地認為,即便是沒有任何中心化的交易所,也可以發(fā)幣了。當然uniswap上的發(fā)幣還是有一些規(guī)則和規(guī)范的。
對于用戶而言,uniswap提供了兩種能力:
對于希望通過提供流動性來進行獲益的用戶而言,用戶可以將自己擁有的ERC20存入uniswap的流動性提供池,通過提供流動性而獲益。
對于需要流動性的用戶而言,用戶可以在uniswap上將自己的一種ERC20 token換成另外一種ERC20 token,這個過程中不用有任何人掛賣單,因為另一種token由流動性提供者提供。
8 參考文檔
Uniswap是什么、工作原理?Uniswap最全解釋
uniswap的工作原理(上)
最強Defi協(xié)議Uniswap原理分析
一文詳解Uniswap V2的新功能和工作原理
什么是 Uniswap
Uniswap —— 一家不走尋常路的交易所
有關(guān) Uniswap V2 的一切
總結(jié)
- 上一篇: 遇到问题---linux--cronta
- 下一篇: Android媒体库你了解多少