TOKEN:Joe V2:也许是未完成的「Uniswap V4」应有的模样

1.前言

由于Arbitrum近期空投活动的火热,随之产生巨量的$ARB链上交易。UniswapV3早早布局Arbitrum,自然是有先发优势。而TraderJoeV2的横空出世,伴随着$ARB的空投活动,一跃成为$ARBTokenUsage榜上的第二大DEX。甚至在3月的最后一个星期,JoeV2池一度占据了近45%的ETH-ARB币对的交易量,超越了UniswapV3的池,成为了该币对交易量占有率最高的单池。而本文并不会花费大量篇幅讨论JoeV2为何能在$ARB交易中获取大量份额,而是着重从JoeV2的AMM机制设计和技术实现入手,试图分析其产品的优势与不足。

2.特性分析

我们都知道UniswapV3构建的一套通过手续费收入和限价流动性博弈而提高资金利用效率的AMM机制。JoeV2在此基础上进行了以下革新,引入了一种新的AMM模型——LiquidityBook:

垂直方向的流动性分布:UniswapV3的限价流动性本质上是水平方向上「平铺」在LP设定的价格区间内;而JoeV2则是在垂直方向上「堆叠」LP提供的限价流动性。「bin」作为流动性分布的单元:如果说UniswapV3中「tick」这一概念,可以形象地理解为流动性价格标尺上的「刻度」;那么JoeV2中的「bin」在这里可以理解成储存流动性的箱子。类ERC1155的LBToken:由于上面提到的流动性分布单元和方式,所以JoeV2基于ERC1155构建了一套流动性凭证体系——LBToken,同一个bin内的流动性是同质化的,而不同的bin中的流动性彼此区别。流动性分布可策略化:正是因为ERC1155这种半同质化的LBToken属性加上垂直的流动性分布方向,使得JoeV2的LP可以按照一定的策略来部署自己的流动性,而不是简单地均分在bin上。动态的手续费定价算法:swap手续费动态定价,这使得LP在市场经历高波动性时可以收取更高的费用,在某种程度上通过手续费来博弈单边行情,从而对冲LP在高波动率行情下的无常损失。

接下来本文将进一步讨论上述这些特性的实现机制,以此帮助读者更好地理解JoeV2与其他DEX的异同。

2.1流动性分布与价格曲线

我们知道自动做市商,AMM(AutoMarketMaker)中的流动性分布决定了特定价格下交易对两侧的相对数量,币对的相对数量又决定了池内当下的兑换比例,兑换比例即为大家所理解的「价格」。

JoeV2中所设计的流动性账簿(LiquidityBook)将交易对的流动性安排成离散的「bin」。而注入bin的流动性按照该bin定义的固定汇率进行兑换。换言之,单个bin内的流动性兑换遵循x+y=k的恒定和AMM模型。

如上图,单个bin内的流动性遵循P?x+y=L的线性关系。x是该bin内X资产的数量,y是该bin内Y资产的数量,P是该bin对应的价格,L则为该bin内的流动性数量。

值得注意的是,上图中的「恒定和曲线」与x轴和y轴是有交点的,这意味着X或Y资产在一定交易量下是可以被消耗掉的。在这种情况下,当前价格会移动到下一个bin。

某一交易对市场是其所有离散的流动性bin的聚合结果,一个市场内只能有一个同时包含X和Y的bin-在Joe中,被命名为ActiveBin(活跃价格区间),我们可以将其理解为该交易对当下的现货兑换比例。而所有在活跃区间右侧的区间都只包含X资产,所有在左侧的区间都只包含Y资产。

举一个简单例子,AVAX/USDC池。资产Y为USDC,资产X为AVAX。价格P由每个AVAX可兑换USDC的数量决定。如果此时ActiveBin为100USDCperAVAX;所有在左侧的区间都只包含USDC,而所有在右侧的区间都只包含AVAX。如果市场内此时交易者大量购买AVAX,那么当100USDC内的AVAX储备被消耗完时,ActiveBin将向右移动。

2.2流动性凭证代币LBToken

如上面所提到的,LiquidityBook聚合流动性的方式与UniswapV3不同:在LiquidityBook中,通过每个bin垂直聚合流动性,在UniswapV3中,流动性则是呈水平聚合。

