联盟链共识算法优化之路

共识机制作为区块链的灵魂,无论是公链还是联盟链,共识机制都从根本上限制了区块链的交易处理能力和扩展性。共识机制从大的方面可以分为两类:无需准入的共识协议和需要准入机制的共识协议,两者的代表分别是Nakamoto类共识和BFT类共识。

Nakamoto 共识在公链上应用广泛,巧妙地解决了在无须许可的情况下的共识问题,它同时是一种基于概率的共识协议。在具体商业应用环境中,许可机制已经保证了一定程度上的节点可信度,在这样的前提下,用户更关心执行效率和最终确定性,这是BFT类共识在联盟链中流行的原因。

PBFT 是首先得到广泛应用的 BFT 算法,PBFT算法由于其消息广播的特性,共识性能的优劣往往对整体系统的性能有很大影响。因此各家厂商都提出了针对区块链场景的若干改进版的BFT类共识算法,本文尝试汇总其常见的优化思路。

我们可以简单地将区块链中完整的共识流程分为三部分:区块打包,区块共识和执行,区块提交;经过我们统计在多数应用场景中区块打包和区块提交分别占5%左右的时间,而区块的共识和执行占时间到90%左右。

打包并行

在PBFT共识算法的每一轮共识,都包括打包阶段和共识阶段。在Leader打包新区块时,其他的共识节点处于等待状态。在多轮共识中,每一轮都包含新的打包阶段和共识阶段。

设打包阶段的时间开销是t,共识阶段的时间开销是u,n轮共识的时间开销为n * (t + u)。如果我们在第一轮共识时,Leader打包的过程中,下一轮共识节点也提前进行打包,这样一旦当前轮共识失败,在新的一轮共识时,就不需要再进行打包,可以直接广播进入共识阶段,则总的时间为n * u + t。

这种优化方式在网络状态良好的情况下,基本上共识能在一轮达成,对性能并没有提升,但是在网络状态不好的情况,存在多轮共识时,有比较小的性能提升;

我们看到在BCOSCITA中均采用了这样的优化方式。

交易验签

在共识协议中,共识节点收到Leader发送的Prepare包之后,需要验证其中每笔交易的签名的有效性,但是我们知道交易的验签是非常耗时的操作,这样就增加了共识协议的时间开销。

在交易插入交易池的时候,会进行一次签名验证,而后会将交易广播给其他节点,所以共识节点在接受到Prepare包时,共识节点有非常大的概率已经验证过大部分交易了。因此可以考虑缓存交易池验证的结果,在接收到Prepare包时,首先去缓存中查询结果,在将未验证的交易进行验证。

我们看到在BCOS和CITA中均采用了缓存交易验签的方式,同时在交易验证时都采用了并行验证的方式加快交易验证的速度,充分利用多核的优势,这样可以明显提升共识的Prepare阶段的性能。

共识和执行拆分

在区块链中,共识包括两部分:“输入共识”和"输出共识",输入共识指的是区块中交易的顺序的确定,输出共识指的是交易执行后的最终状态。在传统的联盟链中(例如在Quorum和BCOS中)的做法是节点在接收到交易后,直接执行,生成最新的预备区块,在Leader节点广播Prepare包之后,其他共识节点收到Prepare包中的区块将交易重新执行一遍。我们可以看到在整个共识的流程中,区块生成和验证的过程中,交易各执行一次,而且两次是串行的。考虑到交易执行通常占用的时间比较多,这里的时间利用率非常低。

区块链是一个连续共识的过程,CITA将交易的执行和共识进行拆分,避免了两次执行的问题。根据复制状态机的原理:起始状态一致,执行交易顺序一致,执行过程是确定的,三个条件都满足的情况下就可以保证最终结果一定会一致。在区块链中起始状态由创世块来保证一致,虚拟机是完全确定的,所以只要保证交易顺序一致就可以保证其最终结果一定一致。在区块链中Block的preHash已经包含了上个块交易处理之后的世界状态信息。CITA-BFT对当前区块的交易顺序和上个区块的执行结果进行共识。这样在共识过程中不需要去执行交易,而只需要在共识完之后进行一次交易处理,大大提高了整个链的吞吐量。CITA-BFT是针对区块链连续共识的特点进行了优化,采用了先共识后处理的方式,使得共识的过程不必执行交易,只需要共识完成之后执行一次交易即可。经过验证,在最简单的存证交易时,共识性能有35%左右提升。

中钞金融区块链中采用了同样的方式进行优化,首先,共识节点选择Leader出来,但是Leader节点不是出候选块,而是广播候选块中的交易列表给其他节点,然后所有共识节点同时基于这个交易列表计算链的最终状态,然后根据交易列表和最终状态得出候选块就行投票,当超过三分之二的节点得出同样的候选块时,该候选块共识成功。这个方案,在考虑网络传输的损耗下,整体TPS有大幅度的提升。

我们看到CITA和中钞区块链均采用拆分共识和执行的方式,避免两次执行,极大地提高了整体性能。

优化Commit阶段

在传统的PBFT中在最后的Commit阶段,需要Leader收到足够的Commit包并广播给其他节点。区块链是一个连续共识的过程,在CITA-BFT中,Block中共识投票是上一个区块的投票,所以合并了Commit阶段的Leader广播最终区块过程和下一个高度的Proposal阶段,这样节省了一轮广播过程,通过下一个高度Proposal的过程统一了Commit投票信息。

Proposal预处理技术

在传统的BFT设计中,因为共识和交易执行是串行执行的。联盟链在多数情况下,网络状况良好能在一轮共识流程中完成共识,CITA-BFT中引入了Proposal预处理的技术。在Pre-prepare阶段,节点在收到Proposal之后可以直接处理交易,而不必等到共识流程完成,等到共识流程完成之后再将共识结果通知交易处理器。在传统的PBFT的过程中,交易处理和共识是串行的,引入Proposal预处理之后,可以使得共识的Prepare阶段Commit阶段和交易处理并行进行,大大提高了整个系统的吞吐量。经测试,对于简单的交易处理,有10%到20%左右的性能提升。

CompactBlock技术

在CITA中采用了CompactBlock的技术来压缩共识区块的大小,提高网络带宽利用率。Block中的交易已经单独广播过一次,所以共识Block中只需要包含交易ID即可,这样可以大大降低区块消息的大小。经测试在网络条件较好的情况下,对于简单的交易处理,有5%到10%的性能提升。

总结

本文未覆盖所有的联盟链共识算法技术上的创新,但是可以看出当下各个区块链厂商已经在共识算法上做了非常多的探索和优化,在性能方面已经有大幅提升,共识算法已经基本可以满足普通的应用场景的需求。

参考:
https://www.ccvalue.cn/article/207596.html
https://www.blockob.com/posts/info/20263