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

未知 2021-10-13 15:53:32

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

来源:星星创意

作者: Star Li

uniswap V3一发表就备受瞩目。 相对于V2,逻辑和代码都很复杂。 V3的核心是通过盘口区间提供流动性(集中型流动性),解决LP提供流动性时的资金利用率问题。 什么是资金利用率? 如何推导V3区间流动性的计算公式? 如何理解流动性? swap费用怎么计算? 本文首先从对V3技术白皮书的详细分析开始。

首先,列出一些关于uniswap公式的V3的资料。

V3官方介绍https://uni swap.org/blog/uni swap-V3 /

技术白皮书https://uni swap.org /白皮书3.pdf

智能合约代码

359 Github.com/UNI swap/UNI swap-V3 -酷睿

359 Github.com/UNI swap/UNI swap-V3 -外设

建议仔细看技术白皮书,然后看智能合约代码,最后和官方的介绍对照。 了解技术白皮书后,代码会变得非常容易理解。 技术白皮书的第一章总结了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和y分别大于x_real和y_real。 很明显,x-x_real和y-y_real的资金在这种情况下永远不能使用。 也就是说,也被称为闲置资金。

在这种情况下,资金利用率为x_real/x或y_real/y。 如果价格波动非常小,资金利用率就非常低。 uniswap V3是试图解决资金利用率低的问题。 想法很简单,可以把所有资金只追加在某个区间,只追加在价格可能变动的区间范围内。 在某个区间增加流动性,提供swap功能的方法是uniswap V3的重点。 让我们先从虚拟保留开始。

2虚拟现金池(虚拟保留) )。

在uniswap的交易中采用的乘积固定模型(x*y=k )。 虚拟现金池(Virtual Reserves )是指仍在乘积的固定曲线上,只提供某个区间流动性的现金池。

图中的墨绿曲线是虚拟资金池满足的乘积的固定曲线。 实际所需资金的曲线是图中的橙色。 橙色曲线的公式如下图所示。

可以想象虚拟资金曲线在x/y轴上平移,以使a/b点和x/y轴重叠。 也就是说,用一定量的资金就可以达成“虚拟”的交易曲线。

要计算在某个区间提供虚拟资金池的方法,必须首先从深入了解流动性开始。

3流动性(Liquidity - L ) )。

乘积固定的交易模型,现金池内的两种代币金额满足x*y=K。 如果K=L^2,则x*y=L^2。 l就是我们所说的流动性。 从乘积固定的交易模型中可以得到以下公式。

在知道l和SQRT(P )的情况下,也能够导出资金需求量x和y。

根据式6.6,流动性不变化时(不追加删除流动性时)的流动性可以看作是每“价格变动”的y资金量的变化。 将“价格变动”用引号括起来,是因为事实上是sqrt(p )的变化。

这是uniswap V3核心公式(6.7 ),用相对值(资金和价格的相对值)计算流动性。 流动性是指每“价格变化”的资金量。 在一定交易量的情况下,流动性好的话价格变化就小,流动性不够的话价格波动就大。

请特别注意。 在一个区间的流动性不同于V2普适的流动性。 在某个区间的流动性,重点是“区间”。 不同区间的流动性没有可比性。 V2的流动性和区间的流动性的差异如下图所示。

V2的流动性是“普适的”,在所有的价格点上流动性相同。 V3的流动性由一系列不同区间的流动性组成。 相对来说,目前的价格流动性很高。 流动性提供者LP只有提供可交易的流动性才能取得交易费。 为了获得更多的交易费,为了提高资金的利用率,流动性提供者将资金提供在合理的价格波动范围内。 也就是说,在某个区间的swap交易中产生的手续费,只有该区间的流动性提供者才能取得手续费。 为了计算各区间取得的手续费,引入了Tick的概念和计算方法。

4传球

在区间提供流动性,会带来区间和区间重复覆盖的复杂情况。 由于不同区间的流动性没有可比性,所以某笔交易费不能混入流动资金,在删除流动性时一并提取。 为了解决这个问题,uniswap V3引入了Tick的概念。 交易费用实时结算,单独记录,不混入流动资金。 虽然区间整体和区间的流动性不可比较,但是在具体的某个价格点(一个价格片)上流动性是可以比较的。 uniswap V3将整个价格区间(从负无限到正无限)分成一个一个的Tick ) )价格点。

