搜索
当前所在位置: TokenBetter > 区块 >

精读Uniswap V3技术白皮书,大家发现了什么?

发布时间:2021-10-07 18:01 作者:未知 点击: 【 字体:

原标题:《uniswap - V3技术白皮书导读》

出处:星想法

作者:Star Li

uniswap V3一公布就引发广泛关注。相对V2来讲,逻辑和代码都复杂一些。V3的核心是通过盘口区间提供流动性,解决LP提供流动性时的资金借助率的问题。啥是资金借助率?V3怎么样推导区间流动性的计算公式?怎么样理解流动性?怎么样计算swap成本?本文先从V3技术白皮书详细剖析开始。

先给出一些uniswap官方有关V3的资料:

  • V3官方介绍

https://uniswap.org/blog/uniswap-v3/

  • 技术白皮书

https://uniswap.org/whitepaper-v3.pdf

智能合约代码

https://github.com/Uniswap/uniswap-v3-core

https://github.com/Uniswap/uniswap-v3-periphery

推荐先认真查询技术白皮书,再看智能合约代码,最后再对照官方介绍。理解了技术白皮书,代码很容易理解。在技术白皮书的第一章概要了uniswap V3的技术特征,最重要的定义是"Concentrated Liquidity" 。

1资金借助率

先看看uniswap V2的资金借助率:

上图为资金池中的x/y的量变化曲线。资金池中的目前价格在c点,并且假设会在a价格点和b价格点之间波动。从c点向a点滑动,消耗最大y_real,从c点向b点滑动,消耗最大为x_real。也就是说,目前价格c点,在a点和b点之间震动的话,最大仅需消耗x_real和y_real。理论上只须提供x_real和y_real就足够了。而事实上,如上图所示,在价格c点,分别提供了大于x_real和y_real的x和y。明显可以看出,x-x_real和y-y_real的资金在这样的情况下是永远用不上的,也就称为闲置资金。

在这样的情况下,资金借助率为x_real/x或者y_real/y。假如价格波动很小的话,资金借助率是很低的。uniswap V3就是尝试解决资金借助率低的问题。想法比较容易,所有资金可以只添加到某个区间,只添加到大概价格波动到的区间范围。怎么样在某个区间添加流动性并提供swap功能是uniswap V3的重点。先从Virtual Reserves说起。

2虚拟资金池

乘积固定的买卖模型,满足资金池中的两种代币金额满足:x*y = K。假如设定K=L^2的话,x*y = L^2。L就是大家说的流动性。由乘积固定的买卖模型得出如下的公式:

在已知L和sqrt的状况下,也能推导出资金需要量x和y。

通过公式6.6,在流动性不变的状况下,流动性可以看成是单位“价格波动”的y资金量的变化。”价格波动“打上引号是由于事实上是sqrt的变化。

这个是uniswap V3核心公式,用相对值来计算流动性。所谓的流动性,就是单位“价格变化”的资金量。在肯定的买卖量的状况下,假如流动性好,价格变化就小,流动性不够的话,价格波动就大。

特别注意的是,一个区间上的流动性和V2的普适的流动性不同。一个区间上的流动性,重点在“区间上”。不同区间的流动性没可比性。V2的流动性和区间上的流动性有什么区别如下图:

V2的流动性是“普适”的,在所有价格点上流动性相同。V3的流动性是由一系列不同区间上的流动性组成。相对来讲,在目前价格左右的流动性比较高。流动性提供者LP只有提供了可供买卖的流动性才能获得买卖费。为了获得更多的买卖费,为了提升资金的借助率,流动性提供者会将资金提供在适当的价格波动范围内。也就是说,在某个区间swap买卖产生的手续费,只有该区间流动性提供者才能获得手续费。为了计算每一个区间获得的手续费,引入了Tick的定义和计算办法。

4Tick

在区间上提供流动性,带来不少复杂的状况:区间和区间的重叠覆盖。由于不同区间的流动性没可比性,某个买卖费并不可以混入到流动资金中,等删除流动性时候一并提取。为知道决这个问题,uniswap V3引入了Tick的定义。买卖成本实时结算并单独记录,并不混入流动资金中。虽然整个区间和区间的流动性没可比性,但,在具体的某个价格点上,流动性是可比较的。uniswap V3将整个价格范围分成一个个的Tick:

后一个价格点的价格是前一个价格点价格基础上浮动万分之一。

每一个Tick也有一个唯一的序号。区间可以由两个Tick表示。逻辑上买卖手续费可以一个个的Tick计算,并在每个Tick上依据流动性的占比进行买卖分配。先看看一个Tick范围的swap的计算。

