PBFT在区块链中的应用
虹桥大宝剑
发表于 2022-12-4 03:15:58
68
0
0
讨论今天的话题前,我们先来了解下公链和联盟链。公共区块链是指全世界任何人都可读取的、任何人都能发送交易且交易能获得有效确认的、任何人都能参与其中的共识验证过程的区块链;联盟区块链是指其共识过程受到预选节点控制的区块链。
我们判断,未来联盟链和公链必有一战,究竟谁能笑到最后现在还不得而知。大家都知道联盟链更注重的是性能,而公链更注重的是去中心化。然而现有的共识机制都不能兼顾性能和公平。
在双方博弈之下,我们关注到了PBFT算法,它是否可以带来一些启发?今天,区块链实验室发起这个话题,希望广大区块链爱好者参与讨论。
PBFT算法特性 L; t' T5 I5 e
PBFT译为实用性拜占庭容错,顾名思义此算法是拜占庭容错的,也就是说可以容忍有一定数量(算法中是(n-1)/3)的“坏人”存在。因为PBFT算法除了需要支持容错故障节点之 外,还需要支持容错作恶节点,假设集群节点数为 N,有问题的节点为f,有问题的节点中,可以既是故障节点,也可以是作恶节点,或者只是故障节点或者只是作恶节点。那么会产生以下两种极端情况:& U; ^5 D; w+ l% Y9 e" k
第一种情况,f个有问题节点既是故障节点,又是作恶节点,那么根据小数服从多数的 原则,集群里正常节点只需要比f个节点再多一个节点,即f+1个节点,确节点的数量就会 比故障节点数量多,那么集群就能达成共识。也就是说这种情况支持的最大容错节点数量是 (n-1)/2。
第二种情况,故障节点和作恶节点都是不同的节点。那么就会有f个问题节点和f个故障 节点,当发现节点是问题节点后,会被集群排除在外,剩下f个故障节点,那么根据小数服 从多数的原则,集群里正常节点只需要比f个节点再多一个节点,即f+1个节点,确节点的数量就会比故障节点数量多,那么集群就能达成共识。所以,所有类型的节点数量加起来就是 f+1个正确节点,f个故障节点和f个问题节点,即3f+1=n。
结合上述两种情况,因此PBFT算法支持的最大容错节点数量是(n-1)/3。+ z8 i H6 [5 ]9 T
联盟链中的应用4 E6 N* [7 e' w7 w& [& S# P) Z
在联盟链中采用的PBFT类共识算法较为高效的解决了多节点参与情况下的典型分布式一致性问题,如消息无序、参与方异常、网络分化等同时,在允许一定比例的拜占庭参与方的前提下,做到了最终一致性。$ @3 s3 N- h* X$ O# n q, N/ U6 M
众所周知,fabric和tendermint的共识机制就是PBFT。联盟链之所以选择PBFT作为其共 识机制,主要是因为它既可以保证一定的去中心化程度,而且还能防止分叉。PBFT使得出块的速度只依赖于网络传输速度,所以瓶颈只在网络层。! t- g+ G9 i: I' Z! K0 l( |0 z) g
fabric中会有多个client同时发送request给PBFT节点,这些请求都是相互独立不重复 不冲突的,所以PBFT节点中的primary需要对这些请求排序并加编号(checkpoint就是当 前节点处理的最新请求序号),按照先入先出的原则依次进行PBFT共识。大部分节点 (2f+1)已经共识完成的最大请求序号叫stable checkpoint,stable checkpoint存在的目的其实是为了减少内存的占用,不用一直缓存记录,序号在stable checkpoint之前的记录可以删除。当主节点挂了(超时无响应)或者从节点集体认为主节点是问题节点时,就会触发ViewChange事件,ViewChange完成后,视图编号将会加1,节点按照顺序轮流做primary。
联盟链中PBFT节点在充分信任的基础上不用设置太多数量,4个其实就已经可以完成实际需要,超过100个PBFT节点就不适用,因为节点越多反而会造成网络带宽压力以及更长的等待确认时间。
PBFT不能算是最好的共识算法,抛开信任问题,在性能上它比不上raft;在去中心化程度 上,它比不上POW和POS;但是在联盟链中,PBFT是目前为止最适合的共识算法,它既满足了一定的去中心化问题,又兼顾了一定的性能。
公链中的应用6 `5 e9 f; u4 X4 _0 g- L6 d
目前公链中应用PBFT的也有很多,例如EOS、TrueChain等,但是它们不是单纯的只用PBFT一种共识机制,往往会结合POW或者POS等其他共识机制一起完成交易出块,主要是出于以下几点原因:
既然是公链,那么就会有成千上万个节点,如果这些节点全部做PBFT显然网络带宽和延迟是无法支撑需求的;
公链最重要的是去中心化,如果只是单纯的采用固定数量的PBFT节点来完成交易出块的工作,势必会造成中心化,且不能给其他节点带来参与感和安全感;2 Y1 |2 Z V. H/ P" C
传统的POW虽然在去中心化上能达到要求,但是在性能上比较薄弱,交易达成时间太过漫长,根本无法满足大多数的高频应用场景,而且容易产生分叉;
采用混合共识机制,既可以满足一定的去中心化要求,又可以保证性能上的高效;" z5 Q" c- P5 c! ?$ O8 y8 {; V; u
当然,混合共识也会遇到一些问题,例如节点竞选策略,leader处理能力瓶颈等,但是这 些问题理论上都可以解决;例如PBFT节点竞选可以通过线下“全民参与”的方式来保证公平性和随机性,处理瓶颈问题是通过原生多链和分片等技术来解决的。; V% T: _- m$ A; [' \
把挖矿、验证分离,挖矿节点只负责执行POW机制,完成挖矿后将待验证的区块发给验证节 点做PBFT共识,共识完成后即刻出块。挖矿和验证相互不干涉,分权分工,这样做的好处 是满足了去中心化和高性能的双重需求。
成为第一个吐槽的人