
1.2 共识的作用
每条区块链的节点,例如以太坊节点,都拥有自己存储数据的地方,节点之间虽然会相互通信,但又彼此不依赖,这是因为互不信任。
在这种情况下,各个节点如何保证在互相通信的过程中维护数据的一致性,从而使链上相同区块号的区块只有一个呢?此时就诞生了区块链技术栈中的另一个知识点:共识,又称共识机制。
所谓共识,通俗来讲,就是我们大家对某种事物的理解达成一致的意思。比如说日常开会讨论问题,又比如判断一个动物是不是猫,我们肉眼看了后觉得像猫,其符合猫的特征,那么我们认为它就是猫。这就是共识,可见共识是一种规则。
继续上述会议的例子。参与会议的人,通过开会的方式达到解决问题的目的。对比区块链中参与挖矿的节点,节点中有矿工这么一种角色,它在代码中对应某一个功能模块。节点矿工通过某种共识方式(算法)来解决该节点的账本与其他节点的账本保持一致。账本保持一致的意思是:各个节点同步的区块的信息保持一致,以维护同一条区块链。
那么为什么需要共识呢?没有共识可不可以?当然不可以,这样会出现问题,假如生活中没有共识规则,那么一切都会乱套。区块链与此类似,没了共识规则,各个节点各干各的,会失去一致性,区块链也不会达成统一。
上述会议和区块链的对应关系如下:
(1)参会的人=挖矿的矿工
(2)开会=共识方式(算法)
(3)讨论解决问题=让自己的账本跟其他节点的账本保持一致
你可能会对上面的内容产生一些疑问:
(1)区块链节点和矿工是什么关系?
(2)让节点账本保持一致,账本的内容是什么?
(3)为什么需要共识算法去保持账本一致?
首先,我们来看一下区块链节点和矿工的关系。矿工是区块链节点中的一个角色,从编程的角度来看,就是程序中的一个功能模块。因此可见,矿工与区块链就是包含与被包含的关系。
其次,让节点账本保持一致,账本的内容是什么?账本的内容就是所有节点所维护的那条公链中的区块以及该区块的相关信息。要保持这条链不出差错,块与块之间必须正常相连。
最后,为什么需要共识算法来保持账本一致呢?因为区块会被节点中的一些功能模块生成,在众多节点且相同的时间流逝中,A节点有可能诞生一个区块1,B节点也有可能诞生一个区块1,这样它们诞生的区块号就发生重复了。在同一条链中,相同区块号的区块最终只能挑选一个串接到链中,这时取谁的好呢?此时就需要用共识算法这一规则来做出选择了。这个选择的大致形式可参考图1-2。

图1-2 用共识算法选出胜出块