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

本文从技术角度分析中心化交易所的主要技术及其相关难点,主要要求做到币不丢、帐不乱、系统可用。

  • 全球数字资产交易所从2017年的不到两百家,到2019年初的上万家,增长速度极快;再到2023年约百家,下降速度也快。
  • 交易所也常常出现负面消息,例如盗币,例如系统崩溃,等等。币安,中币这样的大交易所在2019年都还出现巨额丢币现象,各种小交易所被盗没被曝光的更是不计其数。有几家大家交易所在特殊时间常常出现系统无法服务的情况(甚至有人戏言拔网线)。
  • 我们尝试从技术角度分析交易所的主要技术及其相关难点: 交易所要做到币不丢、帐不乱、系统可用

    第一:币不丢

    币不丢就是安全性相关。除了技术角度考虑,财务制度(和流程)也是安全性的重要一方面。安全性涉及面太广了,除了传统的网站安全、代码安全、防火墙设置,等之外,还有一个很重要的区块链安全。从区块链技术的角度怎样才能做到无法丢币呢?

    1. 不在线存放私钥。交易所网站不存放私钥,只存放充币地址
    2. 提币操作线下执行(离线签名)。交易所网站收集到提币请求后,把相关请求发送到线下的服务器,由线下服务器输入私钥进行签名,然后再把签名后的提币事务在线执行。 处理方式就是链上交易要离线签名,可以有很多方案,但是采用HD钱包技术是最简单合理的。只需要一个助记词,可以配合Password(其实是Salt)就可以生成无穷尽的地址和私钥。也就是说,老板(或财务)掌握了助记词,记在脑袋中(或者写在纸上,或者离线加密保存),动态生成所有的充币地址(和私钥),离线保存。
    3. 充币入库流程:把离线充币地址导入在线交易所网站,接受用户充币;用户充币后,把充币地址和资产数量导出来到离线钱包,输入助记词(或者密钥)签名,(通过U盘,二维码等工具传递签名事务)再把签名事务在线执行,进行入库(也叫归档)操作;
    4. 提币出库流程:从在线的交易所网站获得提币需求(To地址、币种、数量),在离线钱包输入助记词(或者密钥)执行转载签名,(通过U盘,二维码等工具传递签名事务)然后再在线执行提币事务。
    5. 我们把离线操作的这个系统叫做币管理工具,也是一个离线钱包。 轶事:把私钥发送到区块链网络上面去执行转账就很容易被盗币:以前盗币最简单的做法就是你刚在某区块链节点使用私钥签名转账,盗币者也跟着使用此地址转账,这是很容易成功的(2021[?]年后以太坊geth等客户端取消了这个在线签名功能)。 注意:在服务器上保存私钥很不安全。如果服务器被攻破了,不仅数据会被读取,内存也很容易被读取。

      第二,帐不乱

      帐不乱就是账务的准确性。

    6. 记账要采用复式记账,资金进出双方都要记录。所有的记账记录不允许修改和删除,且有多重备份。
    7. 区块链系统和交易所或钱包系统,其数据存储标准是不一样的。要注意到交易系统中float数据格式是不精准的,各种情况下的舍入都需要根据上下文做不同处理。系统的小数位和区块链的小数位不一定一致,但是舍入都要采用统一标准,一般采用系统小数位和区块链小数位中位数最少的。这种误差也需要统计出来的,一般在账务核查系统中实现。
    8. 由于区块链系统和交易所系统都是独立系统,两个系统的交互具有滞后性,所以始终存在“待收账款”,要体现再财务检查系统中
    9. 充币数据的采集始终充满挑战:一般都是转账,但也有人采用智能合约转账充币;系统的自动采集要做到完全不遗漏几乎不可能,还需要支持手工采集
    10. 在线交易系统的安全会影响财务数据的准确性。账务无法独立做成离线系统,是在线交易系统的一部分,其数据必须保存到交易系统中,交易所系统被入侵后仍然存在财务数据被篡改的可能,但数据库设计的改善可以极大增加篡改的难度,例如增加Hash验证或数据签名。除了安全防护之外,数据库和日志还需要实时或定时备份,定时备份可以采用全量和增量结合的模式。数据库的全量日志理论上可以回滚数据库到任意时刻。做了实时备份,备份方记录全量日志,理论上来说会极大增加数据库的安全:毕竟要攻破两台数据库服务器要难很多。
    11. 账务难免不出问题,不是哪里算错了就是哪里记错位置了,还需要独立的账务核查系统。账务核查系统只是检查账务的准确性,要验证交易所的记账数据和区块链上的交易数据,是一件耗时的工作,例如有一万个账号和三万个地址需要验证,估计需要三个小时。写作账务核查系统的人,最好没有参与交易所系统相关账务开发,这样两拨人马的账务计算都一致就更能保证账务的准确。账务核查系统采用离线数据,一般一天跑一次,做成批处理,可以出报表,出了问题很快就能查出来。如果数据量太大,可以建立数据仓库辅助处理,会极大提高执行效率。 所以帐不乱的核心要点就是:复式记账、精准计算、数据库安全、账务核查系统,等。

      第三,系统可用

      系统可用的语义范围很大,也可以说包括了安全、性能、用户体验,等。但这里只讲交易所性能中的撮合和数据库相关的性能(这也是最重要的方面)。

    12. 服务器软件性能的最大杀手就是IO;交易所最大的性能瓶颈就是撮合,因为撮合要高频的读写数据库,有巨大的IO开销。所以撮合一定要采用内存撮合,性能极高,每秒新增订单可以达到十万级别。各个币对的内存撮合可以分开,各自独立服务器。
    13. 新增订单、取消订单、撮合结果,这些数据的持久化要批量写入数据库,比单个写入的性能可以提升十到一百倍。
    14. 各种计算要放到内存撮合里面而不要放到数据库中。
    15. 为了提升读写性能,数据库设计也需要做些改进:内存撮合的数据写入数据库的时候,不要判断合法性;尽量少表;字段可以适度冗余;不要有select语句,最好全部是insert、update和delete这样的语句;聚集索引的建立要有利于批量处理。
    16. 数据库拆分,可以分为核心数据(例如撮合结果数据)和扩展数据(例如K线图数据),扩展数据保存的优先级可以降低一点,毕竟扩展数据可以完全从核心数据推导出来;还可以采用多数据库。
    17. 在内存撮合和数据持久化之间,可以增加消息队列,这种做法降低了数据丢失的风险和增加了消峰的能力,还可以为数据持久化处理提供更灵活的方式。
    18. 提高硬件配置,例如采用SAN存储,等。 所以撮合性能提升的要点包括:内存撮合、批量持久化、优化数据库设计、消息队列,更强大的硬件,等。 对撮合性能要求很高的一般是API调用,例如做市商或套利者参与交易,每秒都会下大量的单和取消大量的单,真正撮合成交的反而较少。杠杆产品在暴涨暴跌时期会有大量的买卖需求,会产生极大的下单和撮合需要。交易所在发放空投的时候也容易引起性能危机。这几种情况是常见的考验交易所性能的场景。 一个交易所系统能够做到币不丢、帐不乱、系统可用(撮合高效)这三点,就可以支撑很大的业务量。 对于公司运营和推广来说,还需要各种报表,这些报表一定要做成离线的,适当的时候可以做成数据仓库。 我的一点体会,技术性较强,看此文最好是链圈技术从业人员。
  • 本文第一版写于2019年,2023年我修改了点重新发表,是因为我做了一个以太坊的在线钱包和离线钱包,很多功能依照此文处理,为自己记录一下,有感兴趣的朋友也可以对照钱包和文档理解。这两个钱包的目标用户就是交易所人员、大额资产人员,技术人员,空投项目方,等;可能不太适合普通用户。我写的钱包地址是:https://github.com/heddhshan/W-Wallet
  • 2023年发表的这个文章找不到了,2024年我重新发表一次,改了几个错字。
点赞 0
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论
Phi·Wallet
Phi·Wallet
做各类基于以太坊的DAPP和数字资产交易所