解密DeFi交易产品之UniswapV3:聚集流动性、协议手续费、价格预言机
探究DeFi交易产品Uniswap V3:集中流动性、协议手续费、价格预言机
来源:Keegan小钢
UniswapV3 在 2021 年 5 月上线,相较于 UniswapV2,它发生了翻天覆地的变化,变得更加复杂。不过,这些改动可一点儿都不傻,小编在这里为你精简了几个重点:
-
- 引入了集中流动性机制
-
- LP Token 变成了不可互换的 NFT
-
- 每个交易对存在多个不同费率的池子
-
- 协议手续费治理更灵活
-
- 价格预言机得到了改进
其中,最核心的改动就在于引入了集中流动性机制。所谓集中流动性,就是让流动性提供者(LP)能够将其提供的流动性“限制”在任意价格区间内,从而“集中”其流动性。也就是说,在 UniswapV3 中,当你要添加流动性时,得设定一个价格区间。看图说话,如下图所示:

默认情况下,这个价格区间是全范围的,即 (0, ∞)。任何人都可以根据喜好调整最低和最高价格,将流动性集中到自己设定的区间内。对了,得提醒一下,流动性的有效期只限于这个价格区间哦。
来个例子帮你更好理解吧。假设有两位 LP,A 和 B。A 设定在(1000, 2000)这个价格区间内提供流动性,而 B 则选择在(2000, 3000)内提供流动性。当交易价格为 1500 时,只会和 A 的流动性进行交易,交易手续费也分给了 A。B 的流动性则闲置着,无法参与交易,更不可能拿到分红。不过,当价格上涨到 2500 时,进入了(2000, 3000)这个价格区间,此时的交易只与 B 相关,B 所得到的交易手续费就全归 B 所有了。与此同时,A 的流动性就废掉了,也捞不到手续费了。唉,生意就是这么残酷,一会骄傲一会垃圾…
有了集中流动性机制,许多 LP 的流动性就聚集在了当前价格附近的区间,极大程度地提高了资金的利用率。
让我们看看下面这张图,展示了 USDC/ETH 的流动性分布:

全副武装的流动性,几乎都集中在当前价格附近,这可是大部分池子都在的黄金状态。
说起来,集中流动性机制听起来挺高深对不对。其实哪有什么高深,它只是让 LP 把它的流动性“显摆”起来而已。不过,这个机制背后的数学原理那就有点儿复杂了。而且,引入了一些新概念,比如 tick。
其实,UniswapV3 只是把 LP 提供的流动性分成了多个价格区间。为了方便计算不同区间的流动性和手续费分配,UniswapV3 对整个价格范围进行了离散划分,这些离散的价格点叫做 tick。下面的公式就描述了 tick 与实际价格之间的关系:

这个公式告诉我们,当 tick 为 0 时,实际价格是 1;当 tick 为 1 时,实际价格是 1.0001;当 tick 为 2 时,实际价格是 1.0001^2。换句话说,相邻价格点之间的价差是 0.01%。当然,tick 也可以是负值,表示价格 p 小于 1。
在 UniswapV2 里,添加流动性时两个代币的价值是相等的。而在 UniswapV3 中,这已经不再成立。看下面这张图:

上面那张图中,ETH/USDC 当前价格是 1806.97。那么,对于一单位的 ETH,不是按照当下价格 1806.97 来兑换 USDC,而是需要 2184.99。不得不说,两个代币的价值确实不等。此外,添加流动性后,如果 ETH/USDC 的价格下跌,你手里的 ETH 数量就会增加,而 USDC 的数量就会减少;相反,如果价格上涨,手里 ETH 的数量就会减少,USDC 的数量会增加。
基于这一特性,你还可以实现限价单的功能。试想一下,ETH 当前价格是 2500,你觉得价格有可能跌到 2000 以下,那你可以在附近设一个很短的区间,比如(1999,2000)。嗯哼,价格区间始终低于当前价格,你只要准备充足的 USDC 即可。这相当于你挂了一个价格为 2000 的限价买单。当价格跌至此区间,有人交易时,区间内的 USDC 就会被兑换成 ETH(实际上是 WETH);直到价格完全跌破这个价格区间上限,此时池子中的所有 USDC 都变成了 ETH。最后,你撤走流动性,之前的限价买单就可以成交了。前提是,你得注意以下两点:
-
- 如果价格没有穿过整个价格区间,你只能兑换部分 ETH
-
- 成交之后,别忘了撤走流动性,不然价格再次回到该区间时,你所兑换的 ETH 可能又得被换回成 USDC
接下来,咱们说下两个版本间的另外一个变化。在 UniswapV2 里面,流动性是公用的,每个 LP 都有相应的份额。这些份额是可以互相交换的,所以就可以用 ERC20 代币来表示流动性。但在 UniswapV3 中,添加了对价格区间的限制,使得每次添加的流动性都是独一无二的。因此,用 ERC20 来表示流动性已经不适用,而使用 ERC721 就非常合适了。每次添加的流动性也被称为“头寸(position)”,因此用一种独立的 NFT 来表示就很合理。
UniswapV2 的交易对只有一个流动性池,并且交易手续费率是统一的千分之三。甚至在 UniswapV3 的最开始版本,它也只有一个费率,分别是 0.05%,0.3% 和 1%。然而,在 2021 年 11 月,通过 DAO 治理,UniswapV3 进一步增加了 0.01% 的费率。
在 UniswapV2 中,还有一个协议手续费,和交易手续费一样,是基于全局设定的费率。如果打开了协议手续费,你可以得到交易手续费的 1/6。然而,UniswapV3 中的协议费率就更灵活了,它不再是固定的 1/6,而是可以配置为 1/N 或 0。而且,每个池子还可以设定不同的协议费率。比如,A 池设为 1/6,B 池设为 1/8,C 池设为 0。
价格预言机方面也有所改进。我们之前在区块链预言机章节中已经介绍了 UniswapV2 和 UniswapV3 的预言机。这里,补充一点,在 V2 中,记录了价格的累加值,使用时进行时间间隔除法运算,这是算术平均的一种形式。而 V3 累加的是 log(price, 1.0001),也就是价格的幂值,使用时还需要除以时间间隔,这是几何平均的一种形式。从几何平均角度看待价格,更能准确地反映实际情况,也更不容易受到短期波动的影响。另外,使用几何平均能极大地节约 gas,因为合约中记录了 tick 的序号,它是整数类型,直接计算更加高效。
在代码方面,UniswapV3 的架构与 UniswapV2 的变化并不大。
-
v3-core:核心合约
-
v3-periphery:边缘合约
v3-core 包含了两个核心合约:
-
UniswapV3Factory:工厂合约
-
UniswapV3Pool:流动性池子合约
v3-periphery 也包含了两个核心合约:
-
NonfungiblePositionManager:头寸管理合约
-
SwapRouter:交易路由合约
与 UniswapV2 不同的是,在 UniswapV3 中,不再将添加流动性、移除流动性和交易兑换的所有功能放在一个 Router 合约中,而是将流动性相关的功能移到一个独立的 NonfungiblePositionManager 合约中,而 SwapRouter 只用于交易入口。
相信以上内容已经给你提供了不少关于 UniswapV3 的有趣见解。接下来的文章中,我们将依次详细介绍这四个核心合约,敬请期待!
We will continue to update 算娘; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles





