为何两个Uni V3池字节码存在差异?如何通过字节码验证Uni V3池身份?
为什么同工厂部署的Uni V3池运行时字节码不一致
这是Uniswap V3的原生设计导致的,不同V3池的运行时字节码本身就会存在差异,你并没有操作错误,核心原因有两点:
- Uni V3池合约在编写时,将
token0、token1、fee、tickSpacing这四个池子独有的参数定义为了immutable类型,这类参数不会存在合约存储中,而是会在合约部署的时候直接写入运行时字节码的固定位置。每个池子的这四个参数都不相同,最终生成的运行时字节码自然会存在差异。 - 你手里的参考字节码属于编译完成后还未填充
immutable参数的模板字节码,和实际部署、填充完独有参数的线上字节码当然无法匹配。
正确校验Uni V3池的方案
不要直接全量对比运行时字节码,可以选择下面两种更可靠的校验方式:
- 固定字节码片段校验:将获取到的运行时字节码去掉末尾用于存储
immutable参数的固定长度片段,只对比前面的逻辑代码部分,同工厂部署的所有V3池这部分内容是完全一致的。 - 接口+工厂校验:先调用待校验地址的
factory()方法,返回值和官方Uni V3工厂地址对比一致后,再尝试调用token0()、token1()、fee()这三个V3池独有的方法,如果都能正常返回有效值,就可以确认是合法的Uni V3池。
内容的提问来源于stack exchange,提问作者Adam B.
相关产品推荐
相关产品推荐

