1、共识基础
人们对共识机制的研究其实由来已久,从上世纪70年代就开始了相关研究,其目的是为了解决分布式系统中的一致性问题。Fischer, Lynch 和 Patterson在1985年发表的论文中提出了可以说是最重要的分布式系统定理:FLP不可能定理(在异步通信场景,即使只有一个进程失败,也没有任何算法能保证非失败进程达到一致性);2000年,EricBrewer教授又进一步提出了CAP猜想:一致性、可用性和分区容错性三者无法在分布式系统中被同时满足,并且最多只能满足其中两个;2002年,Lynch与其他人证明了Brewer的猜想,从而把CAP上升为一个定理。这期间和之后,涌现了一些著名的分布式一致性算法,如LeslieLamport在1989年提出的Paxos算法,1999年Castro和Liskov提出的PBFT算法等。直到比特币采用POW进行记账后,共识算法才真正进入到了大众的视野里。
一般来说根据处理的异常情况不同,可以把共识算法分为两种类型,一种是针对非拜占庭错误的,这类算法性能较高,但容错性较差,如Paxos、Raft等;另一种是针对拜占庭错误的,这类算法往往容错性较高,但是性能相对较差,包括工作量证明(POW)、权益证明(POS)、委托权益证明(DPOS)、实用拜占庭容错算法(PBFT)等。处理拜占庭错误的算法有两种思路,一种是通过提高作恶成本以降低作恶节点出现的概率,如工作量证明、权益证明等,其中工作量证明是通过算力,而权益证明则是通过持有权益。另外一种是在允许一定的作恶节点存在的前提下,依然使得各节点之间达成共识,如实用拜占庭容错算法等。下面我们就来讲讲目前存在的主流共识算法。
2、拜占庭将军问题
1982年,Leslie Lamport等科学家提出了著名的拜占庭将军问题(Byzantine failures),其讨论的是允许存在少数节点作恶场景下的一致性达成问题。简单描述下: 国土辽阔的拜占庭帝国,基于防御目的,将每支军队分别部署在全国各地。因为距离遥远,将军们只能靠信差传递消息。战争爆发时,拜占庭帝国军队的将军们必须全体一致的决定是否攻击某一支敌军,以获取作战胜利。然而将军们无法确定他们中是否存在叛徒