LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 《UniswapV3Core白皮书(中文版)

《UniswapV3Core白皮书(中文版)

2021-04-09 hotpot_fund 来源:区块链网络

概要

UniswapV3是建?在以太坊区块链上,?套不受监管的?动做市协议。与协议的早期版本相?,UniswapV3为做市商提供了提?资?利?率、以及主动调控资?分布的能?,提?了价格预?机的准确性和?便性,并具备更灵活的?续费结构。

1介绍

?动做市商(AMMs)是通过汇聚流动性,以算法为交易者完成交易提供服务。恒定函数做市商(CFMMs),即更?义的?动做市商(AMMs)(Uniswap是AMMs中的?员),已经在去中?化?融中得到了?泛应?,它的典型?例是在?需许可的公共区块链上,通过智能合约实现代币交易。

?前的恒定函数做市商(CFMMs)普遍资?利?率偏低。在UniswapV1和V2的恒定乘积公式中,在给定价格时,流动池中只有部分资?发挥了作?。这是低效率的,尤其是当交易总是围绕着某个价格?幅波动的时候。以前解决资?利?率问题的尝试,?如Curve和YieldSpace,通过使?不同的函数来描述

流动池中资产之间的关系。这就要求在给定流动池中,所有的做市商遵守单?的公式,如果做市

商希望在不同的价格范围提供流动性,则可能导致流动性分散。

在本?档中,我们全?介绍了UniswapV3,?种新的?动做市商(AMM),它使得做市商能

更好地控制其资?使?的价格范围,?且仅对流动性分散和Gas费?产?有限的影响。这些设计

与代币价格?关,不依赖于对价格的任何假定。UniswapV3与其早期版本?样,基于相同的恒

定乘积算法,但提供了?个重要的新特性:

(1)聚焦流动性(ConcentratedLiquidity):做市商(LPs)有能?通过将流动性“限定”在任意价格范围内来聚焦流动性(早期版本提供的是()的所有价格范围。)。这提?了流动池的资?效率,允许做市商接近其钟意的资产曲线,同时能与流动池中其它?提供的流动性

有效集成。在第2章对本特性作了描述,第6章阐述了如何实现聚焦流动性。

(2)灵活的?续费:?续费不再仅限于0.3%。每个交易对的费率在初始化时设置(每个交易对可以有多种费率)(3.1?节)。初期?持的费率有0.05%,0.30%,和1%。UNI治理可以增加新的费率设置。

(3)协议费治理:UNI治理在协议费占?续费?例的设置??,拥有更多的灵活性(6.2.2?节)。

(4)增强的价格预?机:UniswapV3为?户提供?种查询最近价格累计值的?法,避免在度量TWAP时,需要精确指定开始和结束时间来获取累计值(5.1?节)。

(5)流动性预?机:合约提供?种时间加权平均的流动性预?机(5.3?节)。UniswapV2核?合约设计成不能升级,所以UniswapV3完全由?套新合约实现。UniswapV3核?合约也不能升级,除了治理可以调整部分参数(?第4章)。

2 聚焦流动性(ConcentratedLiquidity)

UniswapV3的核?理念是聚焦流动性:在指定价格区间内提供流动性。

在早期版本中,流动性沿下列公式均匀分布:

(2.1)

其中和是两种代币X和Y的数量,是常量。换?之,早期版本的设计是在的整个价格范围内提供流动性。这利于实现,并且允许有效地汇聚流动性,但意味着流动池中?部分资产永远不会被利?。

考虑到这?点,允许做市商在?个??的价格区间内聚焦他们的流动性,是合情合理的。我们将聚焦到有限价格区间的流动性称作:?个头?(aposition)。?个头?只需要在它的价格区间内维持?够资?以?持交易,因此在保持恒定乘积算法不变的情况下,可以在该价格区提供更?的资?量(我们称之为:虚拟资产)。

该曲线是公式 2.1 的平移,使其头?在价格区间内清晰可?(图2):

