
如果全球可以达成一套共识标准,那么Web 3.0时代就正式开启了。
1.为什么要共识?
区块链通过全民记账来解决信任问题,但是所有节点都参与记录数据,那么最终以谁的记录为准?
或者说,怎么保证所有节点最终都记录一份相同的正确数据,即达成共识?
在传统的中心化系统中,因为有权威的中心节点背书,因此可以以中心节点记录的数据为准,其他节点仅简单复制中心节点的数据即可(Web1.0——Web2.0期间都是如此),很容易达成共识。
然而在区块链这样的去中心化系统中,并不存在中心权威节点,所有节点对等地参与到共识过程之中。
由于参与的各个节点的自身状态和所处网络环境不尽相同,而交易信息的传递又需要时间,并且消息传递本身不可靠,因此,每个节点接收到的需要记录的交易内容和顺序也难以保持一致。
更不用说,由于区块链中参与的节点的身份难以控制,还可能会出现恶意节点故意阻碍消息传递或者发送不一致的信息给不同节点,以干扰整个区块链系统的记账一致性,从而从中获利的情况。
因此,区块链系统的记账一致性问题,或者说共识问题,是一个十分关键的问题,它关系着整个区块链系统的正确性和安全性。
2.有哪些共识算法?
当前区块链系统的共识算法有许多种,主要可以归类为如下四大类:
(1)工作量证明(Proof of Work, PoW)类的共识算法;
(2)Po*的凭证类共识算法;
(3)拜占庭容错(Byzantine Fault Tolerance, BFT)类算法;
(4)结合可信执行环境的共识算法。
• PoW类的共识算法
PoW类的共识算法主要包括区块链鼻祖比特币所采用的PoW共识及一些类似项目(如XXBA等)的变种PoW,即为大家所熟知的“挖矿”类算法。
这类共识算法的核心思想实际是所有节点竞争记账权,而对于每一批次的记账(或者说,挖出一个区块)都赋予一个“难题”,要求只有能够解出这个难题的节点挖出的区块才是有效的。
同时,所有节点都不断地通过试图解决难题来产生自己的区块并将自己的区块追加在现有的区块链之后,但全网络中只有最长的链才被认为是合法且正确的。
XXB类区块链系统采取这种共识算法的巧妙之处在于两点:
首先,它采用的“难题”具有难以解答,但很容易验证答案的正确性的特点,同时这些难题的“难度”,或者说全网节点平均解出一个难题所消耗时间,是可以很方便地通过调整难题中的部分参数来进行控制的,因此它可以很好地控制链增长的速度。
同时,通过控制区块链的增长速度,它还保证了若有一个节点成功解决难题完成了出块,该区块能够以(与其他节点解决难题速度相比)更快的速度在全部节点之间传播,并且得到其他节点的验证的特性;
这个特性再结合它所采取的“最长链有效”的评判机制,就能够在大多数节点都是诚实(正常记账出块,认同最长链有效)的情况下,避免恶意节点对区块链的控制。
这是因为,在诚实节点占据了全网50%以上的算力比例时,从期望上讲,当前最长链的下一个区块很大概率也是诚实节点生成的,并且该诚实节点一旦解决了“难题”并生成了区块,就会在很快的时间内告知全网其他节点,而全网的其他节点在验证完毕该区块后,便会基于该区块继续解下一个难题以生成后续的区块,这样以来,恶意节点很难完全掌控区块的后续生成。
PoW类的共识算法所设计的“难题”一般都是需要节点通过进行大量的计算才能够解答的,为了保证节点愿意进行如此多的计算从而延续区块链的生长,这类系统都会给每个有效区块的生成者以一定的奖励。
XXB中解决的难题即寻找一个符合要求的随机数。

