基于一種通過智能合約實現(xiàn)代幣間自動交易的Uniswap協(xié)議原理詳解
最近想換換腦子,看了看Uniswap協(xié)議。Uniswap協(xié)議是一種通過智能合約實現(xiàn)代幣間自動交易的協(xié)議。本文介紹Uniswap協(xié)議,生態(tài),交易價格以及流動性收益的計算。
1. Uniswap協(xié)議基本介紹
Uniswap協(xié)議通過智能合約實現(xiàn)了代幣之間的自動交易。目前,Uniswap協(xié)議已經(jīng)在以太坊上部署,可以實現(xiàn)ETH和代幣以及代幣和代幣的之間交易。Uniswap協(xié)議的整個框架如下圖所示:
Uniswap Exchange Factory以及Uniswap Exchange都是由以太坊上的智能合約(vyper語言)實現(xiàn),相關的代碼的github地址如下:
https://github.com/Uniswap/contracts-vyper
通過UniswapExchangeFactory可以創(chuàng)建Uniswap Exchange。每個Uniswap Exchange實現(xiàn)一種代幣和ETH之間的交易。
在多種代幣都能和ETH交易的前提下,代幣和代幣之間也能交易,如下圖所示:
兩個Exchange,一個提供了ABC和ETH的交易,一個提供了XYZ和ETH的交易。通過Uniswap協(xié)議,一個用戶可以先通過ABC to ETH Exchange將ABC轉(zhuǎn)成ETH,接著再通過XYZ to ETH Exchage將ETH轉(zhuǎn)換成XYZ。整個過程Uniswap自動完成,從用戶的角度來看,ABC代幣直接轉(zhuǎn)換成了XYZ代幣。
2. Uniswap生態(tài)
Uniswap交易生態(tài)中,除了需要交易的用戶外,還有一個特別重要的角色:流動性提供者。對一個Exchange來說,流動性提供者提供了ETH以及相應的Token。只有有足夠多的流動性,用戶才能順暢的交易,并能保持價格在合理的范圍。
普通交易用戶,通過Exchange,實現(xiàn)一個代幣和ETH之間的交換。流動性提供者,同時提供代幣和ETH。交易的用戶每筆交易需要支付一定的交易費用(0.3%)。這些費用被流動性提供者均分。
3. x-y-k做市商模型
Uniswap協(xié)議使用的是x-y-k做市商模型,實現(xiàn)x和y之間的自動交易。Uniswap協(xié)議在github上有對x-y-k模型的詳細介紹:
https://github.com/runtimeverificaTIon/verified-smart-contracts/blob/uniswap/uniswap/x-y-k.pdf
3.1 x-y-k模型
所謂的x-y-k模型,是因為在這個模型下,x*y = k??梢韵胂蟪蓌和y,分別是兩種代幣的數(shù)量。在x和y交易時,在沒有交易費用的情況下,x*y永遠等于k,不變:
alpha和beta分別是每次交易的變化量。從上面的公式可以看出,變化前(x*y)和變化后(x‘*y‘)是相等的。
Uniswap協(xié)議在該模型的基礎上,引入了交易費用,新的模型計算公式如下:
引入交易費用,增加了rho變量。很容易可以看出,引入交易費用后,x’*y‘是比x*y的乘積大。
3.2 交易價格計算
交易價格的計算分成兩種:一種是給定X的數(shù)量,計算能買到的Y的數(shù)量(Input);一種是給定Y的數(shù)量,計算需要的X數(shù)量(Output)。
geTInputPrice的計算公式如下:
簡單的說,買入越多X,alpha越大,價格也越高。如果alpha為1的話(用當前流動性中X總額相等的X代幣買入),也只能買差不多流動性中的一半的Y代幣。如果把x/y視作當前Exchange的價格的話,一次買入后,價格變化為:
getOutputPrice的計算公式如下:
簡單的說,買入越多Y,beta越大,價格也越高。如果beta為1/2的話(買入當前流動性中一半的Y代幣),大約需要當前流動性中等量的X代幣。geTInputPrice和getOutputPrice分別從兩種代幣角度計算價格,具體的價格是一致的。注意,價格計算公式只區(qū)分價格計算的兩種方向,并沒有制定X,Y具體代表的代幣類型。舉個例子,如果一個Exchange支持的是ETH和ABC交易,你可以把ETH當作X,ABC當作Y,同樣你可以將ABC當作X,ETH當作Y。
3.3 流動性計算
流動性提供者可以隨時增加/刪除流動性。Uniswap協(xié)議文檔,用一個三元組(e, t, l)來代表Exchange的狀態(tài),其中e代表ETH的數(shù)量,t代表Token的數(shù)量,l代表當前流動性總量。
增加流動性(addLiquidity)的計算公式如下:
刪除流動性,就是依據(jù)流動性的占比,等比例的減少e和t。
很容易看出,增加流動性和刪除流通性時都是按照x/y的價格計算的。需要指出的是,在智能合約實現(xiàn)時,需要考慮計算的精度。
3.4 流動性收益計算
到目前為止,我們已經(jīng)知道,增加流動性和刪除流通性都是按照當時x/y的價格計算的。Exchange的買賣會導致x/y的波動。先不考慮交易費用的情況下,可以先將模型退化到x*y=k的情況,看看流動性提供者的收益:
假設初始時,Exchange的代幣流通性是e和t,經(jīng)過一些交易后變成e’和t‘,e*t=e’*t‘。
很容易看出,只要x/y有變化,在沒有交易費用的情況下,沒有盈利可能。最好的情況,e/t不變的話,沒有損失。在有交易費用的情況下,只有交易費用足夠多,能抵消價格波動的損失的情況下,才有可能盈利。
總結(jié):
Uniswap協(xié)議是一種通過智能合約實現(xiàn)代幣間自動交易的協(xié)議。Uniswap協(xié)議采用x-y-k交易商模型。交易的價格隨著交易金額的比例成二次函數(shù)變化。流動性提供者在沒有交易費用的情況下,沒有盈利的可能性。只有足夠多的交易費用的情況下,才有可能盈利。