异步架构

TIP

此文档仅作为介绍使用,若需要了解详细细节,请浏览 Vite 白皮书

Vite中的异步设计主要包括三个方面:

  • 请求和响应的异步设计
  • 交易写入和确认的异步设计
  • 合约间通信的异步设计

异步请求模型

Vite中的交易分为请求交易和响应交易。无论是一笔转账还是一次合约调用,均会在账本上先后生成两笔交易。

异步请求图解

一笔转账交易可以拆分成一个出账交易和一个入账交易;一个合约调用交易可以拆分成一个合约请求交易和一个合约响应交易;每个合约内部的消息调用,可以拆分成一个合约请求交易和一个合约响应交易。

这样拆分之后,每个交易只影响一个账户的状态,交易之间不会彼此阻塞,有利于与提高系统的吞吐能力。同时,不同账户的交易可以分布在网络中的不同的节点上,为系统带来了扩展性。

异步确认模型

Vite中,交易写入账本和被系统确认也是异步的。不同的用户可以并行的将交易写入账本,快照链将以固定的速度对账本进行快照。一旦交易被快照,就可以认为是1次确认,随着快照链的增长,确认数也会累积。

异步确认图解

异步确认机制可以削平交易写入速率的峰谷,最大化利用系统资源。

Vite采用分层的HDPoS共识算法,账本中每条账户链产生候选的局部共识结果,最高层级的快照链从局部共识结果中选择出最终的共识结果。

异步通信模型

Vite的合约间通信采用了一种基于消息驱动的架构,合约间不共享状态,只通过彼此发送消息进行通信。

异步通信模型图解

一个合约调用另一个合约,需要先发送一个请求交易,在逻辑上类似于向MQ中生产一个消息。运行目标合约的节点观测到这条请求交易后,向账本中写入一个对应的响应交易,并更新合约的状态。这个操作相当于从MQ中消费一条消息。如果需要返回结果,目标合约会以同样的方式向源合约发送另一条消息。

在这个模型中,Vite的账本担任了消息中间件的角色,并且可以保障消息的Exactly Once语义。

基于消息的架构具有高吞吐和扩展性的优势。但与此相应,付出的代价是编程模型变得相对复杂,无法保证强一致性,而且有可能使延迟变大。

Vite将提供Solidity++合约语言以及完善的SDK,降低异步编程的成本。经过认真的研究,我们发现在实际场景中,强一致性语义是可以用BASE语义替代的。由于Vite的HDPoS共识算法可以保障交易确认在1秒之内完成,因此,延迟的增加仍然在可控范围之内。