交换一种资产和另一种资产是金融市场的基本概念。 在密码货币市场上,代币和货币通常发生在与他人交换或交易的地方。 Uniswap是自动流动性协议,有助于这种类型的交换。 可以使用一对或一个池(以下称为一对),使用两个资产的池存量,将一个资产更换为另一个资产。
图1.0 ) uniswap令牌a和b池以及流动性提供者(LP )和交易者交换和存款的示例。 LP接收池令牌提供流动性。
如果某人想要的资产和想要交易的资产不一致,会发生什么? 在这种情况下,在多个对之间进行一系列交换,得到促进该交易所需的资产——的对被称为路由。
图2.0 :涉及多个交易DAI以换取usdc的路由。
路由是从一种资产到另一种资产的路由,由零或多对之间的段组成。 如果交易数量足够多,或者配对流动性足够低,可以通过多条路由形成一条路由,吸收更多来自其他配对的流动性,从而减少滑移点。
图3.0:paraswap路由器描述的多路径路由
图4.0 :多路由
滑移点是指预计支付给资产的价格与实际支付的金额之间的差额。 这是由订单进入市场后到交易执行期间的价格波动、成交量和流动性低等因素引起的。
另一个需要考虑的是路由中的段数。 这以以太网区块链上运用的gas费用的形式增加交易成本。 一条路线上的段数越多,gas费用越高。 同样,在有多种方法的情况下,如上述图3和图4所示,gas的费用也变高。
路由器必须考虑这些因素,以生成适合交易数量的路由。 另外,由于市场情况经常发生变化,影响gas费用和池的流动性,所以生成的路由也是动态的,现在是很好的路由,不一定一个小时后或第二天就能很好地发挥作用。
本文的其余部分介绍了可用于构建和分析Uniswap V2协议及更高版本的路由器的构建块。
与使用地图在点之间移动一样,可以使用地图数据类型移动可用的流动性对,并生成可评估的路径以提高收益率。 建模Uniswap对时,从一开始就需要几个实现选择:
作为顶点或边对、符号或资产标识符?
有方向吗,还是没有方向?
简单还是多图?
为了进行这样的选择,理解Uniswap对的属性是很重要的:
每对都有唯一的ID。
每对包含两个标记:符号、名称和ID。
令牌符号不是唯一的——。 例如,符号BOND表示许多不同的资产或不同的ID。
令牌名称也不一定是唯一的。
令牌ID是唯一的,是令牌的ERC-20合同地址。
建议Uniswap对的这些属性使用令牌ID作为图表数据类型的顶点。 由此可知,图的边表示唯一的成对ID。 在这样的形式下,图可以是有向的,也可以是有向的,每边代表一对ID、代币价格、储备。 但是,需要不断更新令牌的价格和存储信息表明,将数据存储在具有适当实时设置的缓存结构中,而不是静态分析更有效、可扩展性更高。
今后,希望在Uniswap V2和V3协议对之间进行路由。 在此场景中,可能存在多个相同的令牌ID。 也可以在对ID之间添加边,但另一个解决方案是通过在同一边上将不同的对ID分组来避免遍历多图的性能成本。 以下是分组对ID的定向图结构的一部分,其中使用符号ID而不是符号名称。
图5.0 :用定向图对uniswapv 2和V3的协议对进行建模(注意,这里很麻烦,因为实际结构中使用的是令牌ID而不是令牌符号)。
最初,深度优先搜索(DFS )证明了可遍历的图形。 深度一般限制为4。 此深度的一个例外是从WETH开始的路由,其连接节点数超过30000个。 如果路线从WETH出发,则为了缩短遍历时间,DFS限制为2。
有许多用于处理图形数据类型的工具,如图形数据库Neo4J和RedisGraph。 这些讨论超出了本文的范围,当前的项目要求可以通过Javascript库Graphlib来满足。 但是,如果路由问题的规模达到了LinkedIn和其他大型网络的规模,上述图表数据库的规模将满足这些需求,权衡成本和开发的复杂性。
现有的Uniswap V2路线主要通过6个资产路线,这些资产可以比喻为机场枢纽。 这6项资产如下:
WETH
DAI
美国足球甲级联赛
USDT
电脑游戏
MKR
由于这六种资产是常用的,因此与其他资产成对组合时,不适用流动性限制(即不稀缺,也不构成与新的未经证实的加密资产相同的风险)。 然而,这些使用可能会引起效率问题,这里将讨论:
“Uniswap没有以中心化的方式进行交换路由。 ”
使用忽略上述六种“中心”资产等约束,可以搜索比当前Uniswap V2接口提供给用户更有效的潜在路径。 约束也可以扩展到其他标准,如:
通过带有x美元流动性或Y%美元交易的池路由。
通过具有特定定价的特定池进行路由。 (适用于Uniswap V3协议)。
另请注意,约束是可组合的。 也就是说,路由最多限制为两个池,每个池的流动性可以超过x。 当前的数据模型在图数据类型和查找表之间划分数据。 也就是说,如果在图的扫描过程中和扫描之后都检测到了对数据,则可以修剪路径。
计算路由时间
如果需要,获取对数据进行更新的时间。 (代币的价格和存货) )。
计算路由请求的影响所需的时间
下图显示了初始的系统体系结构,其中包括最经常请求路由的缓存,以及用于计算路由请求影响的缓存到数据。 该体系结构非常灵活,可以通过多种方式水平扩展。 例如,完全复制映射数据结构和路由缓存、请求聚合器和成对缓存,或者只复制缓存并在缓存之间分配路由请求。
图6.0:具有可扩展的组件、缓存和定期更新的路由服务架构。
另一个潜在的可扩展性变化可能是考虑到路由请求和数量的完整路由解决方案缓存。 如果数量在一定的公差内,可以重复使用最近计算的结果。 根据用户体验和APP需求,还可以使用最近计算的结果作为临时结果,为用户计算更准确的结果。
如果请求的数据不在缓存中,则这些请求将被绑定并从数据源中检索。 现在是Graph协议的Uniswap子图,请参见以下数据源部分。 最多可以包含1000组数据查询。 发送捆绑的数据请求之前的等待时间将根据通信量进行调整。 在——流量少的场景中,让用户等待直到发出其他请求是没有意义的。
另外,为了提高用户体验,在获取和计算更新数据时,可能会出现基于旧数据的预先结果。
通过将生成的路由与现有Uniswap V2路由器的路由进行比较,来评估
执行静态分析时,不需要如图6.0所示的数据缓存和包请求。 静态分析是区块链在特定区块时间内的事务处理计算。 这有助于结果的一致性和再现性以进行比较。 为Uniswap V2设计新路由器时的初始工作范围由静态分析辅助。 静态分析允许您在一个块时间内评估一系列事务,并将其与现有路由算法或变型进行比较。 如果潜在配对数据发生变化,交易结果的改善或下降是由于算法的变化,还是配对流动性和定价,则尚不清楚。
随着
预算
开发工作和成本
延迟
数据的正确性
开发工作和成本可以通过使用预先消化或编制索引的数据来减少,正如在Graph Protocol的许多子图中发现的那样。
使用图形协议的uni交换子图设计和实现初始交换机路由器。 这个数据源非常易用,可以分析过去的合同数据。 否则,需要更昂贵的归档以太网节点,无需进行静态分析,只需一个HTTP请求就可以更新1000组数据。 Graph Protocol的数据延迟远远低于上述解决方案,只能通过直接运行以太网节点、对内存池建模或使用Blocknative等服务来取胜。 Graph Protocol的延迟明显为1个块左右,可以根据索引场景进行动态更改。 值得注意的是,如果索引和映射块被证明无效,则数据也可以更改。
对交换机路由器的设计进行了评估,证明了该数据源不适合生成路由,因为实时数据必须具有竞争力。 在这样的场景中,需要直接从区块链的当前状态(例如来自Alchemy、Infura或其他源的以太节点)获取数据。
通过添加
通过