# ViteX 后端服务设计及实现

ViteX 是 Vite 链上的内置去中心化交易所,是 Vite 生态的重要组成部分,ViteX 由 Vite 内置合约 vDex 和链下服务 dexServer 两部分组成。所有的挂单、撮合及运营数据全部在链上 vDex 进行,有效的利用了去中心化、安全、可靠的区块链特性。但链上存储所有数据是非常昂贵的,为了能有效的为用户提供体验,特配套了链下服务 DexServer。DexServer 服务的目的是同步链上挂单、撮合、运营数据以及统计指标等。DexServer 的所有数据都是链上可追溯的,仅仅为 ViteX 提供查询服务,保证了 go-vite 代码即协议的原则。

按照职责,把 DexServer 分为了四个服务,分别是 Dex-API、Dex-Crawler、Dex-Push 及 Dex-Task。其中 Crawler 是核心服务,为其他三个服务提供数据源,整个系统流程如图所示。

# 1、Dex-API

API 服务为 ViteX 提供了查询入口,是对 Crawler 服务和 Task 服务生成的数据的最终聚合。

# 2、Dex-Crawler

Crawler 服务是整个系统的核心,把从链上爬取到的数据进行格式化整理之后进行存储,以便其他服务使用。vDex 设计为两个合约 dexFund 及 dexTrade,dexFund 承担充值、提提开通交易对、开通交易对、挖矿、分红、邀请等操作;dexTrade 完成实际的挂单、撮合及撤单。Crawler 服务对这两条链分别爬取并进行数据加工,按照需要存储为多个维度。

Crawler 业务流程如下图:

crawler 服务主要完成三个功能,分别是处理分叉,深度合并及指标统计。跟中心化交易系统有一个本质的区别,区块链存在回滚和分叉,因此,crawler 服务的一个主要工作是判断合约链是否分叉,如果分叉则根据分叉高度删除已经持久化的数据,以便同步链上状态。Dex-Crawler 服务借助数据库及区块链存在 “前一个块” 的特性来检测合约链是否存在回滚及分叉,若存在,则对该高度的所有落库的数据进行回滚,保证数据的一致性及正确性。

深度合并是 Crawler 服务的第二个重点,当有新订单、撤单及撮合事件发生的时候,订单簿就会存在变化,那么表现给用户的就是深度发生变化。深度合并之所以比较复杂,是因为需要对每个交易对进行 0 到 N 个价格小数位的数量及金额合并,以及对价格的正确处理。为了提高性能,本服务采用 “内存建模” 的方式进行深度合并,所有的深度构建在内存中进行,然后将数据送入中间件 Kafka,以供下游 Dex-Push 服务使用。

指标统计是 Crawler 服务的第三个重点,当新的撮合交易完成时,Kline、Trades 以及 Tickers 这三个指标都会发生变化,其中又以 Kline 指标较为复杂,需要对不同的时间周期进行数据整理,ViteX 支持的时间周期为 [minute , hour , day , minute30 , hour6 , hour12 , week]。这些指标整理完成之后,都会送入中间件 Kafka 中,以供下游 Dex-Push 服务使用。

# 3、Dex-Push

Push 服务的主要工作是把 Crawler 服务中生产出来并写入 kafka 的数据及时展示给用户。采用多机部署,保证能给用户提供可靠、稳定的服务。另外、为了减少服务端压力,客户端需要在一分钟内对服务端发起 ping 请求,以声明客户端在线,服务端只会对这些健康的客户端发送数据。

# 4、Dex-Task

本服务主要用于运营数据计算及汇总,交易挖矿、挂单挖矿、邀请挖矿、抵押分红、手续费统计等数据汇总都由定时任务进行离线批处理。

DexServer 服务按照不同的职责划分为 4 个子服务,4 个自服务通过异步消息的方式进行数据通信,避免耦合,提高了系统的可靠性和可维护性。之后将会对 Crawler 及 Task 中的部分技术细节进行详细介绍,敬请期待。