译文出自:登链翻译计划[1] 译者:songmint[2] 校对:Tiny 熊[3]
图片来源: https://uniswap.org/blog/uniswap-v3/
最近, Uniswap V3[4]的发布无疑是 DeFi 世界中,最令人激动的新闻。🔥🔥🔥
当大多数人的谈论聚焦在 v3 带给市场的潜在冲击时, 如何使用精妙技术实现那些令人惊叹特性的讨论,却极为罕见。那些特性包含了集中流动性,类似限价单的范围订单等。
既然之前我已经解读过了 Uniswap v1 & v2 (如果你能读中文,链接在此v1[5] & v2[6]), 因此我也责无旁贷,继续为大家解读 v3!
本文将基于官方白皮书[7]和网站上的例子,带领各位读者走上理解 Uniswap v3 的旅程。我们不会涉及太多代码,因此无需您有工程师背景;文章中的数学仅仅限于高中程度,因而也无需您是数学出身。所以您可以完全理解接下来的内容。😊
如果您读完全文却依然不得要领, 欢迎随时给我回复 🙏 !
以后将会有另一篇文章聚焦于代码库。不过现在先让我们准备好背景音乐,开始这段旅程。
背景音乐视频链接:https://www.youtube.com/watch?v=051C0FiNX5U
在深入之前,我们首先回顾一下与传统的订单簿交易所相比,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, 为使用者提供了独特的体验:
在订单簿中, 每个价格(无论是红色还是绿色)都是一个 tick. 图片来源: https://ftx.com/trade/BTC-PERP
¹ 尽管价格随着时间的推移会变得更差,mStable 等常数和的 AMM 并不具有无限的流动性 (译者注:mStable 是一个 AMM,参见 https://mstable.app/#/musd/swap)
² 价格范围事实上可以扩展到[-∞,∞], 不过大多数情况下价格不可能为负值. (译者注: 事实上 WTI 原油期权价格就曾经短暂为负值)
³ 常数和 AMM 不会产生价格滑点
Uniswap v3 所有的创新都始于 Tick
不熟悉 tick 的朋友请看
来源: https://www.investopedia.com/terms/t/tick.asp
v3 通过将价格范围 [0,∞] 分成无数个细粒度的 ticks,使得在 v3 上发生的交易极其类似于与在订单簿交易所发生的交易. 它们只有三个不同之处:
通过对 tick 的这个设计,Uniswap v3 拥有了 AMM 和订单簿交易所的大部分优点!💯💯💯
事实上, 这个问题与上面关于 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.
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)²³ 之间的价格范围。即使是谷歌也无法计算出这些数字,所以请允许我提供较小的值,用以大致了解整个价格范围:
1.0001 ^ (2¹⁸) = 242,214,459,604.341
1.0001 ^ -(2¹⁷) = 0.000002031888943
可以确定地说,使用 int24 类型定义的价格范围, 可以涵盖这个世界中超过 99.9%的资产价格 👌 ⁴ 基于技术实现的考虑, 等式两边都添加了一个平方根.
那么,如何找出一个价格对应的那个 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. 哈哈!
*⁵ 这个公式也略有修改,以便适应实际的技术实现。
既然我们知道了 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)。
从上面的例子中,我们可以有以下两点观察:
更重要的是, 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 提供了此信息.
(本节内容更新于 5 月 8 日,之前描述的内容中,排除了最后三种也是范围订单情景的做法是错误的。)
如上一节所述,v3 的 LP 可以根据自己的意愿为任何价格范围/tick 提供流动性。LP 在 v3 上提供流动性的行为就被称为(创建)范围订单。
根据当前价格和目标价格范围的不同关系,存在三种情况:
在提供流动性时, LP 面临这三种场景, 在是否需要提供两种代币或仅一种代币 以及 需要/被允许(哪个)代币多少数量 上, 会存在不同之处。
情况 1 可以进一步分为两种情况:当前价格是或者不是目标价格范围的中心。
如果当前价格恰好位于目标价格范围的中心(例如当价格范围为[8, 12] 时,当前价格 = 10),则它与之前 uniswap 版本(译者注:v1,v2)的流动性提供机制完全相同:此时 LP 提供 具有等同价值的两种代币数量(价值= 数量 * 价格)。
如果当前价格不是价格区间的中心,那么 LP 仍然需要分别提供两种代币的流动性,而每个代币的数量将取决于当前价格与价格范围端点的距离,这将在下一节进行解释(虽然没有明确说明)。
对应这种情况, 坊间有一个类似的产品: 网格交易,这是一个非常强大的投资工具,适用于整合。如果你不知道什么是网格交易?看Binance 的解释[9].关于这个主题(译者注:网格交易),我们不会再多做涉及.
事实上,Uniswap v1 和 v2 的 LP 就是在做网格交易,只不过交易的范围为 [0,∞],基准价格是提供流动性时的价格。
与场景 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 的价格达到 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)
总结一下,我们此时知道了:
我将在 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, 因此当范围非常窄时, 可以被当做是限价单:
虽然 0.0016 的范围看上去并没有那么窄,但肯定可以满足大多数情况下的限价单使用场景!
⁸ 正如前面注释 #4 中提到的,价格和索引的关系等式中有一个平方根,因此这里的数字仅供说明之用。
更高的资本效率,LP 成为套利者……随着 v3 做出了大量根本性的改变,我想总结一下个人对 v3 影响的看法:
无论如何,个人意见可能有失偏颇,或者存在严重错误。我只是抛砖引玉。有不同的声音?在下方留下您的评论!
读下来有点难理解是不是?很高兴你能看到这里 🥂
实际上还有更多细节,以及预言机的很大一部分尚未被涵盖。然而,由于这篇文章更多的是关于功能介绍,并且是针对普通 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