时间:2023-08-10|浏览:166
首先,我们拿uniswap中的一个交易对ETH/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作为手续费,并将这笔费用添加到流动性池中。此时,K值变为x*(y+0.3%dy)。
因此,恒定乘积算法中的K值并非固定不变,每一笔交易都会对K值产生影响。
添加流动性也会影响K值。
假设当前资金池中有x个ETH和y个USDT,那么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的ETH,dy=0的USDT,这样也会改变K值。
这种捐赠行为经常发生,有些人错误地将ETH转入uniswap流动性池的合约地址,从而无意中将币捐赠给了原有的流动性提供者。
这种按非K值比例添加流动性的行为被称为捐赠,但是这种捐赠行为在设计上可以被其他人利用。例如,有人充值了dx>0,dy=0,那么另一个人可以按照K值比例充值dy,并执行添加流动性的操作,从而将dx的捐赠收入自己的账户。具体细节比较复杂,我也不太清楚。
任何不按照K值比例添加的流动性都会产生捐赠。例如,dx/dy > x/y,可以先按照(dx-ddx)/dy=x/y的比例添加流动性,并向用户返回相应数量的LPtoken,然后ddx就成为了捐赠。
在同一个区块中,有可能既有添加流动性的交易,又有买卖的交易,这会使K值变得更加复杂。
感谢PlanckerDao成员李世胜对本文的贡献。