前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入解读 Uniswap v3 新特性

深入解读 Uniswap v3 新特性

作者头像
Tiny熊
发布2023-01-09 17:49:37
9070
发布2023-01-09 17:49:37
举报

译文出自:登链翻译计划[1] 译者:songmint[2] 校对:Tiny 熊[3]

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

0. 序言

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

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

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

本文将基于官方白皮书[7]和网站上的例子,带领各位读者走上理解 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 的时间内完成,那么成交价格并不一定会有滑点。

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

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

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

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

2. Tick

Uniswap v3 所有的创新都始于 Tick

不熟悉 tick 的朋友请看

来源: 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 的价格范围 ⁴,请看:

图片来源: 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.

代码语言:javascript
复制
p(2) / p(1) = 1.00020001 / 1.0001 = 1.0001

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

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

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

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

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

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

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

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

代码语言:javascript
复制
1.0001 ^ (2¹⁸) = 242,214,459,604.341
代码语言:javascript
复制
1.0001 ^ -(2¹⁷) = 0.000002031888943

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

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

从价格反推 Tick 索引

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

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

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

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

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

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

3. 集中流动性

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

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

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

每个 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/ "1200, 2800] 范围内的流动性,那么我的资本效率将比范围 [0,∞] 的 v2 高 4.24 倍 😮 这里有一个 [资本效率比较计算器"),你一定要试试看!

图片来源: 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 的解释[9].关于这个主题(译者注:网格交易),我们不会再多做涉及.

事实上,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⁷ 价位上则有两种代币储备。

图片来源: 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 创业公司的蓝海:参见 Visor[10] 和 Lixir[11]。事实上,这可能是 DeFi 和 NFT 的转折点: 区块链走向主流的两个主要原因,如今汇聚到了一个共同利益点:解决问题 (译者注:问题应该是是指流动性问题)。(译者注: LP 代币不再是 FT, 而是 NFT)
  4. 在适合的链,即交易费用足够低的地方,比如 Optimism,我们可能会看到 算法交易公司 进入 Uniswap v3 上的 LP 策略市场,我相信在提升流动性方面, Algo 交易会比链上策略或 DAO 投票更为强大.
  5. 阅读 Parsec.finance[12] 的这篇文章后:[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

原文链接:https://medium.com/taipei-ethereum-meetup/uniswap-v3-features-explained-in-depth-178cfe45f223

参考资料

[1]

登链翻译计划: https://github.com/lbc-team/Pioneer

[2]

songmint: https://learnblockchain.cn/people/13263

[3]

Tiny 熊: https://learnblockchain.cn/people/15

[4]

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

[5]

v1: https://medium.com/taipei-ethereum-meetup/uniswap-explanation-constant-product-market-maker-model-in-vyper-dff80b8467a1

[6]

v2: https://medium.com/taipei-ethereum-meetup/uniswap-v2-implementation-and-combination-with-compound-262ff338efa

[7]

官方白皮书: https://uniswap.org/whitepaper-v3.pdf

[8]

Curve: https://curve.fi/

[9]

Binance的解释: https://www.binance.com/en/support/faq/f4c453bab89648beb722aa26634120c3

[10]

Visor: https://www.visor.finance/

[11]

Lixir: https://lixir.finance/

[12]

Parsec.finance: http://s.pc.qq.com/pcmgr/index.html?url=%68%74%74%70%3a%2f%2f%70%61%72%73%65%63%2e%66%69%6e%61%6e%63%65%2f%3f%71%71%64%72%73%69%67%6e%3d%30%37%30%30%32&eviltype=0x2084&showtrust=1&bid=4&ticket=452C090AF7F92C66D9C6AA86CF7949A0&version=19676&worktype=0&runinsxstatus=0&mgrtoken=7955243712202602544

Twitter : https://twitter.com/NUpchain Discord : https://discord.gg/pZxy3CU8mh

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 深入浅出区块链技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0. 序言
  • 1. Uniswap & AMM 概述
  • 2. Tick
    • 那么,一个 tick 对应的价格区间是如何决定的呢?
      • 价格范围: 最大值 & 最小值
        • 从价格反推 Tick 索引
        • 3. 集中流动性
        • 4.范围订单: 可逆的限价单
          • 场景 1:当前价格属于目标价格范围
            • 场景 2 & 3:当前价格不属于目标价格范围内
              • 可逆的限价单
              • 5. v3 的影响
              • 6. 结论
                • 参考资料
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档