本文通过数据建模构建了一个灵活且可以水平扩展的路由系统架构,其中包含用于最常请求路由的缓存和用于计算路由请求影响的缓存对数据。

原文标题:《用于 DEX 路由器构建和分析的构建区块》 撰文:Alex Carreira 与 Prabhaav Bhardwaj

用一种资产交换另一种资产是金融市场的一个基本概念。在加密货币市场中,这种情况通常发生在代币或货币与他人交换或交易的地方。Uniswap 是一种自动流动性协议,有助于这种类型的交换。它使用成对或池 (以下称为对),两种资产的池储备,允许用户将一种资产交换为另一种资产。

如果有人想要的资产与他们想要交易的资产不成对,会发生什么 ? 在这种情况下,在多个对之间进行一系列互换以获得所需的资产——用于促进这种交易的对被称为路由。

路由是从一个资产到另一个资产的路由,由零或多个对之间的段组成。如果交易的数量足够大,或者如果一对的流动性足够低,可以从多个路由中形成一条路由,通过吸收更多来自其他对的流动性来减少滑点。

滑点是指一个人预期为资产支付的价格与实际支付的金额之间的差额,这是由一些因素造成的,比如订单进入市场和交易执行之间的价格变动,或者成交量和流动性低。

另一个需要考虑的是路由中的段数。这将以在以太坊区块链上操作的 gas 费用的形式增加交易成本。一条路由上的段数越多,所产生的 gas 费用就越高。类似地,如果有多种途径,如上图 3 和图 4 所示,gas 费用也会更高。

路由器必须考虑这些因素,以产生适合交易数量的路由。此外,由于市场状况经常变化,影响 gas 费用和池的流动性,生成的路由也将是动态的,现在是一条很好的路由,不一定在一小时后或第二天表现良好。

本文的其余部分将讨论可用于构建和分析 Uniswap V2 协议及更高版本构建和分析路由器的构建区块。

注意 : 这里提到的 Graph 协议不同于下一节讨论的 Graph 数据类型。图协议是一个或多个智能合约的区块链交易的索引,而图数据类型是指使用数学图论的数据表示。

正如使用地图在点之间导航一样,可以使用图数据类型来导航可用的流动性对,以生成可以评估以提高回报的路由。在对 Uniswap 对进行建模时,一开始就需要做出一些实现选择 :

为了做出上述实现选择,理解 Uniswap 对的属性是很重要的 :

每对包含以下数据对 2 个代币:符号、名称、ID。

代币符号不是唯一的——例如,符号 BOND 表示许多不同的资产或不同的 ID。

代币名称也不一定是唯一的。

代币 ID 是唯一的,并且是代币的 ERC-20 合约地址。

Uniswap 对的这些属性建议使用代币 ID 作为图数据类型中的顶点。由此可见,图的边代表唯一的一对 ID。在这种形式下,图可以是无向的,也可以是有向的,每条边代表一对 ID、代币价格和储备。然而,不断更新代币价格和保留信息的需求表明,将该数据存储在具有适当的实时设置的缓存结构中可能更有效和可扩展,特别是对于实时交易的应用程序,而不是静态分析。

今后,在 Uniswap V2 和 V3 协议对之间路由是可取的。在这个场景中,可能存在多个对相同的代币 ID。虽然可以在一对 ID 之间添加额外的边,但另一种解决方案是在同一条边上分组不同的对 ID,从而避免遍历多重图的性能成本。下面是分组对 ID 无向简单图结构的部分示例,其中符号 ID 替换了符号名称:

最初,深度优先搜索 (DFS) 已经证明可以遍历图,一般情况下深度限制为 4。该深度的一个例外是从 WETH 开始的路由,其中连接节点的数量超过 30000。当一条路由从 WETH 出发时,DFS 被限制为 2,以减少遍历时间。

有许多用于处理图形数据类型的工具,包括图形数据库 Neo4J 和 RedisGraph。这些讨论超出了本文的范围,目前的项目需求可以通过 Javascript 库 Graphlib 来满足。然而,如果路由问题的规模达到了 LinkedIn 或其他大型网络的规模,那么上述图表数据库的规模就会满足这些需求,从而权衡成本和开发复杂性。

