《数字货币交易所架构初探》— PPIO Code Talks 第二期续
PPIO Code Talks 致力于打造一个以上海为中心,辐射全球的高质量区块链学习,分享,交友平台。
在 Code Talks 的第二期活动中,我们有幸邀请到 Trapdoor CEO Star.LI 老师和 技术大咖王伯洋老师,两位重量级嘉宾来做主题分享。两位老师分享的内容可谓干货满满。通过上一期文章,我们详细报道了 Star.LI 老师的主题分享《零知识证明– zkSNARK 入门》。在本期文章中,我们将会报道王伯洋老师的主题分享《数字货币交易所架构初探》,以及活动现场的交流情况。
相信没有人可以否认,交易所在整个数字货币,区块链生态中是一个极其重要的环节。甚至可以说交易所是币圈生态链中的最顶端,拥有的资源多,收益也最高。世界前五的数字资产交易所年收入均在百亿人民币以上。面对巨大的利润,交易所之间相互竞争也是必然的。对于这样的竞争,除了营销上的创新,交易所更需要在技术上不断完善,提升平台的整体实力,否则就会出现交易量过大导致的拥塞,被黑客攻击,被交易团队恶意交易的情况。
今天让我们从技术的角度,来了解学习一下数字货币交易所的架构搭建,以及业务的实现方法。希望通过这一期的分享,来为大家揭开交易所背后的神秘面纱,让技术从业人员,人人都能搭建一个交易所;让交易投资者能对交易所的运营流程又一个更深入的了解和辨识。
**
交易所概况
**
我们知道在数字货币交易所出现之前,还有很多其他金融属性的交易所出现,比如以股票、公司债券等为交易对象的叫证券交易场所;以大众商品(如棉花、小麦等)为交易对象的叫商品交易所。后期基于区块链技术,衍生出了数字货币的交易所。但是对于这些交易所,无论是买卖股票,买卖期货,买卖大宗商品,其背后主要的技术逻辑和业务逻辑几乎都相同。唯一细微不同的是,数字货币交易所的单位精度会更高,然后充值 token 和提取 token 的方式会与传统交易所略有差别。
同时,交易所是一个重后端,重运维,重运营的一个商业项目。大多数交易所的非技术团队人数上一般会多于技术团队。
上图我们看到的是交易所的一个后台的 OA 系统。包括一些像身份认证,用户管理,钱包管理,充值 token,提取 token 等基础功能;还有对账,清帐,调节费率,上币币种,上币币对等交易功能;还有文案的配置,轮播图的配置等营销辅助功能。
交易所业务
交易所本质解决的现实问题就是实现用户进行下单买卖,维持用户的交易深度,撮合交易单成交,最后完成清算划转。
详细一点,用户的每一次下单,携带的数据结构包含什么币对,以什么价格,买什么币。之后这一交易单将进入系统,用户的买单是否有对应的卖单进行撮合交易,如果不能撮合,这一买单将成为一个挂单。如果能够成交,则和另一用户达成交易。之后进行清算、划转。
比如 A 用 ETH 与 B 交易,换取 BTC,A 将 ETH 给到 B, B 将 BTC 给到 A。这其中涉及到四笔交易,A 减少 ETH,B 增加 ETH,A 增加了 BTC,B 减少了 BTC。同时A和B各付出相应的手续费,通过系统优化,两次手续费划转可以合并为一次。因此完成一个交易至少五笔划转。从交易链路来看,相对还是比较简单的。但当A的单量较大时,将会同时和多人进行交易,这种情况就比较复杂。另外个别地方也很复杂,比如状态的管理维护,数据量大了之后的性能问题。由于对数据的正确性要求很高,所以要保证即便是在服务器等硬件宕机重启的情况下,用户的资产也不能出现错误。
当然这也是一个取舍问题,业内有的交易所为了提升性能,允许交易过程中有小量误差,然后由交易所补偿给用户,从而达到一定要求的交易量和交易效率。比如,之前个别交易所出现的一种交易即挖矿的活动,用户交易可以获得平台币,对于用户而言,资金持有量越大,获取的平台奖励越多,就是在鼓励用户将资金充值到交易所,提高交易量。最高的时候一天的交易量可以达到百亿美金,交易量的换手率甚至能达到百分之一千甚至更高,那么服务器系统能够经受住如此大的交易量付出的代价,就是在容错上做了一些牺牲。例如一些头部的交易所,每天的交易量也可以达到20-30亿美元,大约在每秒钟 1 万单左右,所以整体的吞吐量相对较大。
其业务链路中的三个主要步骤:
1、下单买卖
2、撮合成交
3、清算划转
其中,下单的订单类型包括:
- 限价订单
- 市价订单
- 止损订单
- 终止限价订单
- 全单购买或终止成交
- 以指定价格立即下单或取消
- 尝试下单
在这些众多订单类型中,除去我们交易者常见的下单类型,有一些更多的适用于量化交易者运行量化策略使用。
撮合交易
对于多种不同的订单,系统首先会根据价格、时间优先进行定序,确定订单的先后。举例,如果 A 和 B 下单,A 的价格优于 B,无论时间先后,A 优先成交。如果 A 和 B 下单,A 的价格等同于 B,则先下单者先成交。所以成交的优先级是按照价格优先,当价格相同时,则按照时间先后的顺序成交。系统会将订单按照处达的先后进行时间戳排序,之后按照定序进行撮合交易。
系统进行撮合交易与交易所的交易深度也息息相关。进行深度撮合之后,会产生一系列的清算划转的账目,最后交易完成。
撮合服务是一个输入、输出都严格定义了的状态机。撮合服务采用了状态机的设计,所以在输入模块,一次只处理一个订单。自身的状态严格的根据当前的挂单深度,买单、卖单的价格分别是多少进行排序。输出就是清算结果,所以说撮合是输入、输出都定义了的状态机。
这样设计有哪些优势呢?
1、纯粹的内存操作,不需要读取缓存,更不需要读库。自身保存所有数据,所以速度可以做到很快。
2、如果在运行当中有任何的服务崩溃,服务器问题,消息队列的问题等等,如果之后输入同样的数据,依然可以产生同样的输出。
这样既可以保证撮合的效率,同时也保证了撮合的结果正确。稍后我们会从代码层面再来深度了解一下撮合的实现。
交易所技术架构
交易模块
交易模块的技术实现就是:下单,撮合,交易,清算。交易过程中,会生成不同的表单。在不同的表单中,会记录各个环节的信息。
Orders 表,记录着所有的挂单信息。其中 ‘chargeQuote’,代表着是否只收计价币。主流的大交易所可能会有选择不是只收计价币,一般规模较小的交易所,都会选择只收计价币,这样更方便手续费的计算。‘sequences index’是对指定序服务的标号。比如我们要建立32个定序服务,其中一个币种只能去一个服务里定序,我们就可以按照币种维度进行切割。
OrderSequences 表记录挂单定序后的结果。对现有‘ id ’和 ‘previous id’ 进行唯一定序。
Match Details 是撮合、匹配每一条挂单信息。包括用户的账户,价格,手续费等等。
AccountFlows 表记录成交单的账号间的清算划转。所有的信息,包括手续费,以及收手续费的地址都将被抽象成 Account Flows 中的账号,进行转账清算。
区块链模块
刚刚介绍了交易模块,还有另一个重要的部分是区块链模块,区块链模块主要体现在充币、提币。
充币请求时,交易所会扫描区块数据,获取充币的信息,根据交易所自身的策略,来决定是否需要审核,之后充值到用户的地址。再者就是用户提币,一般情况下交易所会进行提币审核,确认无误后,交易所将交易广播出去。然后交易所的热钱包向外打钱出账。
在这一环节中,交易所的私钥管理也是很重要的一个环节,将直接影响到交易所的资金安全问题。我们这边的热钱包的私钥管理用的是 vault,主要是为了做多签, 因为要支持多个链,所以并未采用 BTC、ETH 原生的多签。冷钱包方面可以自己导入硬件钱包,或者可以采用一些行业的托管方案,比如 Cobo 钱包进行托管合作。
挑战
刚刚我们介绍了交易所业务的实现流程。那我们现在来具体分享一下交易所的技术挑战有哪些。
- 数据量大。刚刚也提到交易所的处理交易量会很大,除了常见的数据库增删改查操作优化要做,比如分库、分表。分表常见的是按日期处理,所有的交易所查询历史订单都不会无限制,一般几个月之内的可以查到,超出几个月则无法查询。
- 数据的正确性。在各种情况下,都要保证对账、资产数据的正确性。
- 安全。安全可以说是一件“道高一尺魔高一丈”的事情。如果想做到绝对的安全,可能就意味着系统相对难用。交易所被攻击事件不胜枚举,除了不停的优化,交易所也会找一些安全审计机构协助,增加安全性。
- 前端性能和状态管理。由于交易场景的因素,会有用户长时间登陆盯盘进行交易,这时对内存的一些管理,要确保所有的环节没有内存溢出,大量的数据就要有上限的数据结构。交易所也会将持续推送,上币,营销等活动进行配置化。
交易所是一个已经成熟的技术系统,从技术实现上并不难。但是刚刚提到的一些存在的问题,所以要做的好,有好的用户体验,还是有一定的技术门槛。
现场提问:对去中心化交易所有什么看法?
伯洋老师:之前有很多项目是在 ETH 公链上做去中心化交易所,比如国内做的比较大的 IDEX。在 ETH 上运行的特点是速度相对较慢,目前也有个别去中心化交易所通过线下下单,线上清算来优化流程。之后有了运行速度相对较快的公链,比如 EOS。抛开其他因素,就 TPS 速度有了很大提高。在 EOS 上做去中心化交易所,会相对更容易,也开始逐渐成熟。所有的撮合,所有的下单直接上链。同时,由于所有的数据直接上链,交易所需要考虑到 RAM,CPU,net,存储资源的使用等都需要一些花费。但是好处是直接替代了中心化交易所的定序功能,同时所有的撮合都是公开化,对于交易者而言更加公平公开。问题是只能交易基于 EOS 的 token,如果交易其他 token,就需要跨链的支持。但是目前的跨链技术如果要用于大量的交易,无论是性能上或便利性上都会有不尽人意的地方。
这一期文章,我们给大家介绍了伯洋老师带来的《数字货币交易所架构初探》的分享。带大家了解了交易所的行业概况,业务实现,技术的实现,以及行业对于交易所的一些挑战。想必大家对交易所都有了更深入的了解。
于此同时,我们将在8月31日(周六)举办第三期 PPIO Code Talks 活动,此次活动我们更是邀请到了神秘重量级嘉宾,来分享关于区块链中密码学应用和联盟链技术与商业落地的相关问题。
如果您也是区块链从业者,对区块链技术有自己独特的心得,或者你有区块链相关技术干货希望与志同道合的技术爱好者分享,欢迎报名参加我们第三期 PPIO Code Talks!
下一期文章,我们将会给大家分享 “ PPIO 状态通道设计的思考”,关注 PPIO 公众号,精彩正在继续。