V3中的tick_bitmap
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。
流程:
- 根据当前 tick 找到它所在的 word
- 查看这个 word 的 bit 是否有设置(非零)
- 如果有 → 找到最近的 1 bit(使用位运算 + binary search)
- 如果没有 → 跳到下一个 word
- 重复直到找到下一个有流动性变化的 tick
找到后:
✅ 该 tick 的 liquidity change 生效
✅ 价格移动到该 tick 对应的 sqrtPrice
✅ 继续 swap
这让 swap 不需要逐 tick 遍历,而是跳跃到下一个有意义的 tick。



总结
✅ Tick Bitmap 是一个记载“哪些 tick 有流动性变化”的位图结构。
✅ 每 256 个 ticks 对应一个 uint256,用 bit 表示 tick 是否初始化。
✅ swap 时利用 bitmap 能快速找到下一个可用 tick,大幅节省 gas。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 EIGHTJIU!
评论
