PBFT实用拜占庭容错算法原理
本篇文章开启区块链共识算法的普及——我以 PBFT (Practical-Byzantine-fault-tolerant)实用拜占庭容错共识算法打头阵。
为什么先是PBFT呢?
一个原因是觉得这个算法的名字很酷,实际上它也有着有趣的历史背景。另一个原因呢,就是最近在接触联盟链,而这个算法呢,正是联盟链的共识算法的宠儿。
共识算法概览
联盟链有两个共识算法:一个是本章将去讲的PBFT,另一个就是DBFT(Delegated Byzantine fault tolerance)委托拜占庭容错共识算法。
在区块链中有一个著名的问题,就是拜占庭将军问题,对于拜占庭将军问题,这里不再做普及,因为网上相关的文章已经很多了。不了解的同学移步至此拜占庭将军问题。
PBFT为何而来
PBFT 刚开始是在MIT的Miguel 和 Barbara Liskov在1999年的学术论文中提出的,他们的本意是为设计一个低延迟存储系统设计系统,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行,主要是为了应用于不需要大交易量但需要处理许多事件的数字资产平台,每个节点都可以发布公钥,这是被允许的。
节点将签名所有通过节点的消息,以验证其准确性。当得到一定数量的签名想用,此交易就被认定为有效。
解决了BFT(原始拜占庭容错算法)效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。
PBFT对付恶意节点
几个数字
了解即可,后面会提到
f 是恶意节点数,N是总结点数
- 3f : 临界点数
- 3f + 1 :总结点最小数
- (N-1)/3 :最大容错节点数
当节点数>3时,拜占庭将军问题的有解情况将会比较复杂;
For example:
N = 3f
当恶意节点数f = 1时,总结点数N = 3f = 3时,问题将会无解,如下图所示
显而易见,在f = N/3的时候,整个节点系统都将无法做出正确的决定;因为恶意节点恶意传递结果,导致无论恶意节点时发令者还是接令者,都会坏了整个结果的输出;
N > 3f
当恶意节点数f = 1时,总结点数N > 3f = 4时,问题将会得到解决,如下图所示:
无论恶意节点如何恶意地传递信息,由于还存在着其他三个公平节点,因此最后总是能够少数服从多数,得到最终的结果。
为什么最大容错节点数是(N-1)/3 ?
假定节点总数是N,作恶节点数为f,那么剩下的正确节点数为N - f
。
意味着只要收到N - f个消息且N - f > f
就能做出决定,但是这N - f
个消息里可能有f个是由作恶节点冒充的(或因网络延迟导致f个恶意节点的消息先被收到),那么正确的消息就是N - f - f
个。
为了多数一致,正确消息必须占多数,也就是N - f - f > f
,所以N最少是3f + 1
个。
总结
1.优点
- 节能。
- 吞吐量高。
- 分叉几率很低。
- 节点数适当时交易延时极低。
- PBFT中的主节点并不具备很大权限,与普通节点地位相对平等,如果主节点出现问题,普通节点可以拒绝其请求并可以很容易地将其替换。
2.缺点
- 节点需要选举或许可,不像PoW可以随意加入,去中心化程度相对较弱。
- 不能很好的存贮记录交易信息,黑客能够截取一些失效的副本,这可能会让信息外漏。
- 系统节点是固定的,无法应对公有链的开放环境。因此只适用于节点数量少且网络环境更可信的联盟链或私有链。
- 安全边界较Pow等算法相对较低。Pow对网络内恶意算力容忍度为不超过1/2,PBFT对恶意节点数的容忍度则为1/3。
- 受节点数量限制,可扩展性差,由于每个副本节点都需要和其它节点进行P2P的共识同步,因此随着节点的增多,性能会下降的很快。