2613 large

从技术角度看数字资产交易所

thishe · 于 发布 · 最后由 maomiwang回复 · 790 次阅读

    全球数字资产交易所从2017年的不到两百家,到2019年初的上万家,增长速度极快。
    但交易所也常常出现负面消息,例如盗币,例如系统崩溃,等等。币安,中币这样的大交易所在2019年都还出现巨额丢币现象,各种小交易所被盗没被曝光的更是不计其数。有几家大家交易所在特殊事情也是常常出现系统无法服务的情况(甚至有人戏言拔网线)。
    我们尝试从技术角度分析交易所的主要技术及其相关难点。
    交易所要做到币不丢、帐不乱、系统可用。
    币不丢就是安全性相关。除了技术角度考虑,财务制度(和流程)也是安全性的重要一方面。安全性涉及面太广了,除了传统的网站安全、代码安全、防火墙设置,等之外,还有一个很重要的区块链安全。怎样才能做到彻底无法丢币呢?不在任何地方存放私钥可以做到这点。幸好出现了HD钱包技术,只需要一个助记词,可以配合Password(其实是Salt)就可以生成无穷尽的地址和私钥。也就是说,老板掌握了助记词,记在脑袋中,动态生成所有的充币地址(和私钥),需要入库(归集币)的时候输入助记词就可用了;提币的时候也输入助记词就好了;其他转账也是输入助记词。转账的时候必须采用离线签名,否则把私钥发送到区块链网络上面去执行转账就很容易被盗币:盗币最简单的做法就是你刚在某区块链节点使用私钥签名转账,盗币者也跟着使用此地址转账,这是很容易成功的。在服务器上执行助记词动态生成地址和私钥,如果服务器被攻破了,内存很容易被读取。当然内存也可以加密,但肯定也不是绝对保险。所以把转币操作放到离线系统来就更安全了,也就是说币地址生成,充币的入库,提币的转账,等操作,做成一个独立的系统,不需要放到云服务器上,是离线系统,还可以大大提升安全性能。所以币不丢的核心点就是:离线签名,助记词,币操作的离线系统(我们叫币管理工具)。除了管理上的问题,理论上来说这种系统可以彻底杜绝丢币。
    帐不乱就是账务的准确性。记账要采用复式记账,资金进出双方都要记录。所有的记账记录不允许修改和删除。要注意float数据格式是不精准的,各种情况下的舍入都需要根据上下文做不同处理。系统的小数位和区块链的小数位不一定一致,但是舍入都要采用统一标准,一般采用系统小数位和区块链小数位中位数最少的。由于区块链系统和交易所系统都是独立系统,两个系统的交互具有滞后性,所以始终存在“待收账款”。充币数据的采集始终充满挑战:一般都是转账,但也有人采用智能合约充币;系统的自动采集要做到完全不遗漏几乎不可能,还需要支持手工采集。账务无法做成离线系统,必须保存到交易系统服务器,被入侵后仍然存在被篡改的可能,但数据库设计的改善可以极大增加篡改的难度,例如增加Hash验证或数据签名。除了安全防护之外,数据库和日志还需要实时或定时备份,定时备份可以采用全量和增量结合的模式。数据库的全量日志理论上可以回滚数据库到任意时刻。做了实时备份,备份方记录全量日志,理论上来说会极大增加数据库的安全:毕竟要攻破两台数据库服务器要难很多。账务难免不出问题,不是哪里算错了就是哪里记错位置了,还需要独立的账务核查系统。账务核查系统只是检查账务的准确性,要验证交易所的记账数据和区块链上的交易数据,是一件耗时的工作,例如有一万个账号和三万个地址需要验证,估计需要三个小时。写作账务核查系统的人,最好没有参与交易所系统相关账务开发,这样两拨人马的账务计算都一致就更能保证账务的准确。账务核查系统一般一天跑一次,做成批处理,可以出报表。有了账务核查系统,出了问题很快就能查出来。所以帐不乱的核心要点就是:复式记账、精准计算、数据库安全、账务核查系统。
    系统可用。系统可用的语义范围很大,也可以说包括了安全、性能、用户体验,等。但这里只讲交易所性能中的撮合性能。服务器软件性能的最大杀手就是IO;交易所最大的性能瓶颈就是撮合,因为撮合要高频的读写数据库,有巨大的IO开销。所以撮合一定要采用内存撮合,性能极高,每秒新增订单可以达到十万级别。各个币对的内存撮合可以分开。新增订单、取消订单、撮合结果,这些数据的持久化要批量写入数据库,比单个写入的性能可以提升十到一百倍。数据库设计也需要做些改进:内存撮合的数据写入数据库的时候,不要判断合法性;尽量少表;字段可以适度冗余;不要有select语句,最好全部是insert、update和delete这样的语句;聚集索引的建立要有利于批量处理;各种计算要放到内存撮合里面而不要放到数据库中;数据可以分为核心数据(例如撮合结果数据)和扩展数据(例如K线图数据),扩展数据保存的优先级可以降低一点,毕竟扩展数据可以完全从核心数据推导出来;还可以采用多数据库。在内存撮合和数据持久化之间,可以增加消息队列,这种做法降低了数据丢失的风险和增加了消峰的能力,还可以为数据持久化处理提供更灵活的方式。从硬件角度来说,可以使用intel的傲胜持久化内存作为数据库的硬盘,其性能估计可以提高二到五倍;如果采用SAN存储也能极大提高数据库性能。所以撮合性能提升的要点包括:内存撮合、批量持久化、优化数据库设计、消息队列,更强大的硬件。
    一个交易所系统能够做到币不丢、帐不乱、系统可用(撮合高效)这三点,就可以支撑很大的业务量。
    交易所的功能一般包括:币币交易,场外交易,杠杆交易,合约交易,有的交易所还有钱包等功能。一般中小交易所就是币币交易和场外交易,大交易所才会做杠杆交易和合约交易。对撮合性能要求很高的一般是API调用,例如做市商参与交易,每秒都会下大量的单和取消大量的单,真正撮合成交的反而较少。杠杆产品在暴涨暴跌时期会有大量的买卖需求,会产生极大的下单和撮合需要。
    对于公司运营和推广来说,还需要各种报表,这些报表要做成离线的,适当的时候可以做成数据仓库系统。
    一点体会,常常给同事讲,技术性较强,看此文最好是交易所相关技术从业人员。

  • 128
    maomiwang

    帐不乱就是账务的准确性。记账要采用超级大乐透复式记账,资金进出双方都要记录。所有的记账记录不允许修改和删除。要注意float数据格式是不精准的,各种情况下的舍入幸运时时彩都需要根据上下文做不同处理。系统的小数位和区块链的小数位不一定一致,但是舍入都要采用统一标准,一般采用系统小数位和区块链十一运夺金小数位中位数最少的