Uniswap V3 Pool Contract 的maxLiquidityPerTick 的 初识 (二)——MIN_TICK 和 MAX_TICK
上回我们研究了tickSpacingToMaxLiquidityPerTick
函数,并对它的变量进行了简单的介绍,其中有两个常量MIN_TICK
和MAX_TICK
,他们两个位于https://github.com/Uniswap/v3-core/blob/d8b1c635c275d2a9450bd6a78f3fa2484fef73eb/contracts/libraries/TickMath.sol
库中在 Uniswap V3 中,MIN_TICK
和 MAX_TICK
是定义了价格表示范围的关键常量。这些值基于特定的数学原理和 Uniswap V3 的设计需求。以下是对 MIN_TICK
和 MAX_TICK
的详细解释:
MIN_TICK
- 定义:
MIN_TICK
是 Uniswap V3 系统中使用的最小 tick 值,是一个负整数(-887272)。 - 计算方法:这个值是通过计算 ( \log_{1.0001}(2^{-128}) ) 得到的。这里的对数以 1.0001 为底,计算 2 的 -128 次幂的对数值。
- 意义:由于 1.0001 略大于 1,其对数函数能够将价格的指数变化转换为线性变化。
MIN_TICK
代表了一个非常低的价格,即资产1相对于资产0的价格极低的情况。
MAX_TICK
- 定义:
MAX_TICK
是 Uniswap V3 系统中使用的最大 tick 值,是一个正整数(887272)。 - 计算方法:这个值是通过计算 ( \log_{1.0001}(2^{128}) ) 得到的,即以 1.0001 为底,2 的 128 次幂的对数值。
- 意义:
MAX_TICK
代表了一个非常高的价格,即资产1相对于资产0的价格极高的情况。
数学原理
- 对数变换:使用 1.0001 作为底数的对数变换可以将价格的指数变化转换为线性空间中的变化。这是因为对数函数是单调递增的,可以将不同的价格水平映射到一个宽范围的线性空间。
- 价格范围:由于 Uniswap V3 使用对数价格,它可以表示非常大的价格范围,同时保持tick值在可管理的整数范围内。
- tickSpacing:在 Uniswap V3 中,tick 之间的间隔(
tickSpacing
)是固定的,这意味着每个 tick 代表的价格变动是一致的。MIN_TICK
和MAX_TICK
定义了这个间隔可以覆盖的整个价格范围。
作用
- 流动性分配:
MIN_TICK
和MAX_TICK
定义了流动性可以分配的价格范围,允许流动性提供者选择他们想要承担的风险水平。 - 交易费用:这些值还影响交易费用的计算,因为交易费用是基于tick值的变化来计算的。
- 资本效率:通过集中流动性在特定的价格区间,Uniswap V3 可以提高资本效率,而
MIN_TICK
和MAX_TICK
就是这个设计的基础。
结论
MIN_TICK
和 MAX_TICK
是 Uniswap V3 价格表示系统的核心组成部分,它们通过将价格映射到一个线性空间,使得协议能够高效地处理广泛的价格变动,同时为流动性提供者和交易者提供灵活性和精确性。
思考:为什么不使用1作为对数的底?
使用 1.0001 作为底数而不是 1 本身,是因为在 Uniswap V3 的设计中,需要能够表示价格的连续变化,并且能够捕捉到非常小的价格变动。以下是使用 1.0001 而不是 1 的几个主要原因:
-
捕捉微小变动:
如果底数是 1,那么对数函数 ( \log_1(x) ) 的值对于所有 ( x ) 都是 0,因为任何数的以 1 为底的对数都是 0。这意味着它不能捕捉任何价格变动。而当底数略大于 1 时,比如 1.0001,对数函数能够对价格的微小变动做出反应。 -
连续性和可微性:
使用一个略大于 1 的底数可以保证对数函数是连续且可微的,这对于实现价格的平滑变化和计算价格变化率是必要的。 -
避免歧义:
当底数为 1 时,对数函数没有意义,因为数学上未定义。选择一个略大于 1 的底数可以避免这个问题。 -
更精确的流动性分配:
使用 1.0001 作为底数,可以更精确地控制流动性的分配。在 Uniswap V3 中,流动性是按照价格的对数间隔分配的,这意味着即使是很小的价格变动也会导致流动性的不同分配。 -
计算tick值:
在 Uniswap V3 中,tick 值是基于对数价格的,使用 1.0001 作为底数可以方便地计算出 tick 值,这些 tick 值随后用于确定流动性池中的资金分配和交易费用。 -
实现价格范围:
使用 1.0001 作为底数允许 Uniswap V3 实现一个宽广的价格范围,同时保持对价格变动的敏感性。 -
数学上的便利:
1.0001 的对数是一个小的正数,这使得在实现中可以方便地处理价格比例的对数变换。 -
经验验证:
最后,使用 1.0001 作为底数可能是基于先前 Uniswap 版本的经验,以及对市场行为的观察和分析。
总的来说,选择 1.0001 作为底数是为了在 Uniswap V3 中实现更精细的价格控制和流动性分配,同时保持数学上的可行性和实现上的便利。