技术简析 Uniswap 恒定乘积算法中的 K 值设计

原文标题:《Uniswap 的恒定乘积算法里的 K 值》
撰文:黄世亮
,本文介绍 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。,但因为存在交易手续费,用户使用 Uniswap 交易时,需要交 0.3% 的手续费。比如用户拿 dy 个 usdt 买 ETH,Uniswap 会首先扣除 0.3%dy 的手续费,先将这 0.3%dy 的手续费丢在一边,完成交易后,这 0.3%dy 会被添加到流动性池里,此时 K 值就变成了 x*(y+0.3%dy)。,所以,恒定乘积算法的 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 值。,如果你在添加流动性时,不是按 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 成员李世胜对本文的贡献。,

Uniswap 中恒定乘积 K 值会受到交易手续费、添加流动性和捐赠行为的影响。

原文标题:《Uniswap 的恒定乘积算法里的 K 值》
撰文:黄世亮

本文介绍 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 成员李世胜对本文的贡献。

,原文标题:《Uniswap 的恒定乘积算法里的 K 值》
撰文:黄世亮
,本文介绍 Uniswap 里的恒定乘积算法中的 K 值是怎么设计的。

原创文章,作者:黄世亮,如若转载,请注明出处:http://www.lianchaguan.com/archives/33782

发表评论

电子邮件地址不会被公开。 必填项已用*标注