AMM模型在NFT交易中的传承与创新设计

'AMM模型中的NFT交易传承与创新设计'

从AMM DEX到NFT流动性协议的设计思路

前言

在过去的一两年中,市场验证有效的自动化做市商(Automated Market Maker,AMM)模型算法很少进行更新迭代。AMM的核心问题也逐渐从设计合理的算法回归到金融市场的本质——流动性。如今,非同质化代币(Non-Fungible Token,NFT)作为一类资产标的也面临着与流动性相关的问题。然而,在NFT市场中,一直没有一个有效的去中心化交易所(Decentralized Exchange,DEX)能够从流动性聚合的角度解决交易撮合和价格发现等问题。所以今天我们的主题就从AMM DEX出发,向大家分享我们在设计Midaswap Protocol这个NFT流动性协议过程中,是如何从现有的AMM方案当中寻找灵感和启发,又是如何在这些既有的方案中改进和创新以解决NFT市场中独有的痛点和需求。

—— Joseph

本文整理自Midaswap工程师Joseph在经济模型小组的内部分享。

自Q3以来,NFT市场经历了剧烈的波动,蓝筹NFT纷纷暴跌。忽略项目方、发行方等影响,流动性依然是NFT市场里最重要的问题。就目前来说,仅在以太坊虚拟机(EVM)链上,我们可以将NFT大致定性为以太坊的一个衍生品。

此外,无论是否参与过NFT的交易,大家应该都已经关注到blur.io的迅速成功。在流动性解决方案上,Blur似乎已经交出了一份来自中心化交易所/聚合器的高分答卷。它现在几乎已经占据了这个市场里面最大的买单流动性的份额,而且作为一个后起之秀,尤其是在Opensea已经在头把交椅上这么多年的情况下,它还能如此迅速地崛起。其实我们可以说Blur已经将中心化的流动性方案做得很好。但是中心化无论是对于我们dApp的开发者来说,还是对于各个公链上的生态来说,我们一直都认为中心化可能只是这个交易市场里面的一部分,我们希望寻求的是我们怎么能在链上搭建属于我们自己的NFT交易所,或者说NFT DEX。所以我们今天希望能够在接下来的探讨当中讨论以下的一些问题:

  • 构建一个去中心化的NFT交易所应该采用什么样的流动性方案?

  • 在思考和设计去中心化的NFT AMM时,现有DEX的AMM方案都有什么可以借鉴的地方?

  • ERC721和ERC20作为完全不同的资产标的在其AMM模型设计上又会有哪些不同?

我们今天便带着这些问题,和大家一起探讨学习,同时也试图向大家分享我们的产品Midaswap在模型设计上所经历的思路历程。

如何从零设计一个DEX

先从一个比较抽象的问题开始,就是当我们去设计一个DEX时,我们需要经历哪些思想上的斗争,或者我们需要做出哪些选择?

首先估计大家都知道,选择一个AMM曲线,可能是所有的AMM设计者在一开始就需要确立的方向。诚然x+y=k或者x·y=k,亦或是Balancer那种更魔改型的多币池的恒定函数,其实它们都可以叫做CFMM,恒定函数做式商。这里的x和y,包括Balancer公式里的b等等,它们其实代表的都是所对应的这个市场,或者这个流动性池里面所涉及到的资产余额,或者说供应量。他们依据供应量之间的比例关系或者各种创造出来的数量关系,重新在这个市场里撮合定价。所以,我们考虑选择一个什么样的曲线,往往和这个流动性协议它认为自己所能吸引的目标性的资产标的是有关的。稳定币的交易,比如Curve V2,它会选择一个混合式的恒定函数做式商,在平衡点附近,它的模型更接近恒定和的曲线,而在平衡点较远的地方,它更像是Uniswap V3恒定积的方法。所以说其实并没有一个完美的AMM曲线,更多的是怎么样寻找到一个适合你自己这个市场的一个AMM曲线。

然后其实大家就会面临第二个问题,就是我们希望流动性是怎么排布的。当然这涉及到两个方面的问题,一个是流动性是需要在全区间内排布,还是在一个固定价格区间内排布,或者说是在LP提供的一个价格范围内排布。这一点上其实就是Uni V2和Uni V3之间的差异。Uni V2其实设计了一个十分简洁的模型,它将两种代币全区间排布,严格地遵守了x·y=k这样的一个AMM曲线。但是Uni V2也带来了另一个问题,就是在曲线两端时资本利用效率大为降低。Uni V3在这方面做了革新,它们为LP提供了新的功能,LP可以在他希望的区间提供流动性,也就是Uni V3定义的range order功能。它的AMM曲线其实就不是一个简单的x·y=k,它是无数个x·y=k的叠加的结果。选择了这个流动性区间的排布其实背后还有另外一个问题,就是你希望你的流动性是水平地摆置,还是纵向地摆置?可能现在没有一个较为直观的方法给大家解释这两个之间的差别,我们后续会进一步做阐释。

