#exchange #pallet #trade #algorithm #noble #api #order-matching

noble-exchange

Exchange Noble 实现了区块内的订单匹配算法

显示软件包…

1 个不稳定版本

0.0.0 2021 年 5 月 25 日

#4 in #noble

Apache-2.0

5KB

交易所

Exchange Noble 实现了区块内的订单匹配算法

概述

通过交易所组件传入的交易在区块内进行匹配,从而降低了每笔交易的滑点。如果我们在一个区块中将一对所有 AMM 交易相加,我们只需通过 AMM 模块交易结果总和。使用该对的当前现货价格。其他交易可以直接从账户到账户进行交易。费用将仍然作为流动性提供奖励发送到池中。完全匹配的交易将具有 0 滑点(不包括费用)。此组件对池设计不敏感。如果 AMM 组件实现了所需的 API,则可以连接。

实现细节

可调度函数

  • buy - 注册购买意向 - sell - 注册销售意向

处理和存储意向

注册意向意味着将意向的信息存储在 substrate 存储中。在区块最终化之前,解决当前区块内的所有意向,因此实际上没有提交到存储中。

解决意向

意向在 on_finalize 中解决。解决意向意味着尝试根据订单匹配算法匹配一个或多个意向。如果匹配了一个或多个此类意向,则可以在相应的账户之间直接进行交易,并将产生的差异通过 AMM 模块进行交易。

订单匹配算法

该算法的工作原理如下:对于每个资产对,意图被存储在两个组中。例如,对于资产_a和资产_b,会有以下两个组:- (资产_a, 资产_b) - 包含所有出售资产_a的意图 - (资产_b, 资产_a) - 包含所有出售资产_b的意图在块最终化期间,这些成对组将按照以下步骤进行处理、匹配和解决:1. 每个组中的意图按出售金额排序 2. 对于第一个组中的每个意图 - Intention_A (注意:这里可以进行改进,因为它总是选择第一个组,而不考虑意图数量、金额等...) - 从第二个组中寻找并匹配尽可能多的意图,使得 Intention_A.amount >= Sum(Intention_B.amount) 3. 2的结果是,在一边有一个意图 Intention_A,在另一边有一个匹配的意图列表 Intention_B。 4. 对于每个匹配的 Intention_B - 有三种可能的场景

  • Intention_A.amount left == Intention_B.amount - A和B账户之间的直接交易 - Intention_A amount left > Intention_B.amount - B的金额在A、B账户之间直接交易 - Intention_A.amount = Intention_A.amount - Intention_B.amount
  • Intention_A.amount left < Intention_B.amount - 注意:在当前实现中不应发生这种情况,然而这种情况仍按以下方式处理: - Intention_A的金额在intention_b和intention_a账户之间直接交易 - Intention_B.amount - Intention_B.amount - 差额通过AMM交易。
  1. 所有匹配的意图解决后,如果intention A还有剩余 - 将通过AMM进行交易。 6. 如果第二个组中还有未匹配的意图 - 所有这些意图都将通过AMM进行交易。
费用

每次直接交易都会向池账户支付费用 - 金额的0.2% - 由直接交易中涉及到的每个意图账户支付。

无运行时依赖