Uniswap V3中的价格波动限制

  • RareSkills
  • 发布于 2025-03-24 14:51
  • 阅读 1737

本文详细介绍了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,以与最高价格保持一致。

最高 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 索引

最低 tick 索引设置为 -887,272,这是最高可能 tick 的负数。

这种对称性是可取的,因为代币 X 相对于代币 Y 的价格是代币 Y 相对于代币 X 的价格的倒数。因此,限制代币价格的最小值为 2^-128 是可取的,这对应于 tick -887272。

代码库中的最小和最大值

最小和最大 ticks 索引在 Uniswap v3 TickMath 库中被硬编码为 MIN_TICKMAX_TICK

sqrtPriceX96 变量可以假定的最小值和最大值也分别被硬编码为 MIN_SQRT_RATIOMAX_SQRT_RATIO。这是可以在下面的截图中看到的,这些值将在后面的章节中计算。

![Uniswap V3 TickMath 库中最小 tick 和最大 tick 的截图](https://img.learnblockchain.cn/2025/03/24/L...

剩余50%的内容订阅专栏后可查看

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

0 条评论

请先 登录 后评论