如上图左侧“Nonce”字段即为该区块对应难题的解,即该区块符合要求的随机数为“3443302353”。
然而不得不承认的是,PoW类算法给参与节点带来的计算开销,除了延续区块链生长外无任何其他意义,却需要耗费巨大的能源,并且该开销会随着参与的节点数目的上升而上升,是对能源的巨大浪费。
• Po*的凭证类共识算法
鉴于PoW的缺陷,人们提出了一些PoW的替代者——Po*类算法。
这类算法引入了“凭证”的概念(即Po*中的*,代表各种算法所引入的凭证类型):
根据每个节点的某些属性(拥有的XXB数、持XXB时间、可贡献的计算资源、声誉等),定义每个节点进行出块的难度或优先级,并且取凭证排序最优的节点,或是取凭证最高的小部分节点进行加权随机抽取某一节点,进行下一段时间的记账出块。
这种类型的共识算法在一定程度上降低了整体的出块开销,同时能够有选择地分配出块资源,即可根据应用场景选择“凭证”的获取来源,是一个较大的改进。
然而,凭证的引入提高了算法的中心化程度,一定程度上有悖于区块链“去中心化”的思想,且多数该类型的算法都未经过大规模的正确性验证实验,部分该类算法的矿工激励不够明确,节点缺乏参与该类共识的动力。
• BFT类算法
无论是PoW类算法还是Po*类算法,其中心思想都是将所有节点视作竞争对手,每个节点都需要进行一些计算或提供一些凭证来竞争出块的权利(以获取相应的出块好处)。
BFT类算法则采取了不同的思路,它希望所有节点协同工作,通过协商的方式来产生能被所有(诚实)节点认可的区块。
拜占庭容错问题最早由Leslie Lamport等学者于1982年在论文The ByzantineGenerals Problem中正式提出,主要描述分布式网络节点通信的容错问题。
从20世纪80年代起,提出了很多解决该问题的算法,这类算法被统称为BFT算法。实用拜占庭容错(Practical BFT, PBFT)算法是最经典的BFT算法,由Miguel Castro和Barbara Liskov于1999年提出。
PBFT算法解决了之前BFT算法容错率较低的问题,且降低了算法复杂度,使BFT算法可以实际应用于分布式系统。
PBFT在实际分布式网络中应用非常广泛,随着当前区块链的迅速发展,很多针对具体场景的优化BFT算法不断涌现。
具体地,BFT类共识算法一般都会定期选出一个领导者,由领导者来接收并排序区块链系统中的交易,领导者产生区块并递交给所有其他节点对区块进行验证,进而其他节点“举手”表决时接受或拒绝该领导者的提议。
如果大部分节点认为当前领导者存在问题,这些节点也可以通过多轮的投票协商过程将现有领导者推翻,再以某种预先定好的协议协商产生出新的领导者节点。
BFT类算法一般都有完备的安全性证明,能在算法流程上保证在群体中恶意节点数量不超过三分之一时,诚实节点的账本保持一致。
然而,这类算法的协商轮次也很多,协商的通信开销也比较大,导致这类算法普遍不适用于节点数目较大的系统。
业界普遍认为,BFT算法所能承受的最大节点数目不超过100。
• 结合可信执行环境的共识算法
上述三类共识算法均为纯软件的共识算法。
除此之外,还有一些共识算法对硬件进行了利用,如一些利用可信执行环境(Trusted Execution Environment, TEE)的软硬件结合的共识算法。
可信执行环境是一类能够保证在该类环境中执行的操作绝对安全可信、无法被外界干预修改的运行环境,它与设备上的普通操作系统(Rich OS)并存,并且能给Rich OS提供安全服务。
可信执行环境所能够访问的软硬件资源是与Rich OS完全分离的,从而保证了可信执行环境的安全性。
利用可信执行环境,可以对区块链系统中参与共识的节点进行限制,很大程度上可以消除恶意节点的不规范或恶意操作,从而能够减少共识算法在设计时需要考虑的异常场景,一般来说能够大幅提升共识算法的性能。


