区块链中的数学-Uniswap交易价格计算

  • blocksight
  • 更新于 2020-09-24 14:53
  • 阅读 17105

交易价格的计算有两种类型:一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input);一种是给定Y的数量,计算需要的X数量(Output)。

写在前面

上一节说了Uniwap自动化做市商核心算法解析, 这一节继续说Uniwap做市商算法之价格计算。

本文的基础是上一篇,建议认真理解,否则理解本篇有一定难度。系好安全带,准备出发!

uniswap交易价格计算

交易价格的计算有两种类型: 一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input); 一种是给定Y的数量,计算需要的X数量(Output)。

本文接着上篇加入费用模型的算法。上一节的符号定义全部直接使用,不再重复说明。

给定X数量计算Y

假设要卖出∆x, = ∆x / x,则用来计算可以换取的 ∆y的函数记为getInputPrice如下:

r = 1 - ρ , ρ是费率。交换后,x, y代币余量变化如下:

本次交易,y的价格如下计算: $\frac{\Delta x}{\Delta y}=\frac{\alpha x}{\frac{\alpha \gamma}{1+\alpha \gamma}y}=\frac{1+\alpha \gamma}{\gamma}* \frac{x}{y}$

可以看出$\alpha$越大,对y价格影响越大,$\alpha$最大取1,即使用x当前储备量相同数量x,最多可获取50%的y. 这种情况对价格影响加大,uniswap调用合约执行前,会检查用户输入数量是否对价格产生较大影响。

如果超出预定价格波动范围,会提示”Price impact too high“ 来阻止操作, 使用过uniswap的朋友应该对此比较熟悉。

尤其是当一个pool代币余量比较小的情况,每次交易的数量都不大,这就是所谓的交易深度。

下面看一下,第二种价格计算

给定Y数量计算X

假设要卖出∆y, $\beta$= ∆y / y,则用来计算可以换取的 ∆x的函数记为getOutPrice如下:

注意:这里依然是使用一定数量x来交换y, 不是用y交换x. 这里已知的是∆y,求出需要准备的∆x 可以看出当 $\beta$= 1/2 时,大约需要当前流动性中等量的x代币, 这一结果跟上面getInputPrice 是一致的。

交换后x, y剩余量更新如下:

上一节已经对该公式做了分析,看下此时y代币价格:

代入 = ∆y / y,化简得: $\frac{\Delta x}{\Delta y}=\frac{1}{(1-\beta)\gamma}* \frac{x}{y}$

可见$\beta$ 越大,价格越高。直面理解,置换出的∆y越多,池子里y代币就越少,同时x代币有所增加∆x,y的价格自然上升。

小结

getInputPrice和getOutputPrice分别从两种代币角度计算价格:

  1. 已有∆x数量的x代币,想知道能换得y代币数量

  2. 想换取∆y数量的y代币,想知道需要x代币数量

最终的价格是一致的,价格计算公式只区分价格计算的两种方向(x->y & y->x),不与具体的代币类型挂钩。例如,交易对ETH/UNI,可以把ETH当作x,UNI当作y,同样你也可以将UNI当作x,ETH当作y,这就是抽象。

本文内容主要参考: https://github.com/runtimeverification/verified-smart-contracts/blob/uniswap/uniswap/x-y-k.pdf https://uniswap.org/whitepaper.pdf

本文依然可以感受到uniswap 做市商模型的简洁,

下一节继续分析uniswap中添加移除流动性产生的影响

欢迎关注公众号:blocksight

点赞 1
收藏 4
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
blocksight
blocksight
江湖只有他的大名,没有他的介绍。