第三个也是最重要的一个问题,就是你是怎么激励你的LP的?LP其实是DEX或者游戏里最重要的参与角色。没有LP就没有流动性深度,也就没有良好的交易体验。所以所有的DEX其实都会面临这样的一个问题,就是怎么吸引到LP?当然我们知道所有的DEX都会用交易手续费收益来吸引自己的LP。有一些新兴的流动性协议会为LP创造更多组合性上的收益,比如流动性质押或者流动性代币的一些组合性的玩法,类似LianGuai与LianGuaice就使得Uniswap的LP们能通过借贷实现更多杠杆上的组合性玩法。其实这些方面都是为了增加流动性池对LP的吸引力。正如我们刚刚所说,LP是这个流动性协议这个游戏能够玩得转的最重要的因素。如果没有一个良好的机制去吸引LP,那其实这个飞轮是无法正向运转的。

然后我们就来到第四个问题,就是你应该如何向你的交易者们收费?这一点上现有的DEX们还是挺一致的,就是怎么向交易者收费几乎都是由创建流动性池的人决定一个费率,像Uniswap V3就可能有多级费率。我们可以提到的是在Joey V2中,它的费率是一个动态手续费。我们也看到Uniswap V4做出了这方面的跟进,它通过hook的形式引进了动态手续费。动态手续费率代表着更先进的一种产品设计,因为动态手续费率不仅可以形成一个负反馈系统来平衡市场,而且在某种程度上还可以对冲LP的无偿损失。在这里我们不会过多涉及到这部分的内容,但是这一环肯定也是作为一个AMM的设计者来说必须要考虑到的。

然后就是选择LP的凭证。这一点上有很多流派。Uniswap V2选择了ERC20,Uni V3选择了ERC721,Joe V2选择了ERC1155。其实LP Token是由前面四个选择共同决定的。流动性的分布方式和在流动性协议中进行量化流动性的方式最终会决定LP Token的形式。以Uni V2和Uni V3的差异为例,Uni V2是在全区间分布流动性,所以在每一个价格节点上,只要两个LP提供流动性资产的占总资产的比例是一样的,那我们就认为这两部分流动性是等价的,所以Uniswap V2同一流动性池内的LP Token都是同质化的。而Uni V3因为引入了range order(限价流动性),所以流动性本身的有效性就有了新的定义。并不是所有的流动性在任何时候都会参与市场交易,只有在价格区间扫过范围内的流动性才真正为这个市场提供资本贡献。所以它需要将每个LP的仓位进行非同质化封装,为它们包裹上一层ERC721的Token,这可能是目前看来相对来说比较好的方案。当然我们不知道Uni V4接下来会怎么样,但是我认为在Uni V4的流动性方案并没有和Uni V3产生巨大差异的情况下,ERC721可能仍然是它LP Token的最好选择。

经历了上面这5个重要环节的抉择和挣扎,我们已经确立了一个AMM协议大致的方向。所以刚刚这个过程其实也是帮助大家有这样一个头脑风暴的过程。如果这5个环节都没有问题的时候,我们才真正进入了AMM模型设计的大门,我们开始能够去讨论一些更细节的问题。

NFT AMM的困难三角

刚刚的话题都在讨论ERC20 AMM DEX的设计,包括Uniswap、Curve、Balancer等市面上主流的AMM DEX。我们今天的主题则是NFT AMM。NFT AMM的币对一侧是ERC721的NFT,另一侧是ERC20或者ETH这样的同质化代币。当这两种资产标的放在一个AMM流动性池当中时,我们会遇到一些十分原生的矛盾。

首先最重要的是在传统NFT的交易市场当中,它们依赖的是一种买卖双方的交易模式,更像是一种订货簿市场。这意味着当一侧流动性缺乏的时候,流动速率会较慢。所以NFT市场缺乏做市工具和充足的买方流动性。大家一直都诟病NFT的内生价值缺乏,且它的买方流动性无论在任何一条公链上都是匮乏的状态,所以换手率的严重不足就导致了流动性注定是枯竭的。所以我们在想,如果将NFT AMM直接引入到现有的AMM DEX市场当中,在不经过任何改动的情况下,它很有可能会面临ETH侧或者ERC20侧流动性严重不足的问题。这是大家在一开始就需要面临的一个问题。

