收藏本站 网站导航 开放平台 Thursday, April 25, 2024 星期四
  • 微信

深入理解 Uniswap V3 原理:从技术白皮书开始

来源 中金网 04-08 17:52
摘要: Uniswap V3 一公布就引发广泛关注。相对 V2 来说,逻辑和代码都复杂一些。V3 的核心是通过盘口区间提供流动性(集中式流动性),解决 LP 提供流动性时的资金利用率的问题。什么是资金利用率?V3 如何推导区间流动性的计算公式?如何理解流动性?如何计算 swap 费用?本文先从 V3 技术白皮书详细分析开始。

  Uniswap V3 一公布就引发广泛关注。相对 V2 来说,逻辑和代码都复杂一些。V3 的核心是通过盘口区间提供流动性(集中式流动性),解决 LP 提供流动性时的资金利用率的问题。什么是资金利用率?V3 如何推导区间流动性的计算公式?如何理解流动性?如何计算 swap 费用?本文先从 V3 技术白皮书详细分析开始。

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

  •   V3 官方介绍

  •   技术白皮书

  •   智能合约代码

  推荐先认真查看技术白皮书,再看智能合约代码,最后再对照官方介绍。理解了技术白皮书,代码非常容易理解。在技术白皮书的第一章总结了 Uniswap V3 的技术特点,最核心的概念是 「Concentrated Liquidity」(集中式流动性)。

  资金利用率

  先看看 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 说起。

  虚拟资金池(Virtual Reserves)

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

深入理解

  图中的墨绿色的曲线就是虚拟资金池满足的乘积固定曲线。事实上需要的资金的曲线如图中的橘黄色。橘黄色的曲线公式如下图:

深入理解

  你可以想象成虚拟资金曲线在 x/y 轴进行平移,使得 a/b 点和 x/y 轴重合。也就是用一定量的资金就能达到「虚拟」的交易曲线的效果。

  如何计算在某个区间提供虚拟资金池,先要从深入理解流动性开始。

  流动性(Liquidity - L)

  乘积固定的交易模型,满足资金池中的两种代币金额满足:xy = K。如果设定 K=L^2 的话,xy = L^2。L 就是我们说的流动性。由乘积固定的交易模型得出如下的公式:

深入理解

  在已知 L 和 sqrt(P) 的情况下,也能推导出资金需求量 x 和 y。

深入理解

  通过公式 6.6,在流动性不变的情况下(不添加删除流动性),流动性可以看成是单位「价格波动」的 y 资金量的变化。「价格波动」打上引号是因为事实上是 sqrt(P) 的变化。

深入理解

  这个是 Uniswap V3 核心公式(6.7),用相对值(资金和价格相对值)来计算流动性。所谓的流动性,就是单位「价格变化」的资金量。在一定的交易量的情况下,如果流动性好,价格变化就小,流动性不够的话,价格波动就大。

深入理解

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

深入理解

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

  Tick

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

深入理解

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

深入理解

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

  Tick 内的 SWAP

  假设有一个很小的量的 y,需要 swap 为 x。通过 6.13 的公式,可以计算出因为 y 的变化导致的价格变化。

深入理解

  再利用 6.15 的公式可以算出换取的 x 的量。

深入理解

  Uniswap V3 针对同样的交易对设置了不同的交易费:0.05%,0.3% 以及 1% (还可以添加其他费率)。如果是从 Y 换取 X,则在换取之前先扣除手续费再进行上述的交换。

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

  接下来,深入讲解一下 添加 / 删除流动性以及交易费用的计算逻辑。

  添加 / 删除流动性

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

深入理解

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

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

  •   当前价格处于流动性价格区间 (il <= ic < iu)

深入理解

  因为价格在区间范围内,如果价格滑动到 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(p(iu))。

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

  和第一种情况类似,不重复分析了。

  Swap 交易费用

  Uniswap 最复杂的逻辑是计算交易费用并分配。在添加和删除流动性之前需要将相应的交易费用提取。

  Tick 上的总流动性

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

  存在一个全局状态:liquidity,保存当前价格对应 Tick 的流动性总和。当价格波动,穿过某个 Tick 时,会进行流动性的增加或者减少(取决于价格波动方向)。举例来说,价格从左到右穿过区间,当穿过区间的第一个 Tick 时,流动性需要增加,穿出最后一个 Tick 时,流动性需要减少,中间的 Tick 都没有流动性的增加和减少(delta_L 为 0)。

深入理解

  区间(Position)上的交易费用率

  计算一个区间上的交易费用率,采用总的费用率减去区间外的费用率的方法。 在一个区间的边界 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 的),低于 Tick 的所有的费用率就是 fo (定义如此)。如果 ic

深入理解

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

  总结

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

Uniswap V3
免责声明:中金网发布此信息目的在于传播更多信息,与本网站立场无关。中金网不保证该信息的准确性、真实性、完整性、有效性等。相关信息并未经过本网站证实,不构成任何投资建议,据此操作,风险自担。
相关新闻 更多

顶级做市商评测 Uniswap V3:哪些因素可以在 V3 中维持有效的做市策略?

UIWAV3创新性地引入自定义的价格范围内的聚集流动性,以及多费用等级,以便于做市商采用更复杂的策略来主动管理流动性,并获取更高的资本效率。但同时,做市商也会面临更多的风险类型。本文将讨论多种影响流动...

05-19 09:29

数据不会说谎:Uniswap V3 表现到底如何?

UIWA的使用情况究竟如何为了回答这个问题,我分别按照总交易量和总美元交易额,对比分析了UIWAV2和UIWAV3的交易情况。我非常希望深入了解UIWAV3的美元交易额情况,但由于这里关注的重点在使用...

05-11 14:04

关于Uniswap V3 你需要知道的一切

最近,UIWA宣布了V3计划,因此,让我们深入探讨一下我们可以期望从中得到什么。这篇文章将解释什么正在改变,它如何影响你,以及它是否会解决臭名昭著的GA费用问题。去中心化交易和流动性的概念可能会有些令...

05-10 09:39