也正是因为LB垂直聚合流动性这一特性,使得同质化流动性代币成为可能。我们姑且不说同质化流动性代币在gas上的种种优势,其对于协议中手续费计算和整个账务系统复杂度的轻量化也带来了更多可能性。

虽然说LBToken合约遵循ERC-1155多代币标准,而参量id即为该流动性所在的bin的索引(index),所以同一bin所对应的LBToken是同质化的。从其合约代码中,我们可以发现:LBToken的实现与ERC1155标准代币大致相似,主要区别在于它不会对接收方合约进行任何调用以防止重入攻击。同时由于其仅用于流动性计数,所以并未实现URI相关的函数。

2.3Binid与Price之间的换算

JoeV2内置的价格区间为,这个价格区间被分割成一个个离散的价格点,每个价格点对应了一个流动性容器Bin,而决定分割精度的离散参数为s,s越小,Bin就越多。

JoeV2协议设定Bin的总数量为2*Nb,即价格为1以上的Bin和价格1以下的Bin各有Nb个,则有公式:

Nb=argmaxi((1+s)i<2128)

除了价格的限制,协议还限制了Bin的总数量不得超过224个,也就是说Nb最大为223

通过计算,我们可以得到s的最小值为2(0.5^16)-1,从而我们可以得到Binid范围为,其中b=223。

这里我们举个简单的例子演算一遍:

当s?=?0.0001时,

Nb=argmaxi((1+0.0001)i<2128)=887272

则BinId为一组(223-887272)?~?(223+887272)的连续正整数,即Binid?∈?。

Price与Binid一一对应,符合以下的数学关系:

Price?=?1.0001

所以,Price的范围应该是:

1.0001-887272≤Price≤?1.0001887272

显然,当Binid?=?8388608时,

Price?=?1.0001?=?1

在库合约TreeMath中,为了优化流动性跟踪,Bin通过一个由三个256位数组嵌套创建的数据树来索引。在这棵树中,每个Bin被分配了一个通过嵌套数组的位置路径。当一个Bin内包含流动性,其对应的三个数组会被分配一个非零值。

金色财经现场报道Emotiq首席执行官Joel Reymont:智能合约是用户与区块链的接口:金色财经前方记者实时报道,第二届全球金融科技与区块链中国峰会于4月12日在上海召开,CEmotiq首席执行官Joel Reymont在峰会上表示,智能合约语言其实就是一个接口,也就是你和区块链的接口。但是现实存在的问题是,目前智能合约的语言非常复杂,编程起来也比较困难,而且还存在很多漏洞,黑客可以利用这些漏洞来偷取加密货币。而我们要做什么呢?我们会不会有更加专业化,或者去培育更加专业化的程序员,把这个事情做对。我觉得这个可能不太现实。我们想要区块链能够让大家共享的,但是我们却给区块链接入创造了一些障碍,但是我们还是有一丝希望存在,这个一丝希望叫做静态的分析。[2018/4/12]

2.4流动性策略化部署

还是因为LB垂直聚合流动性这一特性,LP在提供流动性时,可以加入一些策略:Spot/Curve/Bid-Ask,这是UniswapV3这种水平聚合流动性的AMM模型所无法实现的,即便实现也需要进行多个仓位的流动性部署,对于LP用户来说操作成本和学习成本都过高。

以下是用户如何使用Spot策略分布的简单示例:

在这个ETH-USDC池中,流动性提供者可以选择高于当前市场价格的范围,只向池中提供ETH。随着ETH价格上涨,用户将稳步卖出ETH以换取USDC。上图中的范围相对较小,但用户可以选择他们想要的任何目标价格——这是平均成本法(DCA)平仓策略的简单实现。

Vanguard全球首席经济学家Joe Davis表示:比特币的价格很可能降到零:Vanguard全球首席经济学家Joe Davis表示,到目前为止,加密货币的价格更多地依赖于对他们最终被采用和使用的猜测。具有讽刺意味的是,投机造成了波动性,削弱了它们作为货币的价值。由于现金流缺乏和剧烈的波动,比特币的投资并不吸引人,认为它的价格很可能降到零。[2018/2/9]

