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

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

## 写在前面 上一节说了[Uniwap自动化做市商核心算法解析](https://learnblockchain.cn/article/1494), 这一节继续说Uniwap做市商算法之价格计算。 本文的基础是上一篇,建议认真理解,否则理解本篇有一定难度。系好安全带,准备出发! ## uniswap交易价格计算 交易价格的计算有两种类型: 一种是给定X(token)的数量,计算能买到的Y(token)的数量(Input); 一种是给定Y的数量,计算需要的X数量(Output)。 本文接着上篇加入费用模型的算法。上一节的符号定义全部直接使用,不再重复说明。 ## 给定X数量计算Y 假设要卖出∆x, = ∆x / x,则用来计算可以换取的 ∆y的函数记为getInputPrice如下: ![](https://img.learnblockchain.cn/2020/09/24_/649517177.png) r = 1 – ρ , ρ是费率。交换后,x, y代币余量变化如下: ![](https://img.learnblockchain.cn/2020/09/24_/584078921.png) 本次交易,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如下: ![](https://img.learnblockchain.cn/2020/09/24/16009297570126.jpg) 注意:这里依然是使用一定数量x来交换y, 不是用y交换x. 这里已知的是∆y,求出需要准备的∆x 可以看出当 $\beta$= 1/2 时,大约需要当前流动性中等量的x代币, 这一结果跟上面getInputPrice 是一致的。 交换后x, y剩余量更新如下: ![](https://img.learnblockchain.cn/2020/09/24/16009298477695.jpg) 上一节已经对该公式做了分析,看下此时y代币价格: ![](https://img.learnblockchain.cn/2020/09/24/16009298628665.jpg) 代入 = ∆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中添加移除流动性产生的影响](https://learnblockchain.cn/article/1521)。 欢迎关注公众号:blocksight

写在前面

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

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

uniswap交易价格计算

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

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

给定X数量计算Y

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

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

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

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

本次交易,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如下: 区块链中的数学-Uniswap交易价格计算

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

交换后x, y剩余量更新如下: 区块链中的数学-Uniswap交易价格计算

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

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

代入 = ∆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

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

  • 发表于 2020-09-24 14:53
  • 阅读 ( 603 )
  • 学分 ( 61 )
  • 分类:Uniswap

该内容来自于互联网公开内容,非区块链原创内容,如若转载,请注明出处:https://htzkw.com/archives/27695

联系我们

aliyinhang@gmail.com