# 闪电兑换实现

# 基本架构

闪电兑换的核心架构中,主要有两个不同的角色,互为对手盘,代表了不同类型的参与者。交易中除了两种角色外还有辅助做市商的一些外部设施。

闪电兑换的基本角色:

  • 交易者:正常交易者在闪电兑换中享受高效快速且链上可查的交易体验。用户无需额外挂单等待,一键成交,撮合速度极快。用户通过链上ID、区块高度、blockmeta链接提供了更加方便的链上查询机制。
  • 市商者:闪电兑换中的市场定价或者汇率锚定并不是传统的互相报价形式。为了缩短撮合时间以实现真正的“闪电”兑换,闪兑在设计上简化了对手盘的组成,闪电兑换中的报价统一由做市商者提供。系统会全自动选择最佳报价。

外部设施:

  • MOV Server 连接MOV的中心化服务器,用户使用其提供RESTful API在MOV上进行交易
  • MOV-MMDK MOV Market Maker Development Kit,基于MOV Server的RESTful API开发的Python SDK
  • Dealer 开源的连接MOV Server的程序,用户使用其提供的RESTful API向MOV Server发送请求

闪电兑换主要有三个步骤:

  • 系统择优给用户显示实时的兑换比例
  • 普通用户发起闪电兑换交易请求
  • MOV Server处理用户请求,在链下和市商者报单进行撮合
  • 交易结果上链

由于目前MOV服务暂不开源,因此本文只对闪兑机制做简单的讲解,重点在撮合机制和Dealer上。

# 撮合机制

闪电兑换为了保证更好的用户体验,采用链下撮合,链上记录的方式。为了保证交易的迅速,撮合过程并不复杂。后端SubmitSwapOrderTx模块会响应来自API的闪电兑换请求,此模块会提交兑换的transaction到full order,并且记录User的信息。 撮合过程中会先对原资产FromAsset和目标资产ToAsset解析,得到

AssetID    资产ID 
Amount    对应资产的数量,分为fromAmount和toAmount 
changeAmount    从ToAsset中解析获得,为fromAmount的改变量

处理完所需的基本变量后会实例一个TradeSymbol对象,TradeSymbol是一个与交易符号相关的表。在本模块中主要是通过tradeSymbol.side方法获得交易的方向,return Buy 或 Sell。

交易的价格是由calcTradePrice函数完成,calcTradePrice通过调用处理好的rate计算出闪电兑换的报价。值得一提的是,闪电兑换的手续费也是在calcTradePrice中一并计算得出,calcTradePrice会先对价格price进行计算,随后获取feeRate(手续费比例)并且再次计算。 因此,闪电兑换的手续费是计算在兑换的比例当中的。假设:用户使用1btc兑换usdt,市商者的最优报价为1btc : 10000usdt。在兑换完成时,用户显示的兑换比例就可能是1btc : 9990usdt。手续费会体现在兑换比例上。 最后,通过ChainAmountToTradeAmount在MOV中将链上的资产转换为交易的目标资产,完成兑换。

以上是对撮合过程的简单描述。

# Dealer

MOV Market Maker Development Kit,基于MOV Server的RESTful API开发的Python SDK,与传统交易的做市商不同,闪兑中做市商者需要在本地启动Dealer,通过本地Dealer的RESTful API发送订单以及撤销订单。在这个过程中,做市商需要不断的轮询Mov Server服务器来获取账户资产余额的变化,变化部分即是闪电兑换成交的资产。

Dealer的功能:

  • 下订单和取消订单
  • 查询订单状态和账户信息

使用须知:

  1. 所有请求均基于Http协议。
  2. 所有输入和输出数据均为JSON格式。
  3. 访问根URL:https : //bcapi.movapi.com
  4. 首先安装pybtm,pip3安装pybtm
  5. 交易API相关接口需要签名。签名数据放置在HTTP标头的授权标头中,授权是签名结果字符串。与市场API相关的接口不需要签名。
  6. 速率限制:暂无限制

闪兑API支持的功能

  • 获取市场信息
  • 获取市场深度
  • 发送订单
  • 取消订单
  • 获取帐户信息

细节请点击:闪兑产品API

Last Updated: 10/29/2020, 5:45:54 PM