Tick Bitmap 是什么?(一句话解释)

Tick Bitmap 是一个位图(bitmap),用来快速标记 哪些 tick 是流动性变化发生的位置(即 tick 是否被初始化)。

你可以把它当成:

一个超大地图,记录哪些 tick 存在“路障”(= 有流动性变化)

为什么需要 Tick Bitmap?

在 Uniswap V3 中,流动性不是整段连续,而是:

  • 流动性提供者对每个区间(tick range)提供流动性
  • 区间的边界 tick 才会有流动性变化

举例:有人提供流动性范围为 1000~2000
则:

  • tick 1000 → liquidity changes
  • tick 2000 → liquidity changes

在单次 swap 中,如果价格要穿越多个 ticks,就要找到下一个流动性变化的 tick

Bitmap 的核心就是:

使用位(bit)来存储 tick 是否初始化
每 1 bit 表示 1 个 tick
32 bytes(=256 bits)记录 256 个 tick 的初始化状态

这样:

可以用 O(1) 的复杂度跳到下一个“已初始化的 tick”,而不是 O(n) 遍历所有 tick。

tick 总共有多少个?

Uniswap v3 可允许:

1
ticks 范围: -887272 ~ +887272

总量:超过 170 万个 tick

Tick Bitmap 的结构

Bitmap 是一个:

1
mapping(int16 => uint256) public tickBitmap;

解释:

  • int16 = word index(一个 word 包含 256 个 ticks)
  • uint256 = 256 bits,每个 bit 对应一个 tick

Bitmap 如何在 swap 中使用?

swap 时要找到下一个“initialized tick”来更新流动性和 sqrtPrice。

流程:

  1. 根据当前 tick 找到它所在的 word
  2. 查看这个 word 的 bit 是否有设置(非零)
  3. 如果有 → 找到最近的 1 bit(使用位运算 + binary search)
  4. 如果没有 → 跳到下一个 word
  5. 重复直到找到下一个有流动性变化的 tick

找到后:

✅ 该 tick 的 liquidity change 生效
✅ 价格移动到该 tick 对应的 sqrtPrice
✅ 继续 swap

这让 swap 不需要逐 tick 遍历,而是跳跃到下一个有意义的 tick

9db4417ee9712b79abb08dd551cfcff5.jpg

1ab4ae846fca8cbefc54ea8baf84496f.jpg

8d5ed48c6af7ebc25a8f2ce36f9f7919.jpg

总结

Tick Bitmap 是一个记载“哪些 tick 有流动性变化”的位图结构。
每 256 个 ticks 对应一个 uint256,用 bit 表示 tick 是否初始化。
swap 时利用 bitmap 能快速找到下一个可用 tick,大幅节省 gas。