然后第二个重要的问题,也是很现实的问题,就是NFT是整颗进行交易的。因为NFT本身它非同质化的特性,在不加以其他附加设计的情况下,没有一个NFT的持有者愿意出售10%的NFT给另一个人。这从资产本身的特性来说也是不成立的。这其实引入了一个问题:我们原本的AMM DEX在代币的精度范围内是无限可细分的。如果说一些主流的ERC20是18位精度的话,那它在18位精度以内都是可以细分的,也就是说价格曲线可以无限趋近于一个连续的曲线。而NFT是一个断点状的流动性,这往往就意味着它有很大的流动性缺口。我们要靠一条什么样的曲线将点和点之间连接起来,这也是一个很重要的问题。

同时从另外一个角度讲,因为Token ID本身是整数个交易的,NFT的交易门槛一直以来是相对较高的。散户在购买ETH时,如果他的USDT不够购买一个以太坊,他可以选择只购买价值100USDT的以太坊。但是当一个NFT价值1ETH时,用户不可能花100USDT去购买一个百分之多少比例的NFT。之前市场当中已经有流动性协议提出为NFT引入碎片化设计。碎片化当然是一个很简单直接的方案,但是碎片化方案又引入了困难三角的第三个问题:碎片化的NFT还具有NFT本身的交易属性吗?

任何一个NFT集合发行出来时,它会根据Metadata中的属性来决定某一个NFT ID或者某一组NFT ID的稀有度。不同的稀有度往往就决定了这些NFT持有人对于自己NFT价格的期望是不同的。而碎片化意味着所有投入到这个碎片化流动性池当中的NFT都是被一视同仁的,因为我们没有办法在一个已经碎片化的流动性池当中再去分辨某部分碎片是来自于某一个高稀有度的NFT。

这其实就是我们所说的NFT去中心化协议所必须面临的三个核心的痛点。如果在这三个问题当中没有一个取舍的话,可能NFT AMM设计会遇到很大的困难。

NFT AMM市场已有的方案

我们再来看下现有的NFT AMM市场上有哪些已经比较成熟的解决方案。比如NFTX是将NFT无差别地碎片化成ERC20,再通过Sushi Swap的池子构建成交易对。它简单粗暴地绕过了Token Decimal Conflict这个问题,但是它也忽略了交易者和持有人对于NFT稀缺性的差异化判断和价格期望。稀缺性高的NFT无法在这种AMM模型下得到好的价值发现。

另外一个项目Sudoswap是原生NFT资产第一个类似于AMM的DEX。为什么这里说类似于AMM,因为它和大家通常理解的AMM的角色设定是有一些差异的。我们简单介绍一下Sudoswap这个项目,它将每一个流动性提供者变成交易者的对手方。流动性提供者按照他所设定的bonding Curve设计自己的流动性提供方案。每一个流动性提供者就拥有一个流动性池,并确定这个池子是双向池还是单向池。双向池意味着你既可以买入也可以卖出NFT,流动性是双边的。双边意味着你可以接收两边的资产互换。它也可以提供单边池,比如说你只提供ETH,类似你这个LP挂了一个NFT的买单,交易者可以将NFT卖入这个纯ETH的池子当中。反过来也成立,你可以提供纯NFT的流动性池,那它更像是挂了一个NFT的卖单。

所以这个过程当中LP的角色被淡化的,LP更像是交易者的另外一种形式,只不过从某种程度上可以享受一些更定制化的交易功能。但是这会带来两个问题,第一个问题就是如果一个LP拥有一个流动性池,这就意味着每一个流动性池之间的流动性是无法聚合的。我们刚刚提到NFT市场最重要的问题是买方的流动性是匮乏的。在这样的一个大前提下,如果还将所有流动性割裂到单个LP的流动池子当中,这其实在某种程度上依然是将流动性孤岛化。流动性无法聚合在某种程度上违背了AMM本身的初衷:AMM希望在一个市场内聚合流动性以提供更好的流动深度,然后撮合出一个真正符合这个市场目前情绪的价格。这一点上它其实是无法达到的,每一个流动型池彼此之间互相割裂,而且不互相影响。另外一个角度,在单一流动性池当中,NFT的稀缺性是默认相同的。也就是说一个LP在他自己的流性流动性池当中提供3个NFT,这2个NFT他是不会为它们一一定价的。如果一个LP手上有三个不同稀有度的NFT并有不同的期望,他可能需要创建三个流动性池才能满足这样的需求。

所以说在这两个项目其实是NFT AMM市场当中已经比较成熟的两个项目。这两项目都解决了我们刚刚说的三个问题中的一部分问题,但是自身可能存在一些Trade Off,一部分问题被他们选择性地忽视或者妥协了。那么我们在思考的就是有没有一个NFT模型能够将这些问题做一个很好的解决,或者说我们能不能通过一套NFT模型将这三个问题解决到大家能够接受的一个程度内。

