深入解读 Uniswap v3 新特性

  • songmint
  • 更新于 2022-12-19 17:22
  • 阅读 2922

深入解读 Uniswap v3 新特性

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f6b68726e394e7764363238646131646131663831322e706e67.webp 图片来源: https://uniswap.org/blog/uniswap-v3/

0. 序言

最近, Uniswap V3的发布无疑是DeFi世界中,最令人激动的新闻。🔥🔥🔥

当大多数人的谈论聚焦在v3带给市场的潜在冲击时, 如何使用精妙技术实现那些令人惊叹特性的讨论,却极为罕见。 那些特性包含了集中流动性,类似限价单的范围订单等。

既然之前我已经解读过了Uniswap v1 & v2 (如果你能读中文,链接在此v1 & v2), 因此我也责无旁贷,继续为大家解读v3!

本文将基于官方白皮书和网站上的例子,带领各位读者走上理解Uniswap v3的旅程。 我们不会涉及太多代码,因此无需您有工程师背景; 文章中的数学仅仅限于高中程度,因而也无需您是数学出身。所以您可以完全理解接下来的内容。😊

如果您读完全文却依然不得要领, 欢迎随时给我回复🙏 !

以后将会有另一篇文章聚焦于代码库。 不过现在先让我们准备好背景音乐,开始这段旅程。

背景音乐视频链接:https://www.youtube.com/watch?v=051C0FiNX5U

1. Uniswap & AMM 概述

在深入之前,我们首先回顾一下与传统的订单簿交易所相比,Uniswap具有的独特之处。

Uniswap v1 和v2 都属于自动做市商(AMM)的某种应用。 它们使用 x * y = k 的固定乘积等式,其中x 和 y 分别代表同一个池中代币 X 和代币 Y 的数量, 而k则代表一个常数。

Comparing to order book exchanges, AMMs, such as the previous versions of Uniswap, offer quite a distinct user experience:

与订单簿交易所相比, 使用了AMM机制的Uniswap v1 & v2, 为使用者提供了独特的体验:

  • AMM能为两种代币之间的相互兑换提供报价,所以AMM的用户始终是价格的接受者,而订单簿交易所的用户既可以是价格提供者,也可以是价格接受者。

  • Uniswap 和大多数 AMM一样,能提供无限的流动性¹,而订单簿交易所则无法做到这一点。 事实上,Uniswap v1 和 v2 在[0,∞]²的价格范围内,都能提供了流动性。

  • Uniswap 和大多数 AMM一样, 都有价格滑点³,这是由于AMM的定价机制导致的。但是对于订单簿交易所,如果交易订单能在一个tick的时间内完成,那么成交价格并不一定会有滑点。

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f4734596f526d6476363238646134646535333839312e706e67.webp

在订单簿中, 每个价格(无论是红色还是绿色)都是一个tick. 图片来源: https://ftx.com/trade/BTC-PERP