当在图数据结构中计算路由时,约束是有用的。例如,它们有助于确定只遍历有限数量对的路由,或者可以用来忽略包含某些资产的对的路由。

现有的 Uniswap V2 路由主要是通过六项资产的路由,这些资产可以比作机场枢纽。这六项资产是:

WETH

DAI

USDC

USDT

COMP

MKR

这六种资产是有用的,因为它们是常用的,当它们与其他资产成对组合时,不会施加流动性限制 (即它们不是稀缺的,并且不会与新的、未经证实的加密资产构成相同的风险)。然而,它们的使用可能会造成效率问题,在这里说明 :

「Uniswap 没有以去中心化的方式路由交换。」

使用约束,比如忽略上面提到的 6 个「枢纽」资产,可以探索比当前 Uniswap V2 界面提供给用户的更有效的潜在路由。约束也可以扩展到其他标准,例如 :

通过具有 X 美元流动性或 Y% 美元交易的池路由。

通过具有特定定价的特定池路由。(适用于 Uniswap V3 协议)。

同样值得注意的是约束是可组合的 , 也就是说,它们可以组合在一起,这样路由就可以限制为最多 2 个池,每个池的流动性超过 X。当前的数据模型在图数据类型和查找表之间拆分数据,这意味着在图遍历期间和之后发现对数据时都可以修剪路由。

扩展主要考虑向路由器公开一个公共 API,以便基于当前市场数据计算路由。性能是一个函数 :

计算路由的时间

如果需要,获取更新对数据的时间 (代币价格和储备)

计算路由请求的影响所需的时间

下图说明了一个初始的系统架构,其中包含用于最常请求路由的缓存和用于计算路由请求影响的缓存对数据。这种架构非常灵活,可以以多种方式进行水平扩展。例如,完全复制图数据结构和路由缓存以及请求聚合器和对缓存,或者简单地复制缓存并在缓存之间分配路由请求。

另一个潜在的可扩展性修改可能是考虑路由请求和数量的完整路由解决方案缓存;如果数量在一定的公差内,最近计算的结果可以重用。根据用户体验和应用程序的需要,最近计算的结果也可以用作临时结果,而为用户计算更精确的结果。

路由缓存由最常请求的路由的结果组成,其生存时间 (TTL) 与数据源的定期更新频率相关。例如,如果之前请求过 WETH 和 DAI 之间的一条路由,则可以在路由缓存中以可能路由数组的形式找到图遍历的结果 :[WETH -> USDC -> DAI, WETH -> WBTC -> DAI,…]。与代币价格和储备等对数据不同,路由可能性——特别是配对的存在——变化较少,因此该缓存的 TTL 预期要比对数据缓存大得多。此外,该组件还可以扩展为包含对死路由 (即过期或已被取代的令牌地址或非流动对) 的试探法。

配对数据缓存包含特定对的代币价格和保留数据,便于计算使用指定数量路由请求的影响。该数据比可用路由选项的变化更频繁,并且将具有大约一个以太坊区块(约 15 秒)的 TTL。

当请求的数据不在缓存中时,这些请求将被捆绑在一起,并从数据源中获取,目前是 Graph 协议中的 Uniswap 子图 (见下面的数据源部分),最多可包含 1000 对数据查询。发送捆绑的对数据请求之前的等待时间将根据流量进行调整——在低流量的场景中,让用户等待直到发出额外请求是没有意义的。

此外,为了改进用户体验,在获取和计算更新数据时,可能会呈现基于旧数据的预结果。

路由性能将通过将生成的路由与现有 Uniswap V2 路由器的路由进行比较来评估。具体来说,是通过计算给定数量的源代币的收益。例如,在从 DAI 到 COMP 的交易中,路由器的性能将通过计算从 100 万个 DAI 代币接收到多少 COMP,并检查从 Uniswap V2 路由器建议的路由获得的相同结果来进行比较。性能将根据各种不同的输入进行测量,例如,不同的初始数量,对搜索深度的不同限制等。

