在共识算法理论基础方面,1985 年,著名的 FLP 不可能定理 被提出。该定理证明,在异步网络的环境下,只要存在节点发生故障,就不可能存在具备最终确定性的共识算法。为了能设计出最终一致性的共识算法,1988 年,Dwork 与 Lynch 等人提出了半同步网络的模型 ,该模型提出一种界于同步网络与异步网络之间的网络模型。在半同步网络模型中,消息可以在能够预测的延迟内传播,但在某些情况下网络可能会发生波动,发生波动时共识可能会被阻塞,但是经过可预测的时间后,最终会恢复正常的共识状态,该时间长度被称为 GST(Global Stabilization Time)。
1989 年,Lamport 提出了一个在部分副本宕机情况下仍能正常工作的主从备份算法 ,这就是最早的 Paxos。Paxos 最早保证了异步网络中分布式集群的安全性,并在同步状态时保证分布式系统活性。不过,基础的 Paxos 协议由于需要先竞选提案权,再对提案进行共识,在此期间存在发生活锁的风险,最终确定性没有得到保证。为了解决该问题,作者也同时提出了一种基于主从结构的 Multi-Paxos 方案。通过一轮基础的 Paxos共识,集群选择一个主节点主导后续的提交过程,只要主节点不发生宕机,后续的提案均由主节点发出。这样做,使得存在主节点的时间段内,系统能够满足最终确定性。后来的 ZAB、Raft 等共识算法,均为在 Multi-Paxos 的基础上进行的优化与改进。
不过,Paxos 等共识算法只能解决分布式系统中的宕机问题,称为宕机容错(Crash Fault Tolerance,CFT)共识算法。此类共识算法无法应对节点主动的恶意行为,即不容拜占庭错误。1982 年,Lamport 等人 提出了著名的拜占庭将军问题,同时也提出两种解决该问题的思路,分别是基于口述消息与基于签名消息的拜占庭容错(Byzantine Fault Tolerance,BFT)共识算法。但是,由于这两种方案的通信复杂度很高(分别为 O(n^m) 与 O(nm) ,n 为总节点数量,m 为拜占庭节点数量),导致算法的使用难度较高。
1999 年,Castro 和 Liskov 提出了 PBFT (Practical Byzantine Fault Tolerance)共识算法,并在 2002 年 对该算法进行了改进。PBFT 建立在半异步的网络假设下,通过主从备份的设计方式,将 BFT 共识算法的通信复杂度降低到 O(n^2) 。在 PBFT 中,节点分为主节点与从节点两种角色,提案由主节点发起,并经由全体节点共识才会被提交。完整的一次共识需要经过 pre-prepare、prepare、commit 三个步骤,对于每个提案,在各个节点经历 pre-prepared、prepared、committed 状态后,才会被最终提交。如果将主从节点之间的一次信息交互称为一轮,PBFT 共识需要经过两轮交互:pre-prepare 与 prepare为第一轮交互,由主节点在 pre-prepare 阶段向从节点广播提案,并由从节点在 prepare阶段广播消息以对这个提案进行确认;commit 为第二轮交互,主从节点都会广播消息以确认该提案可以被提交。在每轮交互中,都需要满足 Quorum 决议的最小投票数要求,才表示完成当前轮次的交互。在这个过程中,PBFT 主要用于防止参与者对集群安全性与活性的破坏,即,保证各个正确的节点都能够获得一致的状态,并且能够持续不断的提供共识服务。不过,由于需要考虑拜占庭容错问题,PBFT 进行主节点切换的子协议非常繁琐。该子协议主要用于主节点异常时切换主节点,并且保证在有拜占庭行为的情况下,集群不会因主节点切换而丧失活性。对于该流程的设计,PBFT 的作者先后在1999 年 与 2002 年 给出两种解决思路,无论哪种思路,都需要收集大量历史共识消息日志,并通过复杂的信息交互与消息校验以最终安全完成主节点切换。发生主节点切换时,在最优情况下,算法完成切换所需要的通信复杂度为 O(n^3) 。由于主节点切换子协议的高度复杂,在实现 PBFT 共识算法时,该流程的正确实现也最具挑战性。
2008 年,随着比特币的出现,各种基于区块链的证明类共识算法相继被提出。通过基于哈希运算构建的块链式数据结构,区块链系统可以通过“最长链原则”来确认系统状态是否一致,即,通过最后一个区块的一致性来确定系统整体状态是否相同,降低了证明成本。同时,密码学相关技术也在进步,更多的计算资源与更高效的密码算法为计算机技术进步铺开道路。聚合签名,是一种用来将任意多个签名聚合成一个签名的变体签名方案。对于 (k, n) -聚合签名方案,意味着在总数为 n的集群中,只要由 k个人完成签名,即将它们聚合称一个有效的聚合签名。2018 年,基于半异步网络假设与主从备份的设计方式,结合块链式结构思想,使用聚合签名技术,Yin 等人提出了链式BFT 共识算法 HotStuff 。相比较 PBFT,HotStuff 的最主要贡献在于实现了线性主节点切换,该算法中,提案需要经过三轮交互才能够被提交,虽然增加了少许通信延迟,但是这样的设计方式简化了 PBFT 中复杂的主节点切换流程,也更便于工业化实现。此外,HotStuff 在共识算法中加入了聚合签名,使得在每轮主从节点的交互中,从节点只需要向当前轮次主节点单播消息,由主节点收集投票并聚合成为一个决议证书(Quorum Certificate,QC),再将 QC 其广播给从节点,从节点从过对 QC 进行校验就可以对当前轮次的 Quorum 决议进行验证。通过这种机制,将 BFT 算法的通信复杂度进一步降低到 O(n) ,更低的通信复杂度也让 HotStuff 具有更好的扩展性。
在半异步 BFT 共识算法的研究过程中,研究人员也尝试采用可信执行环境(TEE)来解决拜占庭攻击,从而将 BFT 问题简化为 CFT 问题,代表性的算法有 MinBFT 、cheapBFT 、FastBFT 等。相比较未使用 TEE 的 BFT 共识算法,由于只需要考虑宕机问题,容错阈值也会更高。节点的拜占庭行为主要通过伪造错误的消息从而破坏系统的安全性,应用 TEE 的共识算法通常使用 TEE 辅助进行消息处理,获取可信的逻辑时钟,以排除拜占庭行为,使得节点只可能出现宕机这一种错误情况。在此类共识算法中,FastBFT 通过 TEE 辅助实现了独特的共识思路,作者提出了一种树形结构的通信模式,将节点通信复杂度降低到 O(1) ,算法的扩展性进一步得到了提升。另外,FastBFT通过 TEE 辅助实现了基于异或运算的秘密分发与聚合方案,相比较聚合签名来说,该秘密信息聚合的速度得到提升。不过,由于恶意节点能够故意引发树形通信的成员更替,FastBFT 的运行依赖于相对稳定的集群环境,且基于 TEE 的共识算法的正确性均依赖于可信硬件,应用场景存在限制。
半异步的 BFT 共识算法普遍有让人满意的性能表现,在有高容错要求的联盟链当中,常使用此类共识算法以满足容错需求。不过,半异步 BFT 共识算法都需要在 GST 假设下才能满足活性要求,在更加复杂的网络环境中,例如跨大洲部署的集群网络,很难获得稳定的通信延迟,半异步 BFT 共识算法的可靠性也会随之下降。为了在更复杂网络环境中完成共识,需要设计异步的 BFT 共识算法。FLP 不可能定理提出,如果存在错误节点,就无法在异步环境下构建确定性共识。半异步共识算法从网络假设上进行取舍,此外,研究人员发现,若通过概率性确定的方式,也可以绕开 FLP 不可能定理从而在异步网络中完成共识。
2016 年,Miller 等人 提出了首个实用的异步 BFT 共识算法 HoneyBadgerBFT,通过引入多轮随机数的方式,使得各个节点在重复多轮的共识之后,可以获得较高概率一致的共识结果。另外,HoenyBadgerBFT 作为一种异步共识算法,不存在特定的主节点,每次共识中,各个节点都可以发起提案,每轮共识所提交的内容,由最终被选中提案共同组成。为了提高共识效率,各个节点会选择部分交易打包为提案切片,防止出现重复交易。不过,由于异步 BFT 共识算法需要经过多轮重复的共识轮次后,才能获得能够被提交的结果,因此具有更高的延迟,在广域网中尤为明显,部分场景中共识延迟会达到 1 分钟以上。2020 年,Dumbo 对 HoenyBadgerBFT 存在的问题进行针对性优化,揭示其性能受限的根源是大量随机化子模块调用导致的运行时间增加,大幅降低了算法延迟,使得异步 BFT 算法有了更高的实用价值。