作者:閃電黃世亮
本文介紹uniswap里的恒定乘積算法中的K值是怎么設計的。
我們拿uniswap里的一個交易對,ETH/USDT來舉例說明K值是怎么設計的,
恒定乘積算法
uniswap里第一個人添加x個ETH和y個USDT的作為流動性時,決定了K值的初始大小,即K=x*y。
這時,ETH和USDT共同構成了一個流動性池,請記住這個概念,很重要。
第一個添加流動性的人,可以任意添加交易對中的兩個幣的數量,即可以任意決定K值,
添加完流動性后,ETH的價格就等于=y(USDT的數量)/x(ETH的數量),如果這個價格和其他交易所之間有價差,那肯定會被人搬磚套利。
所謂的恒定乘積算法,指的是在流動性池沒有再添加或減少流動性的情況下,只有交易行為發生的情況下,K值是不變的。
即如果用戶在ETH/USDT交易對里買入或賣出ETH,都無法改變K值的大小。
而交易行為會修改流動性池里的ETH和USDT的成分,比如用戶買了dx個ETH,則流動性池里的ETH的數量就會變成(x-dx),而usdt的數量則變成了K/(x-dx),即用戶需要花dy=K/(x-dx)-y個Usdt來買dx個ETH。
交易手續費影響K值
但因為存在交易手續費,用戶使用uniswap交易時,需要交0.3%的手續費,比如用戶拿dy個usdt買ETH,uniswap會首先扣除0.3%dy的手續費,先將這0.3%dy的手續費丟在一邊,完成交易后,這0.3%dy會被添加到流動性池里,此時K值就變成了x*(y+0.3%dy),
所以,恒定乘積算法的K值并不恒定,每一筆交易都會影響K值。
添加流動性影響K值
如果現在資金池里有xETH/yUSDT,K=x*y,現在有人又添加了流動性,增加了dx個ETH和dy個usdt,并且dx/dy=x/y,
如果你使用Uniswap的默認設定,即你添加流動性時,先輸入ETH的數量,然后uniswap會默認計算出需要多少usdt,這個默認計算就是保持dx/dy=x/y,
但,添加完流動性后,流動性池里的資金變成了:(x+dx)ETH/(y+dy)USDT。此時,(x+dx)*(y+dy)>x*y。所以添加流動性K值變大了,
同樣的減少流動性,會減少K值,
捐贈影響K值
如果你在添加流動性時,不是按dx/dy=x/y的比例去添加,而是直接往合約地址里轉了dx>0,dy=0,也是可以的。這同樣會改變K值。
這樣的事是經常發生的,有些人錯誤地將ETH轉入一個uniswap流動性池合約地址里,就產生了捐贈行為,白白把幣送給了所有原來的流動性所有者,
這種非K值比例添加流動性的行為,被uniswap稱為捐贈。
但這種捐贈行為,在設計上是可以被其他人套利的,比如有人充值了dx>0,dy=0;此時另外的人可以充值按K值比例的dy,并且執行一個添加流動性的操作,就可以把那dx的捐贈給薅走。這個挺復雜的,細節我也搞不清楚,
任何不是按K值比例添加的流動性,都會產生捐贈,比如dx/dy>x/y,則先添加(dx-ddx)/dy=x/y的流動性,并返回給用戶對應數量的LPtoken,然后ddx就變成了捐贈,
還有,在同一個區塊里,可能即有交易是添加流動性的,也有交易是買賣,那K值就會更復雜的變化,
(感謝Plancker Dao成員李世勝對本文的貢獻)
本文鏈接:https://www.8btc.com/article/6581915
轉載請注明文章出處