{"content":{"title":"剖析DeFi交易产品之UniswapV3：概述篇","body":"文章首发于公众号：[Keegan小钢](https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652494655&idx=1&sn=864b1c8767655f12179d492e7f35eafa&chksm=8b68512fbc1fd839ef937a081193f2cb4fe7eb0393839a17bd9adbe8547185ed5648979d114e&token=2071110718&lang=zh_CN#rd)\r\n\r\nUniswapV3 于 2021 年 5 月上线，相比 UniswapV2，改动很大，也变得复杂很多，最主要的有以下这几点改动：\r\n\r\n- 引入了**集中流动性（Concentrated Liquidity）**机制\r\n- LP Token 改为了不可互换的 NFT\r\n- 每个交易对可以有多个不同费率的池子\r\n- 协议手续费治理更灵活\r\n- 改进了价格预言机\r\n\r\n其中，最核心的改动就是引入了集中流动性机制。所谓集中流动性，主要是说**流动性提供者（LP）可以将其提供的流动性”限制“在任意价格区间内来”集中“其流动性**。从直观上来说，UniswapV3 中，用户添加流动性的时候，需要设置一个价格区间，如下图所示：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/11/xswchnmY6545a1259c9d0.png)\r\n\r\n默认时这个价格区间是全范围，即 **(0, ∞)**。LP 可以自己修改低价和高价为任意值，即 LP 可以设置自己要提供的一个价格区间。而设置了有限的价格区间后，那提供的该流动性也只有在该价格区间内才有效。为了更好理解，下面举个例子说明一下。\r\n\r\n有两个LP，A 和 B，分别在不同价格区间提供了流动性，A 在区间 (1000, 2000) 内提供了流动性，而 B 则在区间（2000, 3000）内提供了流动性。那当交易价格为 1500 时，发生的交易只会和 A 所提供的流动性进行交易，交易手续费也归 A 所有，而 B 提供的流动性不参与任何交易，也得不到任何手续费。不过，当价格上涨到 2500 时，进入到了（2000, 3000）的价格区间，这时候发生的交易则只会和 B 所提供的流动性进行交易，交易手续费也归 B 所有了，而 A 的流动性则变成无效了，也得不到手续费了。当价格又跌回到 (1000, 2000) 区间时，A 的流动性又再次变为有效，而 B 的流动性又再次变为无效。\r\n\r\n集中流动性机制，会使得大量 LP 的流动性聚合在包含当前价格的区间内，能有效提高池子的资金利用率。比如下图为 USDC/ETH 的流动性分布：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/11/5c6ha4vq6545a153ac0a2.png)\r\n\r\n大部分流动性集中在了当前价格附近，这也是大部分池子都比较常见的状态。\r\n\r\n不过，集中流动性机制，实现起来其复杂度也大幅增加，背后的数学原理也不太容易理解，还引入了其他概念，比如 tick。\r\n\r\n因为在 UniswapV3 中，LP 提供的流动性是分为多个不同区间的，那为了方便计算不同区间的流动性和手续费分配，UniswapV3 就将整个价格范围划分为了多个离散的价格点，这些**价格点**就称为 **tick**，每个价格点 tick 都对应于一个实际价格，两者的关系可以表示如下：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/11/mOZj5lA06545a16d51943.png)\r\n\r\n该公式表明了，当 tick 为 0 时，价格为 1；当 tick 为 1 时，价格为 1.0001；当 tick 为 2 时，价格为 1.0001^2。也即是说，相邻价格点之间的价差为 0.01%。当然，tick 也可以为负值，为负值时表明价格 p 小于 1。\r\n\r\nUniswapV2 添加流动性时，两个代币的价值是相等的。直到你移除流动性时，两个代币的价值依然也是相等的。但在 UniswapV3 中则不是，我们以下图为例进行说明：\r\n\r\n![image.png](https://img.learnblockchain.cn/attachments/2023/11/Ax4Ei93M6545a1861bcd3.png)\r\n\r\n上图中，ETH/USDC 当前价格为 1806.97，待添加的流动性价格区间为 (1699, 1900)。然而，可以看到，当要添加 1 ETH 时，对应需要添加的 USDC 并不是当前价格的数量 1806.97，而是达到了 2184.99，两个代币的价值是不相等的。另外，添加流动性之后，如果 ETH/USDC 的价格下跌，你流动性里的 ETH 会增多，USDC 则减少；反之，如果价格上涨，则你流动性里的 ETH 会减少，USDC 会增多。\r\n\r\n基于这种特性，还可以实现**限价单**功能。比如，假设 ETH 当前价格为 2500，用户觉得价格可能会跌到 2000 以内，那就可以在 2000 附近设置一个很短的区间，比如设置（1999, 2000）。这时候，因为整个价格区间都低于当前价格，用户提供的流动性只需要充值 USDC 一种资产即可。这时候，相当于用户挂了一个价格为 2000 的限价买单。当价格跌下来，进入了（1999, 2000）这个价格区间的时候，有人交易时就会将该区间内的 USDC 换成 ETH（实际其实为 WETH），直到价格完全穿过价格区间的上限，那池子里的所有 USDC 都被换成了 ETH。这时候，用户撤走流动性，就相当于之前所挂的限价买单成交了。不过，与传统的限价单相比，有两点需要注意：\r\n\r\n* 如果价格不能穿过整个价格区间，那就只有部分 USDC 会被换成 ETH\r\n* 转换完成后，需将流动性移除，否则一旦价格又回到该价格区间，那池子里的 ETH 会被交易换回 USDC\r\n\r\nUniswapV2 中的流动性是整个池子共享的，每个人占有多少流动性可以用份额来表示，而份额是可以互换的，所以可以用 **ERC20** Token 来作为流动性代币。但 UniswapV3 中，流动性增加了价格区间的限制之后，就不再是共享的了，每一次添加的流动性都基本是独一无二的，因此，已经不适合继续使用 **ERC20** 来作为流动性代币，但使用 **ERC721** 却非常合适，每一次添加的流动性也称为一个**头寸（position）**，就用一个单独的 **NFT** 来表示。\r\n\r\nUniswapV2 中，每个交易对有且仅有一个流动性池，且交易手续费率都是统一的千分之三。但 UniswapV3 可以为同个交易对创建不同费率的池子，即 **token0**、**token1** 加上 **fee** 三个字段组成了一个 Pool 的唯一性。一开始的时候支持了 0.05%, 0.3% 和 1% 的费率，之后在 2021 年 11 月时通过 DAO 治理又增加支持了 0.01% 的费率。\r\n\r\nUniswapV2 中，还有一个协议手续费，和交易手续费一样，也是一个基于全局的费率，如若打开收取协议手续费的话，则可获得交易手续费的 1/6。而 UniswapV3 的协议费率设置更灵活，不再是固定的 1/6，而是 1/N 或 0，其中，N 是可配置的，范围为 4 <= N <= 10。而且，还可以基于每个池子设置不同的协议费率。比如，可以设置 A 池为 1/6，B 池设为 1/8，C 池则为 0。\r\n\r\n价格预言机也做了升级，之前讲区块链预言机章节中已经介绍过 UniswapV2 和 UniswapV3 的预言机。这里主要再补充一点，V2 的方式是直接记录价格的累加值，使用时再除以时间间隔，这是一种算术平均。而 V3 累加的是 `log(price, 1.0001)` 也就是价格的幂，使用时再除以时间间隔，这是几何平均。几何平均数相比算术平均数，能更好的反应真实的价格，受短期波动影响更小。另外，使用几何平均，也是因为合约中记录了 tick 序号，序号是整型，且跟价格相关，所以直接计算序号更加节省 gas。\r\n\r\nUniswapV3 在代码层面的架构和 UniswapV2 的变化则不大，合约层面，主要还是两个库：\r\n\r\n* **v3-core**\r\n* **v3-periphery**\r\n\r\n**v3-core** 的核心合约就两个：\r\n\r\n* **UniswapV3Factory**：工厂合约\r\n* **UniswapV3Pool**：流动性池子合约\r\n\r\n**v3-periphery** 的核心合约也是两个：\r\n\r\n* **NonfungiblePositionManager**：头寸管理合约\r\n\r\n* **SwapRouter**：兑换路由合约\r\n\r\n与 UniswapV2 不同，不再由 Router 合约作为添加流动性、移除流动性和兑换交易的全部入口，而是把流动性相关的功能放到了单独的合约 NonfungiblePositionManager，而 SwapRouter 主要只用于交易入口。\r\n\r\n后续文章我们会依次讲解下这四个核心合约。"},"author":{"user":"https://learnblockchain.cn/people/96","address":null},"history":null,"timestamp":1699062274,"version":1}