NoxBFT

联盟链的共识机制大多选择确定的共识算法,如RAFT,PBFT等,这些共识算法不存在分叉问题,因此在节点总数不多、网络规模不大的时候可提供较高的产块效率。但随着节点数量增多到几十甚至上百个共识节点的规模,所需要交换的信息量也呈指数级增长,最终导致系统负载增加及网络通信量增大,性能下降会很明显,因此其可扩展性不强。

为了更好的适应大规模应用场景,平台基于HotStuff算法,实现了一种可扩展、高性能的新型的共识算法—-NoxBFT。NoxBFT算法在保留原有RBFT算法高效性与鲁棒性的前提下,从三个方面实现了支持以千为数量级的大规模节点组网共识。首先,NoxBFT通过星型网络拓扑结构将网络复杂度将降低至n;其次,NoxBFT通过聚合签名实现了签名的快速验证,同时还支持动态扩展。

建议参照术语部分的名称解释阅读下文内容。

共识流程

NoxBFT算法的共识流程主要是Proposal提案阶段与Vote投票阶段的循环,具体流程如下图所示:

NoxBFT - 图1

  1. Transaction&Broadcast:任意节点收到交易之后,首先将其存入到本地mempool中,随后将其广播给其他所有节点,收到广播的节点也会将其存入到各自的mempool中。每个节点在接收到交易后,都会进行交易的去重判断,剔除重复交易之后才能进入到节点的mempool中;
  2. Proposal:当前轮次的主节点负责进行打包,从mempool中取出若干笔符合要求的交易打包成一个batch,并附带上一轮的QC封装成一个proposal,广播给其他节点;
  3. Vote:所有的节点在监听到提案消息后,都会验证proposal的合法性(safety rules),验证通过后,首先检查该proposal中的QC证书(QuorumCert)是否达到了3-chain安全性提交规则(commit rules),达到后则直接提交区块,等待区块执行完成之后将其中的交易从mempool中移除(CommitTxs)。最后,节点会将投票(vote)信息发送至下一轮的主节点。需要注意的是,每个节点的投票中都会附带上节点签名; Proposal:下一轮的主节点收到quorum个vote后,聚合成一个QC,并开始下一轮打包,并重复步骤2与步骤3,一直到出现超时的情况。

超时轮换

当主节点由于网络原因或者其他因素导致从节点无法按期收到Proposal进行投票时,NoxBFT就会触发超时机制,通过Pacemaker活性模块让全网快速地进入到下一个round继续共识。

超时轮换主节点的流程如下图所示:

NoxBFT - 图2

  1. Transaction&Broadcast&Proposal:所有共识节点接收交易并且广播交易,当前的主节点正常的进行打包并广播proposal;
  2. Round Timeout:由于网络原因,导致主节点proposal并没有及时地发送到从节点,因此从节点不会对本轮次进行投票;
  3. Broadcast TimeoutMsg:所有节点都无法按期收到本轮的Proposal,导致超时,全网广播TimeoutVote消息,其中会附带上本节点当前所处的轮次号以及节点的签名;
  4. Proposal:下一轮的主节点在一定时间内收到 quorum个TimeoutVote消息,构造成TC(Timeout cert),并从mempool中取出若干笔合法交易打包成batch,即可将TC与batch封装成一个新的提案proposal进行广播。