共识机制的作用,是让大多数节点的数据能够保持一致。共识机制有两种大的类型,一种是 PoW 风格的,一种是 PBFT 风格的。几乎所有的共识都在这两种风格之下。
可以从头思考一下,如果是一个人类的群体,怎么样才能让大多数人保持一致呢?一种方法是选出一个领袖,大家都听领袖的意见,再一种方法是大家一起商量进行决策,达成统一的意见。
对于第一种方法,问题在于如何选出领袖,依据什么样的标准选出,或者怎么样的人才能够成为领袖。对于第二种方法,问题在于哪些人可以参与商量,如何做出决策。
先看第一种方法,流程上主要有 3 个步骤:
PoW 的过程就是这样:
在这种 PoW 风格的共识过程中,最大的变数是第 1 步,也就是如何选出出块的节点,也因此有了很多 PoW 共识的变种。
Proof of Stake (PoS):以太坊在使用的共识机制,币种名称为 ETH。质押一定量资产的节点会随机成为出块节点,随机的过程由在信标链上运行 VRF 函数完成,并且质押的资产越多,成为出块节点的可能性越大。
Proof of Authority (PoA):以太坊测试网支持的共识机制。在网络的初始化阶段就已经确定哪些节点可以出块,之后按照顺序依次出块。确认验证者的过程是线下完成的,网络本身不具备对验证节点的纠正能力,比较中心化的一种共识。
Proof of Importance (PoI):Nem 在使用的共识机制,币种名称为 XEM。制定了一些给节点打分的机制,在多少天内交易多少次、交易额度是多少之类,以根据分数对节点进行排名,分数高于指定标准的节点,随机成为出块节点。
Proof os Elapsed Time (PoET):Hyperledger Sawtooth 项目使用的共识机制,是英特尔开发的一个项目。每个节点随机生成一个等待时间,等待时间最短的节点成为出块节点。出块节点需要提供一个最短时间的证明,这个证明和硬件设备相结合,达到无法伪造的效果。
Proof of Burn (PoB):Slimcoin 在使用的共识机制,币种名称为 SLM。节点通过销毁资产的交易获得销毁哈希,销毁哈希的计算包含了销毁的金额以及节点在一段时间内销毁的频率等信息,然后系统对每个节点提交的哈希值进行比较,哈希值最小的节点将进行本轮的出块。
Proof of Capacity (PoC):Burst 在使用的共识机制,币种名称为 Burst。节点使用 hard-to-pebble graph 的数据结构,在磁盘上进行文件的写入,这个步骤需要足够多的磁盘空间,写入完成后节点随机打开文件的某个位置,计算对应的哈希值,直到找到满足要求的哈希值,节点就可以进行出块。
Proof of History (PoH):Solana 在使用的共识机制,币种名称为 SOL。这种共识机制的创新之处在于,每一笔交易或者其他链上的操作,都会对应一个哈希值,然后 PoH 生成器生成块,这个块由一系列连续的哈希值,也就是一系列链上操作组成,从而保证链上数据的一致。这里的 PoH 生成器就是出块节点,PoH 生成器的选择标准则是质押金额最多的节点。
这些是 PoW 风格共识的例子,可以看出它们在想方设法改变选择出块节点的方式,但不管具体使用怎么样的机制,这些区块链都符合 3 个步骤的流程。
再看第二种方法,流程上也是 3 个步骤:
PBFT 的过程类似这样:
可以看出和第一种方法相比,由单一的领袖变为了多个决策者。在这种 PBFT 风格的共识过程中,最大的变数也是第 1 步,如何从所有节点中选出共识节点,以及共识节点成为提案节点的顺序。这是一些变种:
Delegated Byzantine Fault Talerance (DBFT):Neo 在使用的共识机制,币种名称为 NEO。每个持有资产的节点都可以进行共识节点的选举,将自己的资产委托给共识节点。拥有委托资产的共识节点进行排名,前几名将依次作为提案节点。
Federated Byzantine Agreement (FBA):Stellar 在使用的共识机制,币种名称为 Stellar。网络中的所有节点都是共识节点,都可以参与两轮投票。为了减少网络的拥堵,节点也可以委托自己的投票权给另一个节点,使用切片或者子网络的方式提高共识效率。
HoneyBadgerBFT:一种支持完全异步网络的 BFT 类共识,不依赖于同步的时间顺序,这是 PBFT 不具备的能力。不过异步网络的共识效率相对低一点。
HotStuff:一个允许部分网络异步的 BFT 类共识。它的特点是,网络中可以同时存在多个提案,提案节点将选择最好的一个提案,进行后续的流程。这样的方式相当于产生提案的过程是并行进行的,提高了整个共识的效率。
VBFT:Ontology 在使用的共识,币种是 ONT。使用 VRF 随机函数进行提案节点的选择,每一轮的提案节点都是随机、不可预测的。
总体而言,PoW 风格和 PBFT 风格都是通过某种方式,筛选出最终能达成一致的内容,但是在选择内容的方式上存在根本区别。PoW 中其余节点将无条件接受来源的块,只要来源的块是符合某种条件的。而 PBFT 中,其余节点先收到块的内容,然后对这个块的去留进行决策,在接受块之前有一个投票的过程。
现在也有一些创新类型的共识出现,或者是结合多种共识的混合共识等形式,不管是对节点进行信誉评估、根据历史交易质量之类打分,还是根据手机、物联网等硬件设备进行数据的验证,还是对 PBFT 做某个阶段上并行、容错能力和网络效率之类的优化,共识机制终究还是在 PoW 风格和 PBFT 风格的体系之下。
因此你可以大胆的说,共识机制也就这么回事,只是在具体的设计和实现上有差异而已。