【深度知识】Uniswap协议原理分析
文章图片
Uniswap
是DeFi
中最著名的协议之一,Uniswap
本质是一个自动化做市商(AMM
),它舍弃了传统订单薄的撮合方式,采用流动池加恒定乘积公式算法(
文章图片
)为不同加密资产提供即时报价和兑换服务。
什么是Uniswap
关于什么是Uniswap
,先看一下Uniswap
白皮书中的定义:
Uniswap is a protocol for automated token exchange on Ethereum. It is designed around ease-of-use, gas efficiency, censorship resistance, and zero rent extraction.
Uniswap
是一个基于以太坊的自动代币交换协议,它的设计目标是:易用性、gas
高利用率、抗审查性和零抽租。- ease-of-use(易用性):
Token A
换Token B
,在Uniswap
也只要发出一笔交易就能完成兑换,在其它交易所中可能需要发两笔交易:第一笔将Token A
换成某种媒介货币,如ETH
,DAI
等,然后再发第二笔交易换成Token B
。
-
gas efficiency
(gas
高利用率):在Uniswap
上消耗的gas
量是以太坊上的几家主流去中化交易所中最低的,也就代表在Uniswap交易要付的矿工费最少。
文章图片
censorship resistance
(抗审查性):抗审查性体现在Uniswap
上架新Token
没有门槛,任何人都能在Uniswap
上架任何Token
。这在去中心交易所中很少见,虽然大多数的去中心化交易所不会像中心化交易所那样向你收取上币费,但还是需要提交上币申请,通过审查后运营团队才会让你的Token
可以在他们的交易所上交易。下面是各去中心化交易所上币规则的详情:
- KyberSwap上币规则:https://developer.kyber.network/docs/Reserves-ListingProcess/
- EtherDelta上币规则:https://steemit.com/cryptocurrency/@mindseye69/new-etherdelta-coin-listing-rules
- IDEX上币规则:https://medium.com/@forrestwhaling/idex-token-listing-guidelines-eae00785fdd2
- Uniswap上币规则:https://uniswap.org/docs/v1/frontend-integration/token-listing/
zero rent extraction
(零抽租):在Uniswap
协议设计中,开发团队不会从交易中抽取费用,交易中的所有费用都归还给流动性提供者。
- 市场上必须要有用户进行挂单,要有一定量的订单(市场流动)。
- 订单必须重叠才能成交,即买价高于或等于卖价。
-
需要将资产存储在交易所。
文章图片
文章图片
为什么
Uniswap
不采用订单薄模型?Uniswap
部署在以太坊上,而以太坊每秒可以出来15
笔左右的交易,这对于订单薄交易所来不可行,主要原因是:“订单薄模型依赖一个或多个外部做市商对某项资产一直不断的做市,而以太坊的TPS
过低不支持做市商高频的交易,如果缺少了做市商,那么交易所的流动性立刻会降低,对于用户来说这样的交易所体验很差。”Uniswap
采用流动池加恒定乘法公式这种自动化做市商(AMM)模式实现了资产的交换,自动化做市商模式方式不需要买卖双方进行挂单,也不要买卖双方的订单重叠,可以进行自由买卖。- 流动池:使用流动池来提供买卖双方交易,做市商只要把资金放入流动池即可
- 恒定乘法公式:按照流动池中
Token
的数量,自动计算买卖价格
流动池就是锁定在智能合约中所有的代币以及资金的总称,流动是资金转为代币,或代币转为资金的意思。
一个完整的流动池分为2个部份,分别表示不同的货币,成为一个交易对,在
Uniswap V1
中就是ETH
及ERC20
代币,在Uniswap V2
中是支持不同ERC20
代币直接交换,所以在Uniswap V2
中的流动池可以允许两边是不相同的ERC20
代币,其中ETH
会自动转换成以WETH
代币。为了简化,直接以ETH-ERC20
交易对作为例子。如下图所示,
Uniswap
将所有做市商的ETH
集合在一起放在流动池左边, 将所有ERC20
集合在一起放在流动池的右边。如果有用户要买ERC20
代币,就从流动池的右边将ERC20
代币转给用户,同时将用户支付的ETH
添加的流动池的左边,然后重新计算流动池中的价格,等待下次交易。文章图片
Uniswap
是无法自己变出钱来,因此需要依赖外部资金向合约中提供流动性,向Uniswap
流动池中提供流动性的用户被称为流动性提供者,当流动性提供者向Uniswap
中注入流动性的时候,Uniswap
会铸造出一个流动性代币(LP
),铸出LP
代币数量是与用户注入的资金所占流动池中的资金比例相关,动性提供者可以选择在任何时间销毁自己持有的流动性代币。为了鼓励用于向Uniswap
的流动池中提供更多的流动性,Uniswap
会从每笔交易总额中抽取0.3%
当成交易手续费,并将手续费全额交给那些将注资金到Uniswap
资金池提供流动性的流动性提供者。恒定乘积公式
假设在
Uniswap
中存在一个ETH-DAI
交易对的流动池,用户在使用DAI
与ETH
兑换时需要一个方法来决定交易价格。Uniswap
定价模型非常简洁,它的核心思想是一个恒定乘积公式文章图片
。其中
x
和
y
分别代表流动池中两种资产的数量,
k
是两种资产数量的乘积。
文章图片
的函数图像如下:
文章图片
假设乘积
k
是一个固定不变的常量,当用户使用x
资产从流动池中兑换y
资产时,流动池中x
资产的数量会增加,y
资产的数量会减少。由于k
是恒定的,所以当x
增长文章图片
时,需要将
y
减少 文章图片
才能保持等式的恒定。
文章图片
这里没有考虑到手续费的问题,如果要计算手续费的话,公式如下:
文章图片
文章图片
其中:
文章图片
,
文章图片
image
文章图片
表示扣除手续费后加入到流动池中的资产。由于在流动池中增加了手续费所以计算出来的
k'
会大于
k
,详细过程会在后面推导。
接下来会有一些数学公式的推导,为了方便理解,我们先对不含手续费的情况进行推导,包含手续费的推导过程放在最后。
不含手续费 交易价格计算 交易价格的计算分成两种:
- InputPrice:向流动池中放入
文章图片
个Token
可以兑换出多少个
文章图片
Token
- OutputPrice:从流动池中取出
文章图片
image 个Token
,需要向流动池中放入多少个
文章图片
Token
文章图片
文章图片
文章图片
其中:
文章图片
,
文章图片
image.gif
文章图片
文章图片
文章图片
文章图片
下面是
Input price
的函数图像:文章图片
从上图可以看出向流动池中注入的
文章图片
越多,可以从流动池中取出的
文章图片
也会越多,但是
文章图片
只会不断地逼近流动池中现有的代币数量,并不会超过,也就是说你永远无法一次性买断流动池中所有的。可以看出,恒等乘积公式可以提供无限的流动性,只要你想买就一定可以买到。 交易滑点
交易滑点是指:“在买卖
文章图片
时,实际支付的价格和期望的交易价格之间的差别,称为交易滑点”。
从流动池中购买
文章图片
Token
需要支付 文章图片
,所以本次购买的价格为:
文章图片
文章图片
文章图片
文章图片
其中:
文章图片
表示当前流动池中的价格
从公式可以看出交易的滑点是与
文章图片
成线性关系。
下图是滑点的函数图像:
文章图片
滑点(偏离幅度)取决于
文章图片
image , 当资金池中足够大时,滑点越小,资金池固定时,一个区块时间内净交易量越小,滑点越小,一个区块时间内的净交易量又与两个因素相关,一个是区块确认速度,一个是市场价格波动率,因此
Uniswap
恒定乘积做市的滑点与下面三个因素高度相关:
- 资金池的大小
- 区块确认速度
- 市场波动率
当从流动池中购买
文章图片
代币后一定会引起当前流动池中的价格波动:
文章图片
其中:是购买代币后流动池中的币价
从公式可以看出流动池中的币价与成二次函数关系
【【深度知识】Uniswap协议原理分析】
下图是价格的函数图像:
文章图片
当流动池中的价格与外部市场价格不一致时就会有套利者出现,套利者监控全球各家交易所的价格,一旦发现两家交易所存在价差,就会同时在两边低买高卖赚取中间差价。由于套利者的存在,才使得
Uniswap
币价不会与全球市场脱节。Uniswap
中的价格高于外部市场时,套利者从外部市场低价买入 ,然后高价卖给Uniswap
Uniswap
中的价格低于外部市场时,套利者从Uniswap
低价买入,然后高价卖给外部市场
excel
中手动演算一遍,可以更直观的理解Uniswap
的工作原理。文章图片
加入手续费的恒定乘积公式
以下过程是在计算手续费的情况下,将上面的公式重新推导了一遍。
计算交易价格
文章图片
文章图片
文章图片
k
除了在有交易手续费的情况会变大,还有一个情况也会使k
值产生变化,当向流动池中增加流动性的时候k
会变大,当从流动池中取回流动资金时k
会变小。具体变化比例可以参考Uniswap
白皮书,这里就不做推导了。
其中:
文章图片
,
文章图片
,
文章图片
,
文章图片
,目前交易费为:
文章图片
文章图片
文章图片
交易滑点
文章图片
文章图片
文章图片
流动池的币价
文章图片
流动池收益与风险 在
Uniswap
中流动性提供者的收益主要来自于交易抽成,Uniswap
会从每笔交易中抽取0.3%
的手续费,并将手续费按流动性提供者所占流动池的比例分配给流动性提供者。impermanent loss
向
Uniswap
中提供流动性的人会发现一个现象:“目前在流动池中资金的价值比放入流动池之前的资金价值少了,也就是资金缩水了”,这种现象被称为“impermanent loss”,impermanent loss
中文翻译成“无常损失”,简单来说impermanent loss
是指你将加密货币放入uniswap
中赚取的收益与你将加密货币放入钱包中的收益之间的差,公式为:文章图片
hodl指不看币价涨跌长期持有某种加密货币(hold on for dear life)
impermanent loss
通常是由于流动池中的价格发生波动引起的,下面看一个例子:文章图片
其中:表示流动池中
ETH
数量,表示流动池中DAI
数量,表示流动池中的价格开始用户向流动池中注入
文章图片
,
文章图片
,当前市场的价格:
文章图片
文章图片
假设现在外部市场价格发生了变化,价格变成:
文章图片
image ,由于发生价格差,这时套利者开始工作,套利者通过搬砖将流动池中的价格维持与外部是市场一致。这时流动池中最新的数量为:
文章图片
文章图片
计算
HODL
时的资金 :文章图片
计算放入流动池后的资金:
文章图片
计算
impermanent loss
:文章图片
可以看出价格从
100
变成120
后我们的资金只有之前的99.59%
,损失了4%
左右。只要这时候我们不将资金从流动池中取出,一旦流动池中的币价回到100
时,我们是没有损失的,这是为什么叫impermanent loss
无常损失的原因。下图演示
impermanant loss
的比率与当前价格变化的关系,O
列表示资金刚放入流动池的情况,O->H
表示价格上涨时impermanent loss
的变化,A<-O
表示价格下跌时impermanent loss
的变化。文章图片
下图是根据上面数据画出的函数图像,蓝色的曲线是不包含手续费的,黄色的图像包含手续费,红色的线条是我手动添加上去的为了方便说明。
先看蓝色曲线,当不计算手续费收益的情况下,无论币价上涨或下跌,流动性提供者
100%
会有损失。再看黄色的曲线,由于黄色曲线是计算手续费收益的,所以只要币价在一个范围内波动,流动性提供者可以稳赚手续费收益。
文章图片
由此可以得出一个结论要介绍
impermanent loss
对流动性提供者的影响,可以为两个币价之间波动小的流动池提供流动性。文章图片
mean-reverting pairs
:均值回归的交易对,比如稳定币交易对两者波动是最小的,可以最大程度减少impermanent loss
correlated pairs
:有正相关性的交易对,例如ETH/ZRX
,这两个币的波动方向基本上是一致的,同涨同跌,两者之间的相对波动小
Uncorrelated pairs
:非相关性的交易对,如ETH/DAI
,为这种交易对提供流动性,赚取的交易费有可能会覆盖impermanent loss
Inverse correlated pairs
:负相关的交易对,是最危险的,他们之间波动方向相反,两者之间的相对波动范围最大。
impermanent loss
的公式文章图片
其中:
priceRatio
是价格变化比例以下是不计算手续费情况下推导过程:
文章图片
文章图片
,
文章图片
,
文章图片
,
文章图片
,
文章图片
文章图片
文章图片
文章图片
总结 优点
- 完全去中心化,不依赖第三方,任何人都可以基于
uniswap
构建自己的应用
- 可以自由地创建任何
ERC20
交易对
- 与其他去中心化交易所相比
gas
费用更低
- 任何人都可以向
uniswap
流动池中提供流动性,人人都可以是做市商
- 需要依赖套利者去平衡
uniswap
与外部交易所之间的汇率
- 对大户不友好,进行大额的交易会造成很大的滑点