¹ 尽管价格随着时间的推移会变得更差,mStable等常数和的AMM并不具有无限的流动性 (译者注:mStable 是一个AMM,参见 https://mstable.app/#/musd/swap)

² 价格范围事实上可以扩展到[-∞,∞], 不过大多数情况下价格不可能为负值. (译者注: 事实上WTI原油期权价格就曾经短暂为负值)

³ 常数和AMM不会产生价格滑点

2. Tick

Uniswap v3所有的创新都始于Tick

不熟悉tick的朋友请看

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f57387955724c7257363238646135306432316466632e706e67.webp

来源: https://www.investopedia.com/terms/t/tick.asp

v3通过将价格范围 [0,∞] 分成无数个细粒度的ticks,使得在v3上发生的交易极其类似于与在订单簿交易所发生的交易. 它们只有三个不同之处:

  • 每个tick的价格范围由系统预定义,而非由用户决定。

  • 在一个tick区间内发生的交易仍然遵循 AMM 的定价等式. 一旦价格跨越了该tick, 就需要更新定价等式的值。

  • 落在价格范围内的不同订单,成交价可以是范围内任意一个价格,而不像在订单簿交易所那样,只能以相同价格成交。

通过对tick的这个设计,Uniswap v3拥有了AMM 和订单簿交易所的大部分优点! 💯💯💯

那么,一个tick对应的价格区间是如何决定的呢?

事实上, 这个问题与上面关于tick的解释,有一些联系:交易价格高于 1 美元的股票的最小报价(tick)大小是一美分。

传统上1个tick被看做等于1美分, 其潜在含义是1美分(1 美元的 1%)是报价变化的1个基点,例如:1.02 — 1.01 = 0.01。(译者注: 此处原为0.1,应为0.01)

Uniswap v3 也采用了类似的想法:与上个/下个价格相比,价格变化应该总被当做 0.01% = 1 个基点。

但是请注意,这里不同之处是,传统上的基点是绝对值 0.01,这意味着价格变化是用减法定义的,而在v3中,基点是百分比 0.01 %,用除法定义。

如何设置tick的价格范围⁴,请看:

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f3653517263304e49363238646135373338636631662e706e67.webp

图片来源: https://uniswap.org/whitepaper-v3.pdf

根据如上等式,可以用 索引 [i, i+1]的形式来记录 tick/价格范围,而不是一些疯狂的数字,例如 1.0001¹⁰⁰ = 1.0100496621。

由于每个价格都是序列中前一个价格的 1.0001倍,因此价格变化比率始终为“1.0001 — 1 = 0.0001 = 0.01%”。

例如, 当i=1, p(1) = 1.0001; 当i=2, p(2) = 1.00020001.

p(2) / p(1) = 1.00020001 / 1.0001 = 1.0001

大家看到 传统基点是1美分(=1美元的1%)与 Uniswap v3基点是0.01%之间的联系了吗?

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f5730366476756134363238646135623863353136652e676966.webp

图片来源: https://tenor.com/view/coin-master-cool-gif-19748052

但是,先生,价格真的足够细分吗?有许多价格低于 0.000001 美元的垃圾币。这样的价格也会被涵盖吗?

价格范围: 最大值 & 最小值

要了解v3的tick是否涵盖了非常小的价格,我们必须通过查看技术说明书,来确定v3的最大和最小价格范围:在 UniswapV3Pool.sol中有一个int24 tick状态变量。

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f3341574365734942363238646135646431333134662e706e67.webp

图片来源: https://uniswap.org/whitepaper-v3.pdf

使用带符号整数 int 而不是 uint 的原因是:负幂表示 价格小于1 但大于0。

24位覆盖了 1.0001 ^ (2²³ — 1) 和 1.0001 ^ -(2)²³ 之间的价格范围。即使是谷歌也无法计算出这些数字,所以请允许我提供较小的值,用以大致了解整个价格范围:

1.0001 ^ (2¹⁸) = 242,214,459,604.341
1.0001 ^ -(2¹⁷) = 0.000002031888943

可以确定地说,使用 int24 类型定义的价格范围, 可以涵盖这个世界中超过99.9%的资产价格 👌 ⁴ 基于技术实现的考虑, 等式两边都添加了一个平方根.

那么,如何找出一个价格对应的那个tick呢?

从价格反推Tick索引

问题的答案很简单,既然我们知道 p(i) = 1.0001^i,因此只需在等式两边各取一个底数为 1.0001 的对数⁴:

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f655758727a737653363238646136613036623464332e706e67.webp

图片来源: https://www.codecogs.com/latex/eqneditor.php

让我们来试一试,假设我们想找出 1000000 的tick索引

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f506d396a71665854363238646136636330303639372e706e67.webp

图片来源: https://ncalculators.com/number-conversion/log-logarithm-calculator.htm

此时, 1.0001¹³⁸¹⁶² = 999,998.678087146. 哈哈!

*⁵ 这个公式也略有修改,以便适应实际的技术实现。

3. 集中流动性

既然我们知道了tick和价格范围是如何计算的,那么接下来看看如何在一个tick定义的价格区间内执行订单,什么是集中流动性, 以及它如何提高了资本效率, 使得v3竟能与专为稳定币设计的DEX(去中心化交易所)竞争,例如 Curve.

集中流动性,意味着LP(流动性提供者)可以按照自己的意愿,向任意价格范围/tick提供流动性. 无疑这将导致:流动性在ticks中的分配变得不再平衡。

由于每个tick拥有的流动性深度(译者注:即流动性值L)不同,相应的定价等式 x * y = k 也不再相同!

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f6f615a7043523749363238646136666263316630312e706e67.webp

每个tick将拥有它自己的流动性深度. 图片来源: https://uniswap.org/blog/uniswap-v3/

嗯... 描述一个抽象的事物时,举个栗子特有用!

假设最初的定价函数等式为100(x) * 1000(y) = 100000(k), X代币的价格因此为1000 / 100 = 10,并且我们位于一个任意的价格范围 [9.08, 11.08 ].

如果价格范围 [11.08, 13.08] 的流动性深度与 [9.08, 11.08] 相同,则当价格从10变为11.08(两个刻度之间的边界时,我们无需修改定价函数。

此时新tick(译者注 :即价格范围[11.08,13.08]) 的定价等式是1052.63 * 95 = 100000, 因此X的价格变成了 1052.63 / 95 = 11.08

但是,如果新价格范围 [11.08, 13.08] 的流动性是当前[9.08, 11.08] 的两倍,则x和y的余额应该翻倍,等式变为2105.26 190 = 400000,即 (1052.63 2) (95 2) = (100000 2 2)。

从上面的例子中,我们可以有以下两点观察:

  • 交易始终遵循定价等式 x * y = k. 一旦价格超过当前的价格范围/tick,流动性/等式 都必须更新。

  • √(x y) = √k = L is how we represent the liquidity, as I say the liquidity of x y = 400000 is two times the liquidity of x * y = 100000, as √(400000 / 100000) = 2.

  • √(x y) = √k = L 是我们对流动性的定义. 如上述, x y = 400000 的流动性是 x * y = 100000 的两倍,即√(400000 / 100000) = 2

更重要的是, v1 和 v2 上的流动性总是分布在 [0,∞] , 而v3 上的流动性可以集中在特定的价格范围内,从而让[流动性提供者]可以更高的资本效率 获得交易费分成

假设我提供了[1200, 2800] 范围内的流动性,那么我的资本效率将比范围 [0,∞] 的 v2 高 4.24 倍 😮 这里有一个 [资本效率比较计算器](https://uniswap. org/blog/uniswap-v3/),你一定要试试看!

68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f3776534a79637255363238646137333436623464382e706e67.webp

图片来源: https://uniswap.org/blog/uniswap-v3/

值得注意的是,在 Uniswap 之前,Kyper也提出并实施了集中流动性的概念,他们称之为[自动价格储备](https://blog.kyber.network/introducing-the-automated-price-reserve-77d41ed1aa70)。⁵

⁶ 感谢 Yenwen Feng 提供了此信息.

4.范围订单: 可逆的限价单

(本节内容更新于5月8日,之前描述的内容中,排除了最后三种也是范围订单情景的做法是错误的。)

如上一节所述,v3的LP可以根据自己的意愿为任何价格范围/tick提供流动性。 LP在v3上提供流动性的行为就被称为(创建)范围订单。

根据当前价格和目标价格范围的不同关系,存在三种情况:

  1. 当前价格属于目标价格范围
  2. 当前价格 < 目标价格范围
  3. 当前价格 > 目标价格范围

在提供流动性时, LP面临这三种场景, 在是否需要提供两种代币或仅一种代币 以及 需要/被允许(哪个)代币多少数量 上, 会存在不同之处。

场景1:当前价格属于目标价格范围

情况 1 可以进一步分为两种情况:当前价格是或者不是目标价格范围的中心。

如果当前价格恰好位于目标价格范围的中心(例如当价格范围为[8, 12] 时,当前价格 = 10),则它与之前uniswap版本(译者注:v1,v2)的流动性提供机制完全相同: 此时LP提供 具有等同价值的两种代币数量(价值= 数量 * 价格)。

如果当前价格不是价格区间的中心,那么LP 仍然需要分别提供两种代币的流动性,而每个代币的数量将取决于当前价格与价格范围端点的距离,这将在下一节进行解释(虽然没有明确说明)。

对应这种情况, 坊间有一个类似的产品: 网格交易,这是一个非常强大的投资工具,适用于整合。如果你不知道什么是网格交易?看Binance的解释.关于这个主题(译者注:网格交易),我们不会再多做涉及.

事实上,Uniswap v1和v2 的 LP就是在做网格交易,只不过交易的范围为 [0,∞],基准价格是提供流动性时的价格。

场景2 & 3:当前价格不属于目标价格范围内

与场景1中,LP需要为两种代币 都提供流动性不同. 在场景2 和场景 3 中, LP **只需要/被允许[提供]/两种代币中的一种。

要理解上述做法的原因,我们首先回顾一下 Uniswap 是如何通过等式x * y = k定价的,此时\x和y代表的是X和Y代币各自的数量,k表示常量。

X相对于Y 的价格是 y / x,这意味着 1 单位 X可以得到多少Y.反之亦然,Y 相对于 X 的价格是 x / y。

要使 X 的价格上涨,y 必须增加, 而 x 相应地必须减少。

了解了定价机制,现在是栗子时间!

例如场景2中, LP计划将流动性置于价格区间 [15.625, 17.313],高于X当前的价格 10 对应等式100(x) * 1000(y) = 100000(k)成立.

  • X的价格为1250 / 80 = 15.625, 对应等式80 * 1250 = 100000成立

  • X的价格为1315.789 / 76 = 17.313, 对应等式 76 * 1315.789 = 100000成立

如果现在 X 的价格达到 15.625,那么X 的价格进一步上涨的唯一途径, 就是进一步增加 y 并减少 x,这意味着需要用一定数量的 X 换取 Y

因此,为了提供 [15.625, 17.313] 范围内的流动性,LP 只需要准备 80 - 76 = 4 数量的 X。(译者注:80和76是上述场景中15.625和17.713对应的X数量) 如果价格超过 17.313,LP的所有 4个X 都被换成 1315.789 — 1250 = 65.798个Y (译者注:见上述等式),此后LP由于X流动性被抽干,因此与流动性池子不再有任何关系.

如果价格保持在该价格范围内怎么办?这正是LP希望看到的. 因为他们可以从范围内的所有交易中赚取交易费!此时,X的余额将在[76, 80] 之间摆动,Y的余额将在 [1250, 1315.789] 之间摆动。

可能并不显而易见,但是上述例子确实展现了一个有趣的事实:当你提供一种代币的流动性时,只有当该代币变得更有价值时,该代币才会被[外部套利者]兑换为价值更低的其他代币

……唔?

请记住,如果LP在[15.625, 17.313]价格范围中提供了4个X,那么只有当X的价格从15.625上升到17.313时,4个X才会逐渐被兑换成价值较低的Y!

这就是为什么在场景2和3中,LP在提供流动性时, 只需要/被允许提供两种代币中的一种的原因. 事实上,LP 提供流动性本质上是提供一种代币,使得其他人在该代币变得更有价值时,进行兑换!

如果X的价格在达到17.313后立即回落至15.625怎么办?当X变得不那么有价值,其他人将反过来用Y换取X,这最终会使65.798个 Y(之前从 4个X 交换得到的Y)被兑换回 4个X。

下图很好地说明了,当价格范围为 [1.001, 1.002]时, 代币对 DAI/USDC上发生的事情: 矿池始终*在价格范围两侧端点上完全只有一种代币储备**,而中间的 1.001499⁷价位上则有两种代币储备。 68747470733a2f2f696d672e6c6561726e626c6f636b636861696e2e636e2f6174746163686d656e74732f323032322f30352f7250506454433041363238646137633931366130392e706e67.webp 图片来源: https://uniswap.org/blog/uniswap-v3/

同样,如果LP在低于当前价格的价格范围内提供流动性,例如情景3,LP就必须准备一定数量的Y,供其他人在该范围内用Y换X。(译者注:X相对Y此时过于便宜了,所以外部交易者纷纷用Y换取便宜的X)

总结一下,我们此时知道了:

  1. 情景2和3只需要一种代币,而情景1需要两种代币。

  2. 只有当前价格在价格范围内时,LP才能赚取交易手续费。这就是为什么大多数人认为 v3 的 LPs 必须要更积极主动地监控价格 ,从而以最大化做市收入. 这也意味着 v3的LPs已经成为套利者 🤯

我将在 5. v3 的影响 的段落中聊更多这方面的影响

⁷ 1.001499988 = √(1.0001 * 1.0002) 是 1.0001 和 1.0002的几何平均值. 也就是说,两个价格的几何平均数,就是该价格范围内的平均执行价格。

可逆的限价单

如上一节示例,如果在[15.625, 17.313] 中存在 4个X,当价格超过 17.313 时,这4 个X 将被完全转换为 65.798个 Y。

我们都知道,价格可以在 [10, 12] 这样的宽范围内停留相当长的一段时间,而在 [15.6, 15.7] 这样的窄范围内则不太可能停留太久。

因此,如果一个LP在[15.6, 15.7]中提供了流动性,那么我们可以预期,一旦 X 的价格超过 15.6 并立即超过 15.7 且不回落到范围内,那么LP注入的所有X将永远地被兑换为 Y。

而限价单的定义正是给定目标价,跨过该价格订单才成交!唯一不同的是,如果v3的范围订单不够窄,一旦价格回落到该范围内,极有可能逆转代币的兑换。

因此,LP通过提交范围订单在 v3 上提供流动性,本质上就是提交了收交易费的可逆限价订单。

May 8更新

下面对范围订单的生效区间的解释, 并非代码的真实效果。由于范围的宽度被设计为与交易费率相关,因此 Uniswap v3 上的范围订单可能非常宽。

As price ranges follow the equation p(i) = 1.0001 ^ i, the range can be quite narrow and a range order can thus effectively serve as a limit order: 基于价格范围将遵循等式 p(i) = 1.0001 ^ i, 因此当范围非常窄时, 可以被当做是限价单:

  • 当 i = 27490, 1.0001²⁷⁴⁹⁰ = 15.6248.⁸
  • 当 i = 27491, 1.0001²⁷⁴⁹¹ = 15.6264.⁸

虽然0.0016 的范围看上去并没有那么窄,但肯定可以满足大多数情况下的限价单使用场景!

⁸ 正如前面注释 #4 中提到的,价格和索引的关系等式中有一个平方根,因此这里的数字仅供说明之用。

5. v3的影响

更高的资本效率,LP成为套利者……随着 v3 做出了大量根本性的改变,我想总结一下个人对 v3 影响的看法:

  1. 更高的资本效率使得 DeFi中最常考虑的指标之一:TVL,总锁定价值,变得意义不大. 因为 Uniswap v3 上的1美元可能与v2上的100美元甚至2000美元上有同等的效果。

  2. 现货交易所之间的现货交易的便利性曾经是现货市场相对于衍生品市场的巨大优势。由于LP将承担套利者的角色,并且套利更有可能发生在v3内部而不是DEX之间,因此这种差距缩小了…… 至于缩小到什么程度?并不知道。

  3. Uniswap v3 流动性代币 引发的LP 策略和聚合NFT正在成为新的 DeFi 创业公司的蓝海:参见 VisorLixir。事实上,这可能是 DeFi 和 NFT的转折点: 区块链走向主流的两个主要原因,如今汇聚到了一个共同利益点:解决$$问题 (译者注:$$问题应该是是指流动性问题)。 (译者注: LP代币不再是FT, 而是NFT)

  4. 在适合的链,即交易费用足够低的地方,比如 Optimism,我们可能会看到 算法交易公司 进入Uniswap v3上的LP策略市场,我相信在提升流动性方面, Algo交易会比链上策略或DAO投票更为强大.

  5. 阅读 Parsec.finance 的这篇文章后:[The Dex to Rule Them All](https://research.parsec.finance/posts/uniswap- v3-vs-LOB),我不禁想知道: 也许会有采用 v3 方法的中心化加密货币交易所。原因在于,由于LP在同一tick的订单是按比例执行的,Algo交易中无休止的抢先交易问题,某种程度上是不是……解决了? 🤔

无论如何,个人意见可能有失偏颇,或者存在严重错误。我只是抛砖引玉。有不同的声音?在下方留下您的评论!

6. 结论

读下来有点难理解是不是?很高兴你能看到这里🥂

实际上还有更多细节,以及预言机的很大一部分尚未被涵盖。然而,由于这篇文章更多的是关于功能介绍,并且是针对普通 DeFi 用户的,所以我将把这些留给下一篇;希望存在下一篇:)

如果您有任何疑问或发现任何错误,请随时与我联系,我会尽力回复 AFAP。

敬请期待,同时让我们拭目以待Uniswap v3又将如何引领DeFi创新!

感谢 toShao

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

0 条评论

请先 登录 后评论
songmint
songmint
DeFi researcher