第一个是FLP不可能性,简单来说是:即使网络通信完全可靠,只要产生了拜占庭错误,就不存在一个确定性的共识算法能够为异步分布式系统提供一致性。换句话来说就是,不存在一个通用的共识算法可以解决所有的拜占庭错误。
第二个是CAP定理,CAP定理是分布式系统领域最重要的定理之一,这个我们在“理解区块链的常见误区”一文中稍微讲到过。也就是在设计分布式系统的过程中,“一致性”“可用性”“分区容忍性”三者中,我们只能选择两个作为主要强化的点,另外一个必然会被弱化。
我们由CAP定理可以推导出严格一致性和最终一致性。严格一致性是指在约定的时间内,通常是非常短、高精度的时间内,系统达到一致性的状态,这种系统很难实现,即使实现也很难有高的性能。
所以人们从工程的角度提出了最终一致性,最终一致性不要求严格的短时间内达到一致。为了其他两个指标,我们相当于让一致性在时间上做了妥协。区块链满足了最终一致性,而且处理过程时间比较长。
可用性其实是传统技术后端架构上非常重要的指标,从单点到主备模式、从主备模式到异地多活,再到现在的Paxos和Raft协议。
我们从软件架构上也经历了基于ESB的模块化SOA模式,到无状态的微服务架构。从工程的角度来看,根据业务需求达到4个9、6个9就足够了,只是肯定比不了区块链近乎100%的可用性。
分区容忍性在企业内部极少出现,尤其是中心化的服务性应用,所以很少考虑。然而区块链的P2P网络环境十分复杂,所以必须要保证很高的分区容忍性。
通过以上我们可以发现比特币、以太坊等公链是偏重高可用性、分区容忍性(AP),满足最终一致性(C)且TPS较低的分布式系统。
所以如果有人号称他们的区块链能够达到媲美中心化系统上万的TPS,先别着急投资,你问问他们技术是不是知道CAP定理,再问问他们的去中心化程度如何。
这点我们也可以从EOS等高性能的区块链身上佐证,EOS全球只有21个记账节点,而以太坊全球有上万个节点可以随时参与记账,所以越想去中心化,你的TPS就不可能高,这也就是为什么EOS的TPS高,而以太坊的TPS低。
接下来我来介绍一下经典的分布式一致性算法和区块链的共识算法。经典的分布式一致性算法在多数的论文中一般被叫做共识算法,在这里,我为了与区块链的共识算法做出区别,所以在命名上改成了分布式一致性算法,但是它们要解决的问题是一样的。
共识算法与分布式一致性算法
1.经典的分布式一致性算法
经典分布式一致性算法有Raft协议,Raft协议是一种强Leader的一致性算法,它的吞吐量基本就是Leader的吞吐量,它无法抵御节点恶意篡改数据的攻击。
稍微复杂一点的就是Paxos协议,Paxos能提供不同场合不同种类的一致性算法,所以Paxos有很多变种,经典Paxos是Leaderless的,有变种是强Leader型的,叫做Fast Paxos,有关Paxos的文献非常丰富,这里就不赘述了。
以上两种都是不提供拜占庭容错的系统,下面介绍一种具有拜占庭容错的一致性算法。
PBFT全称实用性拜占庭容错系统(Practical Byzantine Fault Tolerance, PBFT),PBFT是一种状态机,要求所有节点共同维护一个状态,所有节点采取的行动一致,PBFT非常适合联盟链等对性能具有较高要求的场合,超级账本项目中的Fabric框架默认采用的就是PBFT的修改版本。
2.区块链共识算法
区块链的共识算法,我在某些场合直接称作基于经济学的博弈算法,以区别于经典分布式一致性算法思路,它的整体思路就是让攻击者的攻击成本远远大于收益。
区块链中的共识算法目前具有工业成熟度的是PoW,另外两种比较成熟的是PoS和DPoS,其次还有一些变种和单一币种使用的共识算法,例如Ripple共识、PoC共识(概念性证明)、PoE共识(存在性证明)。
在使用PoW共识算法的情况下,容错阈值是50%,而PBFT及其变种的容错阈值是33%左右,这里的百分比是指作弊节点占全网节点的比例。
PoX类的算法其实都延续了PoW的设计理念,相比较经典分布式一致性算法,PoX类算法通过概率选择记账者降低了潜在的提案者,另外是延长了达成最终一致性的时间。
第一条降低了系统通信复杂度,每次记账系统的确定性其实是概率确定的,又由于被选中需要付出成本,此处才提高了记账成本阈值,结合区块链的基础代币设计,是一个非常天才的想法。
有关PoW、PoS、DPoS的内容,我在后面会有专文介绍。
总结