20

区块链-深入理解Uniswap协议 | 深入浅出区块链 | 技术博客

 4 years ago
source link: https://learnblockchain.cn/2019/11/25/Uniswap/?from=timeline&isappinstalled=0
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

区块链-深入理解Uniswap协议

最近想换换脑子,看了看Uniswap协议。Uniswap协议是一种通过智能合约实现代币间自动交易的协议。本文介绍Uniswap协议,生态,交易价格以及流动性收益的计算。

最近想换换脑子,看了看 Uniswap 协议。Uniswap 协议是一种通过智能合约实现代币间自动交易的协议。本文介绍 Uniswap 协议,生态,交易价格以及流动性收益的计算。

Uniswap 协议基本介绍

Uniswap 协议通过智能合约实现了代币之间的自动交易。目前,Uniswap 协议已经在以太坊上部署,可以实现 ETH 和代币以及代币和代币的之间交易。Uniswap 协议的整个框架如下图所示:

Uniswap 协议

Uniswap Exchange Factory 以及 Uniswap Exchange 都是由以太坊上的智能合约(vyper 语言)实现,相关的代码的 GitHub 地址如下:

https://github.com/Uniswap/contracts-vyper

通过 UniswapExchangeFactory 可以创建 Uniswap Exchange。每个 Uniswap Exchange 实现一种代币和 ETH 之间的交易。

在多种代币都能和 ETH 交易的前提下,代币和代币之间也能交易,如下图所示:

代币和代币之间

两个 Exchange,一个提供了 ABC 和 ETH 的交易,一个提供了 XYZ 和 ETH 的交易。通过 Uniswap 协议,一个用户可以先通过 ABC to ETH Exchange 将 ABC 转成 ETH,接着再通过 XYZ to ETH Exchage 将 ETH 转换成 XYZ。整个过程 Uniswap 自动完成,从用户的角度来看,ABC 代币直接转换成了 XYZ 代币。

Uniswap 生态

Uniswap 交易生态中,除了需要交易的用户外,还有一个特别重要的角色:流动性提供者。对一个 Exchange 来说,流动性提供者提供了 ETH 以及相应的 Token。只有有足够多的流动性,用户才能顺畅的交易,并能保持价格在合理的范围。

Uniswap 生态

普通交易用户,通过 Exchange,实现一个代币和 ETH 之间的交换。流动性提供者,同时提供代币和 ETH。交易的用户每笔交易需要支付一定的交易费用(0.3%)。这些费用被流动性提供者均分。

x-y-k 做市商模型

Uniswap 协议使用的是 x-y-k 做市商模型,实现 x 和 y 之间的自动交易。Uniswap 协议在 github 上有对 x-y-k 模型的详细介绍

x-y-k 模型

所谓的 x-y-k 模型,是因为在这个模型下,xy = k。可以想象成 x 和 y,分别是两种代币的数量。在 x 和 y 交易时,在没有交易费用的情况下,xy 永远等于 k,不变:

x-y-k 模型

alpha 和 beta 分别是每次交易的变化量。从上面的公式可以看出,变化前(x*y)和变化后(x‘*y')是相等的。

Uniswap 协议在该模型的基础上,引入了交易费用,新的模型计算公式如下:

模型计算公式

引入交易费用,增加了 rho 变量。很容易可以看出,引入交易费用后,x'y'是比 xy 的乘积大。

交易价格计算

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

getInputPrice 的计算公式如下:

getInputPrice 的计算公式

也就是说,Delta X 的代币能换取 Delta Y 的其他代币。此时,Y 代币的价格为:

Y 代币的价格

简单的说,买入越多 X,alpha 越大,价格也越高。如果 alpha 为 1 的话(用当前流动性中 X 总额相等的 X 代币买入),也只能买差不多流动性中的一半的 Y 代币。如果把 x/y 视作当前 Exchange 的价格的话,一次买入后,价格变化为:

价格变化

也就是说,“价格”是随着买卖的比例二次函数变化:

二次函数变化

getOutputPrice 的计算公式如下:

getOutputPrice 的计算公式

也就是说,Delta Y 的代币能换取 Delta X 的 X 代币。此时,Y 代币的价格为:

Y 代币的价格

简单的说,买入越多 Y,beta 越大,价格也越高。如果 beta 为 1/2 的话(买入当前流动性中一半的 Y 代币),大约需要当前流动性中等量的 X 代币。getInputPrice 和 getOutputPrice 分别从两种代币角度计算价格,具体的价格是一致的。注意,价格计算公式只区分价格计算的两种方向,并没有制定 X,Y 具体代表的代币类型。举个例子,如果一个 Exchange 支持的是 ETH 和 ABC 交易,你可以把 ETH 当作 X,ABC 当作 Y,同样你可以将 ABC 当作 X,ETH 当作 Y。

流动性计算

流动性提供者可以随时增加/删除流动性。Uniswap 协议文档,用一个三元组(e, t, l)来代表 Exchange 的状态,其中 e 代表 ETH 的数量,t 代表 Token 的数量,l 代表当前流动性总量。

增加流动性(addLiquidity)的计算公式如下:

增加流动性

增加流动性,就是增加同等比例的 e 和 t。

删除流动性(removeLiquidity)的计算公式如下:

删除流动性

删除流动性,就是依据流动性的占比,等比例的减少 e 和 t。

很容易看出,增加流动性和删除流通性时都是按照 x/y 的价格计算的。需要指出的是,在智能合约实现时,需要考虑计算的精度。

流动性收益计算

到目前为止,我们已经知道,增加流动性和删除流通性都是按照当时 x/y 的价格计算的。Exchange 的买卖会导致 x/y 的波动。先不考虑交易费用的情况下,可以先将模型退化到 x*y=k 的情况,看看流动性提供者的收益:

假设初始时,Exchange 的代币流通性是 e 和 t,经过一些交易后变成 e'和 t',e*t=e'*t'。

流动性收益计算

假设 P'/P=x, 则收益曲线如下:

收益曲线

很容易看出,只要 x/y 有变化,在没有交易费用的情况下,没有盈利可能。最好的情况,e/t 不变的话,没有损失。在有交易费用的情况下,只有交易费用足够多,能抵消价格波动的损失的情况下,才有可能盈利。

Uniswap 协议是一种通过智能合约实现代币间自动交易的协议。Uniswap 协议采用 x-y-k 交易商模型。交易的价格随着交易金额的比例成二次函数变化。流动性提供者在没有交易费用的情况下,没有盈利的可能性。只有足够多的交易费用的情况下,才有可能盈利。

我的公众号星想法有很多原创高质量文章,欢迎大家扫码关注。

公众号-星想法

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

  • 发表于 2019-11-25 10:36
  • 阅读 ( 4675 )
  • 学分 ( 20 )
  • 分类:Uniswap

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK