{"content":{"title":"Uniswap V3 白皮书","body":"# Uniswap V3 白皮书\r\n## 1. 简介\r\n        Uniswap v3 是为以太坊虚拟机实施的⾮托管⾃动化做市商。与早期版本的协议相⽐，Uniswap v3 为流动性提供者提供了更⾼的资本效率和微调控制，提⾼了价格预⾔机的准确性和便利性，并具有更灵活的费⽤结构。\r\n        在本⽂中，我们介绍了 Uniswap v3，这是⼀种新颖的 AMM，它使流动性提供者可以更好地控制其资⾦使⽤的价格范围，⽽对流动性分散和 gas 效率低下的影响有限。\r\n## 2.AMM自动做市商\r\n        Uniswap通过自动做市商模型，使得每个用户都能通过投入ERC20代币提供流动量，提供流动性的用户称为LP。\r\n### 2.1 Uniswap 2.0版本     \r\n       在v2.0版本的做市商函数为：x * y = k，k为固定值，x和y分别代表两种代币的数量。首先我们的LP需要提供流动性需要按照两种代币价值各50%提供，例如提供价格10美元的代币x数量为10，同时就需要提供价格1美元的代币y数量为100，保证代币兑换数量充足。\r\n        \r\n![截屏2022-09-23 22.01.42.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/AyzlM6WG632dcb46b76f7.png)\r\n        \r\n        假如此时x\/y交易对的池子有代币x的数量为100，代币y的数量为1000，则k = 100000，此时如果有用户想用10x兑换y，则由公式我们可以算出兑换的y的数量，（100 + 10）* （1000 - dy） = k，那么我们就可以求解出兑换的出来的 dy = 1000 -（ 100000 \/ 110） = 90.909090\r\n       V2.0这种模型可以提供0到正无穷的流动性，但是现实中很少有人愿意以远低于市场价格的兑换率来进行兑换，人们只愿意在一定比例内进行x和y的兑换，导致实际上上只有一小部分的x和y在进行兑换，大部分的代币可能并没有进行流通，资本效率较低。\r\n### 2.2 Uniswap 3.0版本\r\n       V3.0的模型引入了Lp可以自定义流动性的设置，可以为流动性的提供者提供更加高效精准的资本效率，模型为(𝑥 +𝐿√𝑝𝑏) (𝑦 + 𝐿√𝑝𝑎) = 𝐿 * 𝐿，L为固定值，Pb和Pa代表的是当前a点和b点价格。pa = ya\/xa，即在a点y点数量除以x的数量。\r\n       \r\n![image.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/HcJSmFVa632dcd73279cb.png)\r\n        \r\n        我们可以看到黄色的线就是LP实际提供的代币数量关系曲线，即LP希望在一定价格范围内提供流动性，而超出价格则不提供流动性。对于单个用而言提供的流动性就是黄色这条线，而实际按照模型计算时曲线是上图的蓝色曲线，那么为了符合模型则协议会给代币x和y加上一个常量，可以理解为一种变相的加杠杆。2.0的模型x * y = k ，x和y是用户提供的代币数量，3.0则为 (𝑥 + 𝐿 \/ √𝑝𝑏) (𝑦 + 𝐿 * √𝑝𝑎) = 𝐿 * 𝐿，同样x和y是代表LP提供的实际代币数量，不同点在于模型加上了一个常量。\r\n        那么这个常量是如何计算的呢，首先我们知道 价格 P = y \/ x（注意此时点y和x的代表的是蓝色曲线上的代币数量，并非实际用户提供的代币数量，在模型内 x = x0 + x1，x0是Lp实际提供的代币数量，x1是常量参数）L = √x * √y，那么结合两个公式我们可以得到  x = L \/ √p ，y = x * √p ，所以带入b点价格Pb，而且在b点时实际上对应黄线上的点我们可以看到实际上用户提供的代币只有y，没有代币x了即x0 = 0，由x = x0 + x1 = L \/ √pb ，那么参数x1 = L \/ √pb。同理带入a点，我们也可以得到 参数 y1 = L * √pa。\r\n        3.0相较于2.0的模型的优势在于：Lp可以自定义流动性的范围，选择他们认为适合的头寸。由于实际上市场时的流通性往往集中在一定的价格区间内，开放这样功能相当于让市场决定流动性分布到哪里。Lp可以通过将价格集中在分布在当前价格的窄带里面，并随着价格的变动添加和移除代币以保持其流动性活跃，从而降低资本成本。\r\n![image.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/aBBnIQYf632e60f433e85.png)\r\n        \r\n        对于整体池子而言则需要把所有用户的流动性进行整合，不同的用户选择的价格区间不同就会导致不同价格区间的流动性不同。如上图所示，在V2版本中流动性范围在在⽐(0, ∞）之间，V3中对于单个用户的流动性在pa 和 pb 之间，对于整个池子而言由于不同区间提供的流动性时不同的所以就会呈现成每个价格区间的流动性有高有低，流动性的大小和分布的是由市场决定。LP在每个价格区间提供的代币数量支撑这个价格区间的流动性，Lp投入的代币越多，交易频次越高，LP获取的手续费就越高。（在交易频次越高的价格区间提供流动性，虽然获取的手续费会越高，但是同时也存在无偿损失风险也越高）。\r\n ## 3.架构变化\r\n ### 手续费\r\n     在V1、V2中代币对池子中统一收取的手续费为0.3%，虽然这个默认费⽤等级在历史上对许多代币来说都⾜够好，但对于某些池（例如两个稳定币之间的池）来说可能太⾼了，⽽对于其他池（例如包含⾼度波动或很少交易的代币的池）来说可能太低了。uniswap V3为每个代币对引入多个池子，每个池子有不同的交易费用。所有池子都是由同⼀个⼯⼚合约创建的。⼯⼚合约最初允许以三个费⽤等级创建矿池： 0.05%、 0.30% 和 1%。 UNI 治理可以启⽤额外的费⽤等级。\r\n     在早前的版本中赚取的费⽤作为流动性持续存⼊池中。这意味着即使没有明确的存款，资⾦池中的流动性也会随着时间的推移⽽增⻓，⽽且费⽤收⼊也会增加。在 Uniswap v3 中，由于头⼨的不可替代性，这不再可能。相反，费⽤收⼊单独存储并作为⽀付费⽤的代币持有。\r\n### 原生代币\r\n     V3中移除原⽣流动性代币。在 Uniswap v1 和 v2 中，矿池合约也是 ERC-20代币合约，其代币代表矿池中持有的流动性。虽然这很⽅便，但它实际上与Uniswap v2 的理念相⽭盾，即任何不需要在核⼼合约中的东西都应该在外围，并且⽀持⼀个规范的ERC-20 实施会阻碍创建改进的 ERC- 20 个代币包装器。可以说，ERC-20 代币实施应该在外围，作为核⼼中单个流动性头⼨的包装器合同。\r\n     Uniswap v3 中所做的更改通过使完全可替代的流动性代币成为不可能来解决这个问题。由于⾃定义流动性提供功能，费⽤现在由池作为单独的代币，⽽不是作为流动性⾃动再投资于池中。因此，在 v3 中，矿池合约没有实现ERC-20 标准。任何⼈都可以在外围创建 ERC-20 代币合约，使流动性头⼨更具可替代性，但它必须有额外的逻辑来处理收取的费⽤的分配或再投资。或者，任何⼈都可以创建⼀个外围合约，将个⼈流动性头⼨（包括收取的费⽤）包装在 ERC-721 不可替代代币中。\r\n ## 4.治理\r\n     ⼯⼚有⼀个所有者，最初由 UNI 代币持有者控制。所有者没有能力停⽌任何核⼼合约的运行。与 Uniswap v2 ⼀样，Uniswap v3 有协议费⽤，可由UNI 治理开启。在 Uniswap v3 中，UNI 治理在选择进⼊协议的交换费⽤⽐例⽅⾯具有更⼤的灵活性，并且能够选择 4 ≤ N ≤ 10 或 0 的任何⽐例。这个参数可以在每个池的基础上设置。\r\n     UNI 治理还可以添加额外的收费层次。当它添加一个新的费用层时，它还可以定义与该费用层对应的 ticSpaces 。一旦一个费用层被添加到工厂，它就不能被删除(并且 ticSpaces 也不能被更改)。支持的初始费用层次和刻度间距为0.05% (刻度间距为10，可初始化刻度之间约为0.10%) ，0.30% (刻度间距为60，可初始化刻度之间约为0.60%)和1% (刻度间距为200，刻度间距约为2.02% 。\r\n     最后，UNI 治理有权将所有权转移到另一个地址。\r\n## 5.预言机升级\r\n        Uniswap v3对于V2引入的时间加权平均价格（TWAP）预言机有三项重大改变。最重要的是Uniswap v3消除了预言机用户在外部跟踪累加器先前值的需要。v2要求用户在他们使用的时间段的开始和结束时检查累加器值，如果想要计算TWAP。Uniswap v3将累加器检查点加入协议代码，允许外部合约在最近期间在链商计算TWAP，而无需存储累加器值的检查点。\r\n        在v2中求一段时间内的平均价格为（当前累计价格 - 之前累积价格） \/ 时间间隔 即 （p1 - p2）\/ （t1 - t2）但是由于v2中并没有保存历史价格，需要用户提供历史价格才能算出平均价格。v3则在一个区块中最多可以存储65535个价格，但额外的价格存储空间需要用户支付gas费用。而v3中算平均价格与v2的算术平均数不同，采用的几何平均数。首先我们要知道在v3中价格并不是直接存储数字的，而是用1.001的几次方表示,这个几次方我们称之为ticks刻度，为了便于管理和计算，价格范围并不是完全有用户自定义的，而是按照几刻度进行计算得出。那么 价格 Pi = 1.001 的 i 次方。 此时我们要计算平均价格其实是计算 i 的平均值。i = log1.0001 （Pi）所以我们算平均价格如下图\r\n        \r\n![image.png](https:\/\/img.learnblockchain.cn\/attachments\/2022\/09\/LOh8Tg3c632eab1e390ee.png)"},"author":{"user":"https:\/\/learnblockchain.cn\/people\/10154","address":null},"history":null,"timestamp":1664025259,"version":1}