在执行静态分析时,不需要图 6.0 中所示的对数据缓存和捆绑请求。静态分析是在区块链的特定区块时间内对交易的计算。它有助于结果的一致性和重复性,以便进行比较。为 Uniswap V2 设计新路由器的初始工作范围由静态分析提供帮助,在静态分析中,可以在一个区块时间评估一组交易,并与现有的路由算法或变体进行比较。如果潜在的配对数据发生变化,则不清楚交易结果的改善或下降是由于算法变化还是配对流动性和定价。

随着区块链技术的成熟,出现了大量提供区块链当前和历史数据的服务。数据源的选择涉及下列考虑事项 :

预算

开发工作和成本

延迟

数据的准确性

开发工作和成本可以通过使用预先消化或索引的数据来减少,就像在 Graph Protocol 的众多子图中发现的那样。

对于初始交换路由器的设计和实现,将使用 Graph Protocol 中的 Uniswap 子图。该数据源提供了极好的易用性,能够分析过去的合约数据,否则将需要更昂贵的存档以太坊节点,并且能够在不执行静态分析时在单个 HTTP 请求中更新 1000 对数据。Graph Protocol 中的数据延迟比前面提到的解决方案低得多,只有通过直接运行以太坊节点或对内存池建模 (或者使用 Blocknative 之类的服务) 才能胜出。Graph Protocol 的延迟明显在 1 区块左右,在某些索引场景下可以动态改变。值得注意的是,当索引和映射区块被证明无效时,数据也可以更改。

一旦对交换路由器设计进行了评估,这个数据源将被证明不适合生成路由,因为实时数据需要具有竞争力。在这样的场景中,需要直接来自区块链当前状态的数据,例如来自 Alchemy、Infura 或其他来源的以太坊节点。

上面概述的系统提供了灵活性和可扩展性,以分析现有 Uniswap 系统的性能,以及在协议之上构建新的系统,包括一个成熟的交易解决方案。类似于 Coinbase vs Coinbase Pro 或 Synthetix vs Kwenta,也有一些对专业交易者至关重要的高级功能,我们在下面列出了一些。

通过使用避免上述 6 个枢纽代币的约束,本文描述的系统可以用来检查某些代币之间的替代路由及其效率。这可以定期完成以构建一个基于启发式的列表,现有系统 / 交易者可以使用该列表来改进对这些对的推荐路由,或允许他们进行其他更改。

通过增加图形或交替地使图形数据结构成为多图并添加额外的数据源,可以扩展该系统,为用户提供跨 Uniswap V2 和 V3 协议的资产之间的路由。根据目标的不同,这可以减少交易中的滑点,也可以对分散的流动性进行管理。

类似于跨协议,路由器可以扩展到生成跨层路由。降低 gas 费用和改进交易带宽的承诺表明,layer2 解决方案将有助于定义以太坊未来的很大一部分。在 L2 和 L1 资产之间交叉提出了一个新的路由挑战,其复杂性超过了协议交叉。然而,相同的基本构建区块可以生成允许跨层交易的解决方案,利用即将到来的协议来实现这一目的,例如 Hop Protocol、Nova 等。

通过将路由解决方案与防止 MEV 的技术相结合,如 Flashbots,该路由系统可用于保护大额交易免受攻击。试探法或其他输入可以确定一笔交易的价值是否足以表示这种风险,然后保护性解决方案可以自动合并由确定的最佳路由提出的交易解决方案中。

Graph Protocol 数据源虽然方便和快速,但通常至少有 1 区块延迟。对于某些交易应用来说,这可能还不够。在这方面,可以替代其他性能更好的数据源,要么直接绑定到一个以太坊节点,要么过滤已完成的感兴趣的交易,以更新路由系统的数据结构。更进一步,还可以构造内存池的有限描述,并应用类似的交易过滤,以提供未执行的已知交易状态下的预测路由结果。

来源链接:medium.com