Uniswap V4 新特性简要分析
概述
6月13日, Uniswap Labs 发布了博客,宣布推出了 Uniswap V4 的草案代码,包括 Uniswap v4 核心和周边库的开源早期版本以及技术白皮书的草案。Uniswap V4 出现了许多新的特性,本文将结合其草案代码以及白皮书进行相应的分析。
V4 新特性
在 Uniswap V4 中引入了 hooks,可以由池创建者进行定制化的功能;同时放弃了原来的通过工厂合约建立流动性池的方式,所有池都在一个合约中;使用 Flash accounting 方式节省 Gas;支持原生的 ETH;同时还有一些其他的新特性。
Singleton 取代 Factory
Uniswap 的 V2 和 V3 版本都是通过工厂合约创建新的流动性池,每一个流动性池都是一个单独的合约,因此创建新的流动性池也就意味着会创建一个新的合约,这样会耗费大量的 Gas;而在 V4 版本中则是使用了 Singleton 模式,所有的流动性池都在一个合约中,创建新的流动性池不再需要创建合约,流动性池数据都保存在合约的映射中,通过poolId 指向 pool.State,poolId 则由 PoolKey 进行哈希并转换成 uint 得到,而 pool.State 则存储 pool 的数据,这样做大大降低了创建新流动性池的 Gas。
然后我们查看代码,分析 V4 的 PoolManager 合约如何创建新的流动性池。
在 V4 中通过 PoolManager 合约中的 initialize 函数创建新的流动性池,需要传入 PoolKey 结构体以及价格,其中的 PoolKey 结构体如下:
PoolKey 中包括了两种代币的地址,以及交换的费用,高位的 4 bit 决定是否在 hook 中收费,然后是 tickSpacing 以及 hook 的地址。然后看 initialize 函数:
函数会校验先校验 fee 和 tickSpacing 的范围是否正确,然后使用 isValidHookAddress 函数校验 hook 地址是否有效:
如果 hook 地址是 0 地址的话则 fee 必须为静态费用,且不在 hook 中收费才能通过校验;不是 0 地址的话则会检查是否启用 hook 功能(将 hook 地址转换为 uint160 整数,并和最小的 FLAG 进行比较,大于则表示启用 hook 功能),或者 fee 满足动态费用或者在 hook 中启用 swapfee 以及 witrhdraw,四个条件满足一个即可通过校验。
接下来,如果 hook 设置了在初始化前调用的话则会去调用 hook 合约的 beforeInitialize 函数,执行 hook 中设定的逻辑。
- 星际资讯
免责声明:投资有风险,入市须谨慎。本资讯不作为投资建议。