如果一个交易所的某个子系统通过去中心化的方式来实现,从某种意义上来说它就可以归类为去中心化交易所。如果我们从去中心化的程度的这个视角来观察已有的去中心化交易所,就会发现其中一些会显得不够去中心化,另外一些则去中心化程度更高一些。选择哪些子系统用去中心化的方式来实现,整个系统的去中心化做到什么程度,目前业界并没有共识,各家按照自己的理解进行取舍,但是最终的结果却能够体现设计者对去中心化的关切程度,以及在去中心化和系统灵活性、性能之间的权衡。ViteX做为去中心化交易所的一个后来者,将自己的目标设定为尽力做到最大程度的去中心化,这体现在核心系统全部通过去中心化的方式来实现,同时为了兼顾一定的灵活性及更好的用户体验,一些非关键部分通过中心化的方式来实现。下面我们就按去中心化和中心化两个部分拆解开来介绍ViteX的实现。
一、去中心化的实现
交易所的核心系统包含资产管理、下单及撮合、结算等,另外作为ViteX经济模型的重要组成部分,VX挖矿和分红也是ViteX的系统核心,这些功能都是通过去中心化的方式来实现的。下面就对这些子系统的去中心化实现依次进行介绍。
1.资产管理
用户通过自己的钱包地址发起一笔带有转账的交易来调用dexFund内置合约接口进行充值,资产转入后会锁定在交易所合约内。合约的实现保证除了通过合约提现接口外,没有其他入口可以触发合约持有资产的转出,从而保证资产的安全。提现操作是用户主动发起的一笔类似的交易,不同的是会触发dexFund发起一笔从合约到用户地址的转账操作,实现资产从dexFund到用户地址的转移。dexFund会为每个充值地址分配一个kv存储,用来存储该用户的所有币种余额,这些地址的账户余额累加应该刚好与dexFund合约在vite链上账本持有的资产余额一致,这就是之前文章提到的对账功能所依赖的底层实现机制。从以上可以看出,资产的流转、持有都通过合约来实现,中间没有人为干预,从而实现了资产管理的完全去中心化。
2.下单、撮合及撤单
用户通过钱包地址发起一笔下单请求交易到dexFund合约,dexFund对请求进行校验,资产检查及冻结,如果以上操作成功,则调用dexTrade进行实际的撮合操作,否则提交订单失败。dexTrade合约实现了taker-maker撮合模型,也就是按照价格最优、挂单时间次优的规则组织订单薄,并进行实际的撮合。对于新提交订单A来说,如果能够根据价格匹配到对手订单B,则该笔撮合的双方中A作为taker,B作为maker,撮合价格以maker B的价格执行。如果A和B撮合完后,还有未成交部分,则继续匹配订单薄中有序的下一个订单C,和B类似,C也做maker执行撮合。这样A作为taker依次撮合订单薄中的订单,直到A全部成交,或者没有可以匹配的订单为止。如果A有未成交的部分,或者A完全没有匹配成功,则A就成为maker添加到订单薄,等待其它taker的匹配。
撤单和下单类似,不过只需要在订单薄根据订单key进行查找,如果找到则删除订单,并对未成交部分进行退款操作。
从以上过程可以看出,整个下单校验、撮合、挂单及撤单过程都是通过链上合约来执行的,订单薄也完全存储在合约内,是一个完全去中心化的实现。
3.结算
订单成功撮合,订单撤单及后续会提到的挖矿、分红都会涉及资产的结算,因为实际资产都锁定在dexFund合约内,所以结算只需要通过修改dexFund内各账户的余额即可。订单撮合和撤单的结算类似,由dexTrade合约发起一笔包含【地址、币种、金额增减】三元组为参数列表的请求交易到dexFund合约,dexFund合约根据三元组定位到内部的账户kv存储进行相应的和金额增减。挖矿和分红操作因为都在dexFund合约内部实现,因此不需要跨链发起结算,所有操作都在dexFund内部通过完成,区别在于挖矿只进行VX金额的增加,分红则涉及VX金额冻结、分红手续费入账。
4.挖矿
挖矿会涉及VX转入、VX铸币销毁、VX挖矿曲线控制、挖矿指标统计及挖矿算法。
VX铸币时已经设置为不可增发,这个是由Vite链来保证的,铸币后的VX通过dexFund合约提供的专有接口一次性转入合约,合约没有提供入口实现VX的转出,这就保证未挖出的VX会永久锁仓在dexFund合约内,不能够提前释放。
2019年12月,ViteX调整了挖矿规则,包括VX的销毁及挖矿曲线的优化。dexFund合约提供的专有接口来实现一次性VX销毁操作,具体的销毁由Vite链的公有协议实现。新的挖矿曲线由dexFund合约的算法来实现,该算法以挖矿起始周期为基准计算当前周期距离基准周期的距离,以距离为参数计算当天应该释放总量,从而保证每日释放的VX总量和预先公布的VX数额一致。
目前挖矿包含抵押Vite挖矿、交易挖矿、邀请挖矿及挂单挖矿。对于抵押Vite挖矿,由抵押和解抵押操作产生的余额变动会存储在dexFund合约内,同时合约还会记录抵押总额的相应变化。交易挖矿、邀请挖矿的处理逻辑和抵押挖矿类似,不同的是累积的指标是交易手续费和邀请人奖励手续费。在一个挖矿周期结束后,dexFund合约执行相应的挖矿算法,具体过程为读取每个地址的挖矿指标并计算该指标在总额指标所占的比例,并分配等比例的VX作为挖矿金额入账该地址。
每个周期挂单挖矿的总额会通过dexFund合约入账到一个运营地址,后续由中心化服务调用dexFund合约操作该地址完成具体的挖矿金额入账。
通过以上描述,可以看到,除了挂单挖矿外,其他挖矿相关的全部指标和算法都在合约内去中心化实现。
5.分红去中心化
分红涉及VX锁仓,解锁及分红算法。
VX锁仓及解锁都通过用户发起相关交易到dexFund合约触发,在合约内部会存储每个地址锁仓的金额,及当前周期锁仓VX的总额。在周期结束后,依据以上两个指标计算每个锁仓地址应得的分红比例。实际的分红金额是历史累计的分红池总额,每个周期的分红池由上个周期总额的99%滚动到当前周期的金额加上本周期的手续费总额组成,当前周期会分红上面得到的池内总额的1%,其余99%继续滚动到下个周期,计算逻辑同样在dexFund合约内完成,分红金额直接入账dexFund合约内的用户账户。
6.交易对运营
任何地址都可以调用dexFund合约销毁1000vite来开通自己有运营权限的币种的新交易对,开通后即持有该交易对的运营权,币种和交易对的运营权限都可以转让。持有一个交易对的运营权限就可以设置该交易对的运营商费率,打开或者关闭挂单开关。以上运营动作都通过调用dexFund合约对应的接口来完成了,相关状态全部记录在合约内,实现了交易对运营的去完全去中心化。
二、中心化实现
1.市场行情
每个交易对的涨跌幅,成交量、K线图、深度等用户关心的市场行情数据,由中心化服务爬取链上订单撮合结果聚合生成,对合约来说这个是只读的,按需聚合的结果能够为用户提供丰富的功能。
2.订单多维度查询
和市场行情类似,订单状态也是通过爬取链上订单状态进行多维度存储,用户查询该服务来获取历史订单,并可按条件查询未成交订单并根据需要操作撤单。
3.挂单挖矿
挂单挖矿相比抵押挖矿、交易挖矿来说涉及的指标更为庞杂,并且业务需求也更加多样,并不适合固化在合约内部实现,我们采用了中心化的方式来实现,具体细节后续会有专门文件进行介绍。
三、总结
以上我们按照是否去中心化实现这个视角将ViteX子系统的实现细节进行了一一介绍,从中可以看出ViteX的去中心化程度是非常高的,充分体现了我们对去中心化、公开透明的承诺。