反之亦然;用户可以通过逆流程并以低于当前市场价格的单方供应USDC的方式,将DCA加仓策略用于LiquidityBook模型中。在这两种Spot策略应用中,用户通过单笔交易成本可控地逐渐退出或进入他们的头寸,并在此过程中赚取隔夜手续费收益。这些流动性策略为LP在部署流动性方面提供了极高的自由和灵活性。bin数越少,流动性越集中;因此,他们在该范围内交易中所占的收入份额就越大。

2.5动态swap手续费

在所有DEX协议中,交易者在执行swap交易时向流动性提供者支付手续费,流动性提供者在获取手续费收益的同时,也承担着无常损失的风险。LiquidityBook中引入了动态swap费用,使得LP在市场经历高波动性时可以收取更高的费用,在某种程度上通过更高的手续费来博弈单边行情,从而对冲LP在高波动率行情下的无常损失。

总swap费用将包含两个部分:基本费用(Basefee)和动态费用(Variablefee)。动态费用是瞬时价格波动的函数。费率将应用于每个bin中的swap金额,并按比例分配给该bin中的流动性提供者。

swap收取的费用由下列公式决定:

其中,fb为Basefee:

fb=B·?s

fv为Variablefee:

fv=A(vk·s)2

其数值取决于市场的波动性。市场的波动性是受交易频率影响的,当交易数额巨大以至于耗尽多个bin内的流动性fv会随之增长。

其中vk代表波动率累加器(volatilityaccumulator)是一种计算最近交易跨bin频率的参数。波动率累加器是市场波动率的参数化表现,该值将在每个计算步骤之间存储在合约内存(memory)中,其数值由两部分计算结果共同决定:

参考波动率和引入波动率:

va(k)=vr+|ir-activeid+k|

参考波动率(volatilityreference,vr)取决于自上次交易以来经过的时间t。我们定义了一个有上限和下限的时间过滤窗口。如果t小于过滤周期定义的下限,则vr保持不变。如果t大于衰减周期定义的上限,则vr将重置为0。如果t在窗口内,则vr等于上一次的va结果乘以衰减因子R:

这意味着高频交易会增加波动率va,而低频交易会慢慢降低波动率va,以至于超过一定时间没有任何交易后将重置波动性va

上面我们计算了参考波动率,接下来我们来计算引入波动率了。在引入波动率的计算中我们引入了另一个变量,即indexreference(ir)。在大多数情况下,ir为该次交易前的ActiveBin的Binid。但在一定的时间窗口内时,ir会保持原来的值。这是为了防止交易者通过进行小批量的小额交易来操纵手续费率:

3.讨论

自UniswapV2在其产品中实现了一套全价格区间分布流动性的方案以来,包括Uniswap自己在内,众多DEX项目都在寻求资金利用效率更优的AMM模型。即便是UniswapV3上线届满2年的此刻,我们仍然无法断言什么是更好的AMM模型。但是忽略产品交互上的种种设计,单论核心业务层面的痛点,我们可以说理想的DEX应该符合如下特征:

对于交易者来说:低gas成本;低手续费;低滑点对于流动性提供者来说:低gas成本;更高的手续费收益率;可控的无常损失

虽然只是简单的几点需求,其中其实存在很多艰难地权衡:

首先,交易者的低交易成本和LP的高手续费收益本质上是冲突的,所以协议需要在一定的手续费率的前提下,将手续费更加合理的分配到LP的手中而更合理的手续费分配机制本身就会增加系统的复杂度,这一点上又需要与gas经济性进行平衡低滑点和可控的无常损失本质都依赖于更好的流动性深度,而在相同行情条件下,流动性深度与流动性分布机制乃至其资金利用效率息息相关。可是在资金规模确定的情况下,更高的资金利用效率必然会要更集中性的流动性分布算法,其带来的无常损失的风险也就越高

我们看到JoeV2,乃至刚刚上线的V2.1在可控的无常损失以及更好的资金利用效率两者之间的平衡中做出了创新;同样的,其在实现合理的手续费分配机制的基础上,也通过垂直流动性分布的方式进一步降低了系统复杂度,从而为降低用户操作的gas成本提供了可能性。

UniswapV3的代码版权即将解禁的此刻,很多DEX项目踌躇满志地要跟着推出他们根据V3改进的新版本,而Joe则继续在一条更具有开创性的道路上不停地做出新的尝试,我们乐见其成,也期待更多更好的原创项目为交易市场带来新的活力。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

链链资讯

[0:0ms0-8:828ms