很多接触或者了解区块链过区块链的人,对“共识”两个字一定不陌生。今天,便借一个系列的分享,和大家一起学习“共识”算法的一些点滴。可能不全,但希望对大家有所帮助。首先,先通过这篇分享,帮助我们理清共识算法 一些理论概念。
什么是共识
所谓共识,就是指处在分布式系统中的众多节点就某一个决策或行为达成一致。但是达成共识并不是一件简单的事,整个系统中的节点可能会出现各种无法预知的问题,比如说节点宕机、通讯故障或者被恶意攻击了等。
在分布式系统领域,存在着一个FLP不可能定理,F、L、P是其三位提出者的姓名首字母。FLP不可能定理:在一个异步通讯网络中,只要存在一个故障节点,就不存在一种完美的共识算法可以正确的终止。只有在同步网络中,才存在这样的共识算法。
值得注意的是,同步网络中的共识模型使得整个系统在一个可控可预估的时间内到达某一个状态。而异步网络中的共识模型不存在这种可预估的可能,因为其中节点的通讯延迟是无上界的,节点的处理速度也是未知的。可以看出,这种异步模型更贴近我们真实的网络世界。我们上面也提到了,想要在异步环境下设计出这样的一种共识模型或共识算法是不可能的,而同步算法由于其需要等待所有的节点完成某一个动作,性能较为低下,所以,便产生了两者的中间产物:部分同步模型(Partial Synchrony Model)。
部分同步模型,顾名思义,同步了但没完全同步。该模型会设置一个全局稳定时间(Global Stabilization Time,GST)作为该模型异步和同步之间的分界线。在GST到达之前,整个系统保持为异步状态,而到GST到达之后,整个系统恢复为同步状态。
但无论是同步网络还是异步网络,一个正确的共识算法必须满足以下三点:
- 一致性(Agreement):所有的节点都统一某个结果。
- 有效性(Validity):最终的结果必须是网络中某个节点提出来的。
- 终止性(Termination):所有节点最终都能到达某个结果。比如前面提到的部分同步模型中,GST后系统切换成同步状态就是为了保证节点能满足终止性。
共识算法有哪些
其实共识算法不是什么新鲜的东西,很久前它名为分布式一致性算法。随着区块链的出现,共识算法便专门被默认为是区块链中的分布式一致性算法。适用于区块链的共识算法按照不同的需要被分为不同的类别。
分类标准可以大致总结为以下这三种,随表进行举例:
- 按照是否能够容忍拜占庭错误,即是否能够容许节点进行恶意的行为分类。公有链环境存在的节点无法监管和控制,必须使用拜占庭容错算法,而联盟链因为存在一定的信任基础,可以视情况选择非拜占庭容错算法。
- 按照算法确定性类别分类,即分为确定性共识算法和概率性共识算法。确定性共识算法即一旦共识结果出来了,便不可能再出现更改的可能。而概率性共识算法则可能出现更改的情况,比如bitcoin中的分叉攻击,可能使得链上一部分已经达成的共识作废。
- 按照选择矿工的方式进行分类。大致可以分为以下两种:选举类和证明类。选举类即通过选举决定谁作为出块节点。而证明类则通过设置某种证明方式,节点通过完成规定的证明过程,获得出块的权力。
共识算法 | 拜占庭容错 | 算法确定性 | 是否需要证明 |
---|
PBFT | √ | √ | × | PoW | √ | × | √ | PoS | √ | × | √ | Paxos | × | √ | × | Raft | × | √ | × |
未完待续
下一小节将和大家分享一些常见的共识算法。咕咕咕咕咕。
|