后者的价格会根据上一个价格点的价格变动万分之一。

每个Tick都有唯一的序列号。 区间(Position )可以用两个Tick表示。 逻辑交易手续费可以用每条提现来计算,可以根据每条提现在流动性中所占的比例进行交易分配。 我们先来看看Tick范围的swap的计算。

5Tick内的交换

假设有小量的y,swap必须是x。 根据6.13的公式,可以计算出y变化引起的价格变化。

进而,使用6.15的公式可以计算出更换后的x的量。

uniswap V3对同一交易对设定了0.05%、0.3%、1%的不同交易价格。 也可以添加其他汇率。 从y换成x时,在换之前先扣除手续费,然后再进行上述更换。

同一交易池只支持一种汇率。 也就是说,一个交易池支持不同的价格范围,但都是相同的汇率。 如果需要添加同一交易对的不同交易费用的交易池,则需要创建新的交易池。

其次,详细说明流动性的添加/删除和交易费用的计算逻辑。

6增加/删除流动性

V3的流动性追加/删除在当前价格的情况下,在某个区间追加或删除流动性。 的流动性添加/删除流动性使用以下公式。

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

分为三种情况,想追加的流动性区间和当前价格的关系。

目前的价格位于流动性价格区间(il=ic iu ) ) 9513.163.com)

因为价格在区间内,所以如果价格滑动到il,就需要提供y资金。 如果价格向iu滑动,则需要提供相应的x资金。 因此,对于delta_Y来说,价格将变为sqrt(p )sqrt(p ) il ) )。 对于delta_X,价格将变为1/sqrt(p )1/sqrt(p ) iu ) )。

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

因为现在的价格远远低于il,所以即使从现在的价格滑到iu,也只需要x的资金,不需要y的资金。 因此,在这种情况下,delta_Y=0。 从il向iu滑动需要整个区间的x资金,因此对delta_X来说价格为1/sqrt(il )-1/sqrt (1/sqrt ) p ) iu ) ) ) ) ) ) ) ) ) )。

当前价格高于流动性价格的区间与第一种情况相似,不进行重复分析。

7Swap交易费用

uniswap最复杂的逻辑是计算和分配交易费用。 在增加和删除流动性之前,必须提取适当的交易费用。

Tick上的总流动性在某个Tick上可以存在多个区间。 在计算交易费用时,需要将这些费用平均到这个Tick上的多个区间的总流动性上。 在每个区间边界的Tick中记录delta_L (以该Tick为边界的所有区间的流动性总和)。

一种全局状态—存在liquidity,存储当前价格对Tick的流动性总和。 价格波动,穿过某一提克会增加或减少流动性(取决于价格波动的方向)。 例如,当价格从左到右通过区间,通过区间的第一段时,流动性需要增加,通过最后段时,流动性需要减少,中间段没有流动性的增加和减少(delta_L为0 )。

区间(Position )上的交易费用率采用计算区间上的交易费用率,从总费用率中减去区间外的费用率的方法。 在某区间的边界Tick上记录feeGrowthOutside。 feeGrowthOutside是指“其他”方向上的总费用率。 另一个方向是相对通过当前提克的方向。 价格从左到右通过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的费用率可以如下计算。

以计算低于最低提克的费率为例,如果ic=i (当前价格高于最低提克),则低于提克的所有费率都定义为fo )。 如果ic

在取得的费率的基础上,通过费率乘以区间的流动性,可以计算出在该区间征收的费用。

总结:
uniswap V3版本的中心思想是流动性集中。 流动性提供者可以在一定区间提供流动性,提高资金使用率。 在某个区间取得的交易费由该区间的全体流动性提供者分配。 uniswap V3设计了区间粒度-Tick,引导了流动性的追加/删除和费用计算的过程。 在此基础上,uniswap V3也更新了价格预言机的实现。

标签