本文详细介绍了Uniswap v3中的tick索引的最小值和最大值,以及它们与价格存储的关系。文章解释了如何计算与最大价格2128对应的tick值,并探讨了使用int24
来存储tick索引的原因,同时指出了在代码库中硬编码的最小和最大平方根比率值。
最小的 tick 在 Uniswap v3 中是 -887,272,最大的 tick 是 887,272。本章解释了这一范围背后的理由,它基于找到与协议中可以存储的最高价格相对应的 tick。
在上一章中,我们看到协议将代币价格的平方根存储为 Q64.96
类型的固定点数字。这种类型的变量的最大整数值为 264。因此,它可以存储的最高价格为 2128。
这意味着协议无法处理超过 2128 的价格。换句话说,在 Uniswap v3 中,代币永远无法达到超过 2128 的实际价格。如果不遵守此限制,代币可能会达到协议无法存储的价格值。
因此,最高 tick 必须是对应于价格 2128 的 tick,以与最高价格保持一致。
要计算对应于价格 2128 的 tick,让我们记住价格与 tick 之间的关系是由以下公式给出的:
$$p(i)=1.0001^i$$
通过对两边取以 1.0001 为底的对数,可以反转这个关系。
$$ \begin{align} \log{1.0001}(p(i)) &= \log{1.0001}(1.0001^i) \ \log_{1.0001}(p(i)) &= i \end{align} $$
因为对于任何底 b,有 $log_b(b^x)=x$。
上述公式允许我们根据价格 p(i) 计算 tick 索引 i。
现在,我们需要确定相对于最高可能代币价格 2128 的 tick 索引。
在上面的公式中使用 p(i)=2128,我们得到:
$i=log_{1.0001}(2^{128})=887272$
这个计算可以用 Python 进行如下操作:
from math import log
log(2**128,1.0001) # log_1.0001(2**128) = 887272
因此,tick 索引 887,272 是协议使用的最高索引,因为大于 887,272 的 ticks 对应于超过 sqrtPriceX96
变量可以存储的最大值的价格。
最低 tick 索引设置为 -887,272,这是最高可能 tick 的负数。
这种对称性是可取的,因为代币 X 相对于代币 Y 的价格是代币 Y 相对于代币 X 的价格的倒数。因此,限制代币价格的最小值为 2^-128 是可取的,这对应于 tick -887272。
最小和最大 ticks 索引在 Uniswap v3 TickMath 库中被硬编码为 MIN_TICK
和 MAX_TICK
。
sqrtPriceX96
变量可以假定的最小值和最大值也分别被硬编码为 MIN_SQRT_RATIO
和 MAX_SQRT_RATIO
。这是可以在下面的截图中看到的,这些值将在后面的章节中计算。
![Uniswap V3 TickMath 库中最小 tick 和最大 tick 的截图](https://img.learnblockchain.cn/2025/03/24/L...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!