做市商可以在他们认为合适的价格区间,创造任意数量的头?。这样,做市商就可以在价格空间上近似地得到他们所期望的流动性分布 (参?图3,给出了?些案例)。此外,这也是?种机制:让市场决定流动性应该如何分布。理性的做市商可以通过将流动性聚焦在当前价格的狭窄区间内,在价格波动时增加或移除代币来保持流动性处于激活状态,从?提?资?效率。

2.1 限价订单 (Range Orders)

价格区间设置较?的头?,表现得类似限价订单——如果超出价格区间,头?从完全由?种资产组成,转变为完全由另?种资产组成 (加上累积的?续费)。这?的限价订单和传统限价订单有两点差异:

(1)价格区间的狭窄度是有限的。当价格处于该价格区间内时,限价订单会被部分执?。

(2)当超出头?的价格区间时,它需要被提取出去。否则,当价格重新落回或回穿区间,头??

会被交易回去,资产类别将再次被逆转。

3 架构更改

Uniswap V3 做了很多架构更改,其中?些是为了包含聚焦流动性必需的,其中?些是独?

的改进。

3.1 ?个交易对多个流动池

在 Uniswap V1 和 V2 中,每个交易对对应单??个流动池,所有的交易都统?收取 0.30%的?续费。

尽管这?默认的?续费率过去对?多数代币都?够有效,但对于某些流动池显得过? (?如,2种稳定币组成的流动池),?对于某些流动池显得过低 (?如,波动剧烈或很少交易的流动池)。

Uniswap V3 为每个代币交易对引?了多个流动池,每个流动池有不同的?续费率。所有的流动池都是由同?个??合约创建的。??合约初始允许?三种?续费率创建流动池:0.05%、0.30% 和 1%。UNI 治理可以启?其它?续费率。

3.2 ?法互换的流动性 (Non-Fungible Liquidity)

3.2.1 ?复利?续费 (Non-Compounding Fees)

在早期版本中,赚取的?续费是作为流动性存在流动池中的。这意味着,即便没有追加投资,池内的流动性也会随着时间推移?不断增加,?续费是复利收益。在 Uniswap V3 中,由于头?的不可替代特性,这已经不可能了。取?代之的,?续费收益是以?付?续费的代币?式被单独存放 (参? 6.2.2 ?节)。

3.2.2 取消ERC-20代币

在 Uniswap V1 和 V2 中,流动池合约同时也是?个 ERC-20 代币合约,其代币代表在流动池中持有的流动性。虽然这很?便,但它其实与 Uniswap V2 的理念不太?致,即任何不需要在核?合约中实现的内容,都应该在外围合约中实现,并且?个规范的 ERC-20 实现,不?励创建改进的 ERC-20 代币封装合约。按理,ERC-20 代币应该作为核?合约中某个流动性头?的封装,在外围合约中实现。

Uniswap V3 所做的更改,使完全可替换的流动性代币变得不可能。由于定制流动性供应的特性,现在收取?续费的?式是单独存放的代币,?不是在流动池中?动重投的流动性。所以,在 V3 的流动池合约中没有实现 ERC-20 标准。任何?都可以在外围合约中创建?个ERC-20 代币,使某个流动性仓位可以被替换,但它需要额外的逻辑来处理?续费的分布和重投。或者,任何?都可以创建?个外围合约,将某个流动性仓位 (包括赚取的?续费) 封装成?个 ERC-721 代币。

5 预?机升级

Uniswap V2 引?了时间加权平均价格 (TWAP) 的预?机,Uniswap V3 对其做了3处重要的升级。

最重要的是,Uniswap V3 不再需要?户从外部跟踪累加器的先前值。Uniswap V2 需要?户在?个时间段的开始和结束时,分别记录累加器的值,来计算时间加权平均价格。Uniswap V3把累加器记录放在核?合约中,从?允许外部合约?需记录累加器的值,直接在链上计算最近?段时间的加权平均价格。

另?个改变是,Uniswap V2 是累计价格和,从?允许?户计算时间加权的算术平均价格。? Uniswap V3 跟踪的是价格的对数 (价格的对数值) 和,从?允许?户计算时间加权价格的?何平均。最后,在价格累加器之外,Uniswap V3 增加了?个流动性累加器。流动性累加器可以被其它合约使?,?于确定某个交易对的哪?个流动池 (参? 3.1 ?节),有最可靠的时间加权平均价格。