5Tick内的SWAP

假设有一个非常小的量的y,需要swap为x。通过6.13的公式,可以计算出由于y的变化致使的价格变化。

再借助6.15的公式可以算出换取的x的量。

uniswap V3针对同样的买卖对设置了不一样的买卖费:0.05%,0.3%与1% 。若是从Y换取X,则在换取之前先扣除手续费再进行上述的交换。

在同一买卖池中只支持一种费率。也就是说,在一个买卖池中支持不一样的价格区间,但都是同样的费率。假如需要添加同样买卖对的不同买卖费的买卖池,需要创建新的买卖池。

下面,深入解说一下 添加/删除流动性与买卖成本的计算逻辑。

6添加/删除流动性

V3的添加/删除流动性是目前价格状况下在某个区间添加或者删除流动性。所有些流动性添加/删除流动性使用如下的公式:

注意,价格变化并非指区间的大小,而是在某个区间上提供流动性,相对目前价格,“需要相应资金变化”对应的价格变化。

分为三种状况,想要添加的流动性区间和目前价格的关系。

  • 目前价格处于流动性价格区间

由于价格在区间范围内,假如价格滑动到il,则需要提供y资金。假如价格滑动到iu,则需要提供相应的x资金。所以,对于delta_Y来讲的,价格变化为sqrt - sqrt);对于delta_X来讲,价格变化为1/sqrt - 1/sqrt)。

  • 目前价格低于流动性价格区间

由于目前价格远低于il,即便从目前价格向iu滑动,也仅需x的资金,无需y的资金。所以,在这样的情况下,delta_Y = 0。由于从il滑向iu需要整个区间的x的资金,对于delta_X来讲,价格变化为1/sqrt - 1/sqrt)。

  • 目前价格高于流动性价格区间

和第一种状况类似,不重复剖析了。

7Swap买卖成本

uniswap最复杂的逻辑是计算买卖成本并分配。在添加和删除流动性之前需要将相应的买卖成本提取。

  • Tick上的总流动性

在某个Tick上可以存在多个区间。在计算买卖成本时,需要平摊这部分成本给所有在这个Tick上多个区间的总的流动性。在每一个区间的边界的Tick上记录下delta_L。

存在一个全局状况:liquidity,保存目前价格对应Tick的流动性总和。当价格波动,穿过某个Tick时,会进行流动性的增加或者降低。举例来讲,价格从左到右穿过区间,当穿过区间的第一个Tick时,流动性需要增加,穿出最后一个Tick时,流动性需要降低,中间的Tick都没流动性的增加和降低。

  • 区间上的买卖成本率

计算一个区间上的买卖成本率,使用总的成本率减去区间外的成本率的办法。在一个区间的边界Tick上记录feeGrowthOutside。所谓的feeGrowthOutside,就是“另外”一个方向上总的成本率。另外的一个方向是相对穿过目前Tick的方向而言。当价格从左到右穿过一个Tick,feeGrowthOutside指的是Tick左侧所有区间的成本率。容易的说,就是价格要去方向的相反方向所有区间的成本率。feeGrowthOutside用fo表示。由于fo是一个Tick的两个方向的总的成本率,两个方向的成本率的总和一定是等于fg。所以当穿过一个Tick时,这个Tick上的fo要进行翻转:

当一个区间创建时,区间边界上Tick的fo需要初始化:

假如目前的价格大于Tick的价格时,由于即便目前价格在设置的区间内,但之前成本也不会分到,所以,可以容易的假想为所有些成本发生在Tick价格之下,也就是fo=fg。假如Tick的价格大于目前价格,价格还没穿过Tick,由于假设了之前所有发生的成本发生在Tick价格之下,Tick之上是没成本的,所以fo=0。在理解了这部分逻辑的基础上,在swap的过程中,伴随价格的波动,一个区间上,超越最高Tick的成本率与低于最低Tick的成本率可以用如下的方法计算:

以低于最低Tick的成本率的计算为例,假如ic>=i ,低于Tick的所有些成本率就是fo。假如ic

获得的成本率的基础上,用成本率乘以区间的流动性可以计算出该区间收取的成本。

概要:

uniswap V3版本核心思想是流动性集中。流动性提供者可以在某个区间提供流动性,提升资金用率。在某个区间获得的买卖费,由所有在该区间的流动性提供者均分。uniswap V3设计了区间粒度-Tick,并且推导了流动性添加/删除与成本计算的过程。在之基础上,uniswap V3也更新了价格预言机的达成。

版权保护: 本文由 TokenBetter 原创,转载请保留链接: http://www.donglang2015.com/qukuai/20211007/646.html

阅读全文
返回顶部