迅雷链采用了同构多链架构,将不同的账户锚定在不同的同构链上,然后接入层将交易路由到发送方所在的链上进行区块打包与共识。
共识成功的区块中的交易会根据接收方所在的链的不同,跨链转发到相应的链上。若交易接收方与发送方同属于一条链,则不再进行交易转发。
在每一条同构链上,验证人节点对打包好交易的区块进行共识。共识采用优化过的PBFT算法。
以处于某一区块高度的共识操作为例,由于共识的达成需要超过2/3的节点确认,因此每一次共识可能需要多轮投票才能达成。
与传统的PBFT算法类似,对于每一轮共识操作,又包括三个阶段:Propose,Prevote和Precommit。
当在某一轮达成共识(收到+2/3的Precommit投票)后,就会进入对下一个高度的共识,从第0轮开始。下面简单介绍下详细的步骤:
首先介绍一个锁定区块的概念,表示在某个特定的高度和轮数,节点对某个块收到超过节点总数2/3的Prevote投票集合后,则此节点对于此高度此轮的区块进行锁定。也就是说,节点以锁定区块来表示对某一个区块的认可。
Propose阶段:系统中所有验证人节点轮流作为提议者提出提议,而系统中非提议者的节点在收到提议后,就会进入Prevote阶段。如果当前节点此前存在已锁定区块,则还需要收集所有针对已锁定区块的Prevote投票。
PreVote阶段:当节点进入到Prevote阶段后,每个节点广播自己的PreVote投票。
具体的,如果当前区块高度或投票轮数高于此前已锁定的区块高度或轮数,则将原锁定的区块进行解锁。
如果此时节点仍含有未解锁的区块,则对此锁定的区块投PreVote投票。或者如果节点收到合法的Propose区块,则对此区块投ProVote投票。
当阶段超时或者接收到大于2/3的针对某个块的投票后,则节点锁定此区块并进入
PreCommit阶段:当节点存在已锁定区块,则对此区块投PreCommit投票。当节点收到针对已锁定区块大于2/3的PreCommit投票是,就可以将这个块Commit,并且进入针对下一个高度块的共识。
若PreCommit阶段定时器超时,则节点保存已锁定区块,然后重新返回到Propose阶段。
各节点通过在以上阶段上循环,对区块进行一致性共识。与PBFT算法类似,迅雷链共识也经过了三阶段提交,但通过引入区块锁定操作,通过缓存待确认区块,降低了未达成共识情况下重复通信区块带来的网络压力,从而提升了共识效率。