5.1 预?机观察值 (Oracle Observations)

和 Uniswap V2 ?样,Uniswap V3 在每个区块的开始运??个价格累加器,乘以?上?个区块以来过去的秒数。?个 Uniswap V2 的流动池,仅存储该价格累加器的最近值——即,最后?次发?交易的区

块中的值。

因此,在 Uniswap V2 中计算平均价格时,外部调?者需要提供价格累加器的前?个值。对于很多?户??,每个?户都必须要有??的?法记录累加器的前?个值,或者协调?个共享的办法来降低费?。?且也没办法保证累加器能忠实反映流动池被调?的每?个区块。

在 Uniswap V3 中,流动池存储?个累加器值的列表。它通过每?个区块中?次调?流动池时,?动检查累加器的值来实现。该列表类似于?个循环缓冲区,通过在?个数组中循环,最旧的值最终被最新的值覆盖。虽然该数组最初只有存放?个值的空间,但任何?都可以初始化额外的存储插槽来扩展该数组,直到存储多达 65,536 个值 ( 最大 65,536个观察值,假定每13秒1个区块,每个区块都需要存值,都允许存放至少9天的价格 )。任何希望该交易对存放更多值的?,只需要承担?次为扩展该数组,初始化额外存储插槽的 gas 消耗。流动池开放该观察值数组给?户,同时提供?个?便的函数,以供?户查询在累加器存放时间周期内,任意时间点的值。

5.3 流动性预?机

除了时间加权平均价格,Uniswap V3 还在每个区块的开头,跟踪累计了当前的 值(在当前价格区间的虚拟流动性)。 链上其它合约使?它,可以使价格预?机更加健壮 (例如,在判断使?哪种?续费率的流动池作为价格预?机时)。流动性累加器的值和价格累加器同时存储。

6 聚焦流动性的实现

本节描述聚焦流动性如何?作,以及在合约中实现聚焦流动性的原理。

6.1 价格刻度( Ticks )和价格区间( Ranges )

为了实现聚焦流动性,流动池可以提供的价格是由?系列离散的价格刻度( ticks )标记。做市商可以在任意两个价格刻度之间提供流动性(不相邻的两个刻度)。

每当价格越过?个已初始化的刻度,虚拟流动池将被移进 ( kick in ) 或移出 ( kick out )。越过?个已初始化刻度的 gas 开销是恒定的,与该刻度被移进/移出的头? ( positions ) 数量?关。

当刻度被越过时,为保障移进/移出正确数量的流动性,以及每?个区间内的头?都能获得相应份额的?续费,需要在流动池中进?某种计量。流动池合约使?存储变量保存状态,包括全局

6.2 全局状态变量

合约中的全局状态有7个存储变量,与交易和流动性份额相关。(还有?些?于预?机的存储变量,如第5节所述。)层?、每刻度层?,以及每头?层?。

6.2.4 初始化刻度图 (Tick Bitmap)

如果某个刻度没有被?作任何区间的端点,也即没有投?流动性——该刻度就没有被初始化——该刻度在交易时可以被跳过。为使寻找下?个已初始化的刻度效率更?,作为?个优化流动池保存?个已初始化刻度的位图 tickBitmap 。如果刻度已初始化,位图中该刻度下标的对应值设为1,未初始化设为0。

如果?个刻度被?作?个新头? (position) 的端点,且该刻度还没有被其它流动性使?,刻度将被初始化,刻度图中相应 bit 位被设为1。1个已初始化的刻度,如果以其为端点的所有流动性都被移除,则该刻度重新回到未初始化状态,刻度图中相应 bit 位重新设为0。

6.3 每刻度的状态变量

合约需要保存每个刻度的信息,保存总的流动性数量,当越过刻度时应该被添加或移除的数量,以及在刻度之上或之下获得的?续费。

合约保存了4个以刻度下标为键值的键值对:

—-

编译者/作者:hotpot_fund

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...