1.6 比特币的原理-共识机制

626 阅读4分钟

上一节我们讲到比特币通过工作量证明机制来选定唯一记账人来完成记账。那么问题来了, 如果两个节点同时完成工作量证明,那么使用谁的区块?

在比特币里是没有中心化的仲裁机构的,如果有,那么有仲裁机构来裁决就好了。两个打包的区块的旷工都会要求用自己打包的区块,那么旷工直接如何达成共识,让大家都去认可,到底用谁打包的区块。 这一节我们来解决这个问题。区块链里面把解决这个问题的方法就是共识机制。共识机制就是大家共同遵守的一套协议。

  • 为什么要遵守协议

为什么要遵守协议呢,可不可以各用各的,这其实是一个经济问题。在经济生活中呢,每个人追求的利益最大化,节点工作量只有在其他的节点认同其是有效的,因为打包的新的区块需要得到其他节点的验证,通过之后才会加入到区块链之中,并且在网络上传播,才会因此获得收益。而只有遵守规则,才会得到其他节点的认同。因此所有节点都要遵守协议。

  • 累积工作量最大的区块

还是回到如何达成共识这个问题上来,如果两个节点同时完成了工作量证明怎么办呢?其实这个共识很简单,每个节点只认可累积工作量最大的区块链,或者难度最大的一条链,这条链会被大家都认可,会成为最终权威的总账本。

需要注意的是,每个节点的行为都是独立的,他们去独立的进行选择,总是选择一条工作量最大的区块链最大的区块链去挖矿,来延长这条最长的链

  • 分叉

我们来实际分析一下这个场景。

先进行定义,将累计最大的难度(包含最多区块)的链成为主链

image.png

当两名旷工几乎同时,各自求得了工作量证明的解,打出了两个包,一个是#3458A,一个是#3458B,这两个节点是求解出答案之后,他们会立刻在网络上进行广播,先广播至临近的节点,然后传到整个网络。每个收到有效区块的节点,他们都会拉入到自己的一个延长原有的链条,即区块链中。 当两个块在传播的时候,总会有一些节点先收到#3458A,一些先收到#3458B(因为网络传输的时候会有些不确定性)。收到A块的,会认为#3458A与原来#3457形成的是最长的链,进而在这上面继续挖矿;收到B块的同理;当然有一些节点会收到两个块,这时候他们会对比选择一条工作量更多的一个块所在的链作为主链,而另外一条作为备用链。 这时出现的两条链就产生了分叉,两个链的节点分别在各自的链上进行挖矿,区块打包。这时候两个链就会产生竞争,但是总会有一方抢先的发现工作量证明,然后将自己求解的区块传播出去。

image.png

假设以#3458B为父块的节点产生了一个#3459B(更快发现),他去传播之后,那么原本已#3458A打包的这个链条,收到#3458B和#3459B这个链条后,发现这个链条更长,那么他会把B这个链条作为主链,而舍弃原来的一条链。因为B这个链条已经是更长的一条链了,他们总会选择最长的一条链作为主链。 不过有一点要指出,因为网络有不确定性,有的时候节点会先收到#3459B,并没有收到#3458B,这个时候,他会先把#3459B放在一个孤块池里面,一旦收到了#3458B的时候,他就可以把这些块串起来,然后把#3459B拿出来作为整个区块链的一部分。 比特币将区块间隔设置为10分钟,其实是在更快的交易确认和更低的分叉概率间做出的妥协。更短的区块产生间隔,会让交易更快确认完成,但是同时也会导致更加频繁的产生分叉;与之相对的是,长的间隔减少分叉的数量,但是也会延长交易确认的时间。

  • 小结

如果两个节点同时完成工作量证明,那么到底用谁的区块,打成共识的方式是:采用工作量最大的链作为主链。其实完整的工作量机制应该是工作量证明+最长链的选择