所谓 P2P 系统,就是所有节点地位平等,没有老大的系统。没有老大有一个最大的问题,就是没有了事实裁决的能力。各个节点如果出现了数据不统一,如何达成共识就变得困得。补充一句,共识的意思就是大家都认可同一份数据。你可能说,大家举手表决少数服从多数不就行了,恭喜你,你提出的就是一种共识算法。所谓共识算法,就是一套大家如何达成统一套规则。常见的共识算法有 POW ,POS 以及今天我们要聊的 pBFT ,英文全称是 Practical Byzantine Fault Tolerance ,实用拜占庭容错。

拜占庭将军问题

P2P 网络上的共识算法,本质上的确都是少数服从多数。但是你可能会说,就这么简单吗?但是为啥 POW ,POS 那些算法看起来那么复杂呢?在网络上,大家实现可靠的举手表决过程其实非常的困难的。这种困难就可以用拜占庭将军问题来描述。

拜占庭将军问题是图灵奖大牛 Leslie Lamport 为描述分布式系统一致性问题( Distributed Consensus )在论文中抽象出来一个例子 http://lamport.azurewebsites.net/pubs/byz.pdf 。论文中提到,

一个可靠的计算机系统必须能够应付出现故障的组件给系统的不同部分发送互相冲突的信息的情况。

这种情况可以用一群拜占庭将军围攻一个城市的例子来做个比喻。这些将军驻扎在城市的各个方向,互相之间只能用信使来通信,大家必须达成一个共同的作战计划。但是,这些将军中是有叛徒的,叛徒会传送自相矛盾的信息来迷惑大家。BFT 的目标就是如何让大家最终能够达成共识。

准确的说,所谓 BFT ,也就是拜占庭容错,指的就是在系统上有一些恶意组件不断发送错误信息的情况下让系统依旧正常运行的能力。实现 BFT 有多种算法。其中一种最为常见的叫 pBFT 。

pBFT 原理

下面来聊聊 pBFT 的原理。pBFT 的论文 http://pmg.csail.mit.edu/papers/osdi99.pdf 是1999年提出的。很多分布式计算机系统都采用了这套算法。后来在区块链领域,pBFT 也是非常的有影响力。

pBFT 模型下,有一个节点会被当做主节点,而其他节点都是备份节点。系统内的所有节点都会相互通信,最终目标是大家能以少数服从多数的原则达成数据的共识。如果主节点出现明显的撒谎迹象,其他的节点也可以联合起来更换主节点。

每一个共识过程分下面这四步:

从第四步也可以看出,只要客户端能保证多数人认可了一个相同的结果,这个结果就是最终的共识了。具体的数学论证我们不展开,但是有这样一个结论:pBFT 模式能够工作的前提是系统上撒谎的节点不能超过总节点数的三分之一。

优点和缺点

pBFT 被用在区块链领域做共识算法,所以我们最后就来讨论一下它跟最常用的 POW 算法对比起来,有哪些优缺点。

先说优点。首先,pBFT 无需等待确认。pBFT 中发一个交易,不需要像比特币的 POW 算法那样,去等待六次确认。如果一个区块通过 pBFT 算法被系统认可了,那么这个区块就是最终区块了,不会被撤销。因为各个节点达成共识是在同一时刻决定的,所以用 pBFT 维护的区块链不会跟 POW 那样分叉,所以也就不用等待确认以保证当前区块所在的链是最长链了。其次,pBFT 不用耗能。因为 pBFT 是无需挖矿的,所以每一次共识过程也就不会像 POW 那样去耗费大量电能了。总之,pBFT 高效而节能。

但是 pBFT 也有明显的缺点。首先,最大的缺点是节点数不能太多。因为要保证各个节点间的频繁的通信,所以整个共识网络不能太大,这样就让整个网络不可能像 POW 那样做到全球范围的去中心化了。其次,pBFT 不能防止女巫攻击。POW 之所以要耗能,很大一个原因就是要防止女巫攻击。女巫攻击指的是,一个恶意用户用各种方法伪造多个账户来进行共识过程。POW 是通过巨大的金钱消耗来增加伪造一个新账户的难度,而 pBFT 就没有这一层保证了。所以 pBFT 比较适合有准入许可的联盟链,不太适合做无准入门槛的公链。

总之,pBFT 跟 POW 的区别是非常明显的。

总结

关于实用拜占庭容错算法 pBFT ,我们就聊这么多了。总结起来,共识算法的本质虽然也是举手表决少数服从多数,但是由于网络上各个节点互不见面,可能有两面三刀的撒谎节点等各种问题,让举手表决变得异常的困难,这种情况的一个比喻就是拜占庭将军问题。拜占庭容错 BFT ,就是能够让系统在存在撒谎节点的情况下继续正常工作的能力。具体的算法有多种,pBFT 是最常见的一种。另外还有 dBFT 代理拜占庭容错,和 aBFT 异步拜占庭容错等。

参考: