Uniswap v3 使用两种类型的储备:真实储备(real reserves)和虚拟储备(virtual reserves)。
真实储备表示一个区段(segment)中实际存在的代币数量。
每个区段都有一对真实储备:token X 的真实储备(记为 )和 token Y 的真实储备(记为 )。其中一种代币的储备可以为零,但不能两者全为零——否则,该区段将没有流动性。
虚拟储备表示如果一个区段是无限曲线的一部分时所拥有的代币数量——换句话说,如果该区段像 Uniswap v2 那样延伸至无限远。
在本章的开始,我们将更详细地研究真实储备,然后再探讨虚拟储备。
真实储备
让我们来看下面的插图,图中展示了单个区段。当前价格由红色射线表示。该区段在 token X 中有 的真实储备,在 token Y 中有 的真实储备,如插图中的几何形状所示。

token X 的真实储备是价格的 x 坐标与 upper tick 的 x 坐标之间的距离。token Y 也是如此,但现在是 y 轴上到 lower tick 的距离。
之所以这样定义,是因为我们处理的是一段曲线。如果该曲线是无限的,那么 和 的值将分别等于 和 。
在 Uniswap v3 中使用的区段储备与在 Uniswap v2 中使用的无限曲线储备之间有一个重要区别:在一个区段中,某种代币是可以被完全耗尽的。
想象一下,通过一次交换(swap),价格移动到了下图所示的位置。在这种情况下,所有的 token X 都将从该区段中移除,而真实储备将仅由 token Y 组成。

另一种可能性是,价格一直移动到 lower tick 的位置,如下图所示。在这种情况下,该区段的真实储备将完全由 token X 组成,而该区段中的 token Y 将被完全耗尽。

这种耗尽在 Uniswap v2 中是不可能的,因为它的曲线是无限的,所以不存在可以触达的“边界”。
在真实场景中,一个 pool 是由多个区段组成的。考虑下图所示的场景:在这种情况下,价格可能会跌破蓝色区段,进入紫色区段。

蓝色区段不再有可出售的 token Y ——其真实储备仅为 token X ——而紫色区段则有。只要当前价格保持在一个区段的边界内,该区段就会同时持有这两种代币,且可以在其中进行 swap。
只要价格持续低于其 lower tick,蓝色区段中 token X 的数量就会保持为 。
正如你所看到的,一个区段的真实储备取决于当前价格。规则如下:
- 如果当前价格大于或等于该区段的 upper tick,真实储备将全部为 token Y。
- 如果当前价格小于或等于该区段的 lower tick,真实储备将全部为 token X。
- 如果当前价格位于 lower tick 和 upper tick 之间,那么 token X 和 token Y 都将存在真实储备。
每个区段都有其真实储备
每个区段都存在真实储备——也就是说,每个区段都有这样一对值: 和 。其中一个可以为零,但不能同时为零。如果两者都为零,则说明没有流动性,我们可以忽略该区段。
请看下面的插图,图中展示了三个区段——灰色、紫色和橙色(没有显示其他可能的区段)。当前价格由红色射线指示。每个区段都有一定数量的真实储备。
- 灰色区段在 token X 中有 的真实储备,而在 token Y 中没有真实储备。
- 紫色区段在 token X 中有 的真实储备,在 token Y 中有 的真实储备。
- 橙色区段在 token Y 中有 的真实储备,而在 token X 中没有真实储备。

如果当前价格位于某个具有流动性的区段之外,那么该区段必然只包含一种资产。任何未进入该特定区段的价格变动,都不会影响该区段内的真实储备。
当价格在一个区段内移动时,token X 和 token Y 会通过 swap 进行交换。因此,当价格位于某个区段内部时,它的运作方式就像 Uniswap v2 一样;但当价格处于其外部时,该区段就会变为非活跃状态。
但是,Uniswap v2 的数学模型只在区段实际为无限曲线时才成立。为了将每个区段视为无限曲线——从而表现得像 Uniswap v2 一样——我们引入了虚拟储备的概念。
虚拟储备
虚拟储备是指,如果一个区段是无限曲线的一部分而不仅仅是一小段时,它所拥有的储备量。为了说明这一点,让我们画一条无限曲线,并用虚线表示区段之外的部分。

虚拟储备就如同我们在 Uniswap v2 中的储备一样——在这种情况下,它们将是整个 pool 的储备。这些储备也就是当前价格与曲线相切的点 。
下图同时展示了该区段的虚拟储备 和真实储备 。

下面的动画显示,随着曲线区段的延伸,该区段的真实储备会越来越接近虚拟储备。如果曲线延伸到无穷远——就像在 Uniswap v2 中那样——虚拟储备和真实储备就会变得完全相同。
为什么在 Uniswap v2 中不需要区分虚拟储备和真实储备?
在 Uniswap v2 中,因为只有一条单一的无限价格曲线——而不是多个曲线区段——所以真实储备和虚拟储备是相同的。因此,坐标 同时代表虚拟储备和真实储备。我们不需要去区分它们,可以直接统称为储备。
区段中的 swap 与 Uniswap v2 的方式相同
尽管虚拟储备并不代表某个区段(或 pool)中实际的代币数量,但它们依然非常重要。因为在一个区段内,我们希望使用与 Uniswap v2 相同的数学模型。换句话说,我们希望每个区段的表现都像是在一条无限曲线上一样——而这正是虚拟储备所提供的能力。只要一笔交易没有导致价格移出该区段,我们就可以使用这种简化方法。
考虑下面插图所示在 Uniswap v2 中的 swap。在左侧,pool 包含 个 token X 和 个 token Y,所以价格是 ,流动性是 。
在一次 swap 之后(如右侧所示),价格变为 ;token X 的储备变为 ,token Y 的储备变为 。因此, 个 token X 离开 pool, 个 token Y 进入 pool。