Bonding Curves

我们会接下来给大家详细解释一下Bonding Curve,作为后面我们聊详细的解决方案的一个铺垫。Bonding Curve本质上是一系列用来实现价格发现的数学函数。它其实就是将资产的供应量映射到资产价格当中。从上述两个curve图中明显能看出,左边是一个线性的Bonding Curve,右边是一个指数函数的Bonding Curve。图中,绿色的点代表ERC20在仓位当中的位置,而ERC721用红色的点来表示。在左边这个图中,如果在这样的一个流动性池当中,它的流动性分布是怎么样的呢?在价格最低的地方,即它所设定的价格的起点以及接下来的第二个点放置的是FT的流动性,也就是ERC20的流动性。而上面的三个点所代表的是ERC721的流动性。当这个流动性池当中被交易者买走一个NFT的时候,中间的这一颗红色的点就会被置换成绿色。也就是说这个市场当中每买走一个NFT,这个价格就会线性地增长一个恒定的值。而每卖出一个NFT,这个池子当中所提供的inDEX price就会下降一个恒定的值。同理在指数函数当中是一样的,它只不过将这个公差变成了一个公比。

Sudoswap值得肯定的是它开创性地将Bonding Curve引入到NFT的交易当中,这为流动性提供者们提供了很好的做市的自由度。但是就像刚刚提到的,在它的设计里,LP之间的流动性池是割裂的,所以说它的Bonding Curve在某种程度上丧失了对市场全貌的一个描述能力。我们没有办法从某一个流动性池当中真正地看到这个市场交易到什么程度。它在市场中交易的inDEX Price也不能够反映整个NFT Collection市场的特性,陷入一种“管中窥豹”的窘境。

从已有DEX中借鉴的灵感

综上所述,我们去研究现有的ERC20 DEX,寻找可以给我们灵感的元素。

首先,我们认真地研究了Uniswap V3。Uniswap V3给我们提供了一个很好的灵感,LP们可以在限价范围内提供流动性,这一点类似于之前提到的Sudoswap当中LP限制好自己流动性的Bonding Curve,然后在这个范围内提供流动性。那么我们其实就会有一个想法,LP是否可以按照某种bonding Curve自由地在我们的一个流动性池当中提供自己的流动性。在这样的基础上,我们可能需要辅助一个Non Fungible LP Token,也就是一个ERC721的LP凭证,这样才能确定好LP的每一个仓位,其实彼此之间是非同质化的。

然后我们又去深入地调研了Joey V2的协议设计。它在Uni V3的基础上进行了一些升级。首先,LP的这个Curve(曲线)它是能够自定义的,它可以选择LP流动性的稀疏程度,选择流动性是否全局地铺在自己这个Range Order的价格区间上,它可以选择点状的流动性提供,同时它还利用Liquidity Book的设计,将链上交易在微观的维度上可以实现类似于Order Book的交易模式。这是一种更为新式的流动性分布方案。

从这两个ERC20 DEX当中我们获得的最重要的灵感是我们不应该忽略NFT本身Token ID之间的差异,我们应该允许LP对于自己的流动性有差异性的期望。同时我们不应该将LP的流动性分割到它的每一个私有的流动性池当中,我们应该聚合它们买端的流动性。只有聚合的流动性才能为交易者提供更好的交易体验,更低的滑点以及提供更加及时的交易体验。在流动性缺乏和无法聚合的情况下,交易者想要卖出一个NFT时的体验是很差的。

Midaswap AMM的设计思路

讲到这里,我们就可以重新去讨论该如何去设计我们自己的NFT AMM。在这之前我们可以先讨论一个和这个话题稍微有一点远的问题,如果大家也看过Uniswap V3相关的资料,大家都知道Uniswap V3有一套自己衡量价格的标识,它把这个系统叫做Tick。Tick其实是一个1.0001的指数函数,Tick每增长一,它就会在对应的价格上面乘1.0001,也就是说Tick和价格彼此之间是一一映射的。为什么会这样设计?其实所有的DEX都会有一套自己的价格标尺,这个价格标尺是为了从几乎无限的价格中取出对于我们AMM最有效的一个价格尺度。在这些价格尺度中间的流动性其实是被忽略的,我们只将我们的流动性提供在这些我们设定好的Tick当中。

与之对应的另外一个比较主流的设计是Liquidity Bin。Bin顾名思义是像箱子一样的东西,我们可以将每一个价格标尺上面的流动性看作是每一个LP为这一个价格堆