现在让我们考虑同样的 swap,不过这次是在 Uniswap v3 中,如下图所示。我们不再有一条无限的曲线——只有区段,比如图中显示的三个区段:灰色、紫色和橙色。假设 swap 发生在紫色区段中,并且具有与上例相同的流动性。
请注意,发生的一切都是相同的,就好像紫色区段是一条无限曲线一样!价格从 移动到了 ; 个 token X 离开 pool, 个 token Y 进入 pool。

在一个具有 流动性的区段内,swap 的发生过程就像我们在流动性恒定为 的无限曲线上一样,完全与 Uniswap v2 相同。 仅有的两个区别是:
- 当价格触及区段边界时,swap 将无法再继续发生在该区段内——它们必须在下一个区段中进行。
- 该区段的 和 值不代表该区段中实际的代币数量——它们是该区段的虚拟储备。
除此之外,我们继续使用与 Uniswap v2 相同的定义。代币的价格定义为 ,流动性遵循恒定乘积公式 。
唯一的区别是,我们将 替换成了 ,并将流动性定义为 。这样做的原因将在后面的小节中明了。
Uniswap v3 中的价格与流动性
在 Uniswap v3 中,我们将价格定义为虚拟储备之间的比率:
这里的价格始终指代 token X 的价格。
一个区段的流动性 由以下公式定义:
真实储备与虚拟储备的交互工具
下面是一个交互式工具,你可以在其中查看指定区段的真实储备 和虚拟储备 。滑动价格游标,看看储备会随着价格的移动如何变化。你还可以通过更改下方的 k1–k4 来调整区段的流动性。
计算一个区段的真实储备
在本章的第一部分,我们看到了区段真实储备的视觉演示。现在,我们需要一个公式来定量地计算真实储备。
在 Uniswap v2 中,储备仅取决于价格和流动性。在 Uniswap v3 中,情况并非如此。让我们看看下面的插图。左右两边的区段都具有相同的流动性,而且我们考虑的是相同的价格,但很明显,左边的真实储备比右边要大。

在 Uniswap v3 中,一个区段的真实储备取决于该区段的流动性、当前价格以及区段的边界——它的 upper tick 和 lower tick。我们将把推导区段真实储备公式的部分留到下一章。
接下来,我们将展示如何根据流动性和价格来计算虚拟储备。这是必要的一步,在此之后我们才能进一步解释如何计算真实储备。
根据价格与流动性推导虚拟储备
现在我们将学习如何根据当前价格和流动性来计算虚拟储备。
推导虚拟储备
我们从定义 和 开始,其中 和 是虚拟储备, 是价格, 是流动性。
首先,我们将 除以 ,从而用 和 推导出 :
推导虚拟储备
通过将 乘以 ,我们可以得到储备 :
虚拟储备公式
我们推导出了所需的两个公式,即通过 和 计算虚拟储备:
为什么在定义流动性时要使用 而不是
如果我们将流动性定义为 而不是 ,那么上述关于 和 的方程将会依赖于 而不是 。这可以从下面的推导中看出,在该推导中我们使用了 而非 。
Uniswap v3 使用 而不是 ,是为了避免在链上计算平方根这一昂贵的操作。
追踪价格平方根而不是追踪价格背后的动机
使用 可以让我们在计算 和 时避免对 进行开平方操作。如果我们能够对 做同样的事情,那就非常方便了。也就是说,如果能够直接从 和 (而不是 和 )中计算出 和 将会方便很多。
不幸的是,这是不可能的,因为我们不想改变价格的定义方式——我们希望保持与 v2 相同的公式。因此,虚拟储备必须使用公式 和 进行计算。
这给我们留下了两个选择:要么在协议中追踪 ,并在链上求其平方根来计算储备;要么直接追踪 的平方根。第二种选择在 gas 消耗上要高效得多。
因此,协议追踪的不是价格 ,而是将 作为变量 sqrtPriceX96 进行追踪,从而避免了计算价格平方根的需要。
总结
- Uniswap v3 具有两种类型的储备:虚拟储备和真实储备。
- 真实储备是在每个区段中定义的,表示该区段内包含的代币数量。一个区段可以包含 token X 的真实储备、token Y 的真实储备,或者两者皆有。
- 一个区段内的代币数量取决于当前价格。如果当前价格大于或等于 upper tick,将仅有 token Y 的真实储备。如果它小于或等于 lower tick,将仅有 token X 的真实储备。如果它介于 upper tick 和 lower tick 之间,那么两种代币都会有真实储备。
- 虚拟储备是指,如果一个区段是无限曲线(就像在 Uniswap v2 中那样),它所会拥有的代币数量。利用虚拟储备,我们可以在 Uniswap v3 的每个区段上使用与 Uniswap v2 相同的数学模型。
- Uniswap v3 使用了公式 而不是 ,以避免在链上计算 的平方根。
- 作为 和 的函数,虚拟储备由 和 给出。