比特币开发--分叉(fork)

简介

这里写图片描述
当两个或者更多的矿工同时生产出来新的区块时,节点只认可自己最先接收到的区块,由于网络区域因素,整个网络上会同时存在多个合法的区块,这个时候就会出现分叉。甚至严重者会出现类似第2张图中的情况,出现两条链竞争的情况。
只要上述分叉中,有一方取得超过51%的算力的节点的认可,则会保证长的链会越来越长,从而吸引更多的节点认可。
前面介绍了由于矿工间竞争产生的分叉,接下来介绍一种新的情况,当共识规则发生更新时,会出现什么样的情况

硬分叉(Hard fork)

原因

根据新的共识规则生成的块,能够被采用新版本的节点接受,但是会被遵循老规则的节点拒绝。
比如:一个块使用了新的交易功能,新版本的节点能够认可这种规则,但是老版本认为这个块是违法的。
最后结果是:hard fork,硬分叉
这里写图片描述

后果

硬分叉是不可以再回归到一条链上来的,除非舍弃其中一条。
一旦舍弃,这条链上的交易就会作废,已经挖的矿也会被否认,从而导致不可逆的经济损失。
案例:
BIP50曾经导致过硬分叉,最后通过将已经升级到0.8版本的节点降级到0.7版本,才最终解决这个问题。其实就是相当于抛弃了新的节点认可的那条分叉。

软分叉(Soft fork)

原因

新的共识规则更新后变得更加严格,有些被旧规则认可的块,但是会被新的规则拒绝。如果新版本的算力小于老版本的算力,可能会出现一段时间的分叉。
由于新版本的节点不认可老规则的块,从而会导致新版本生成的链会持续向前推进。随着越来越多的节点都升级到新版本(升级后就会拒绝老链),而老节点又认可新版本的blocks,一旦新的链的算力超过51%,导致新链的长度长于老链,就会拉拢更多的老版本的节点接纳新的链。
由此可见软分叉,随着新版本的算力的增加,最终必然会发展为一条链。
这里写图片描述

后果

由于存在一定的分叉的可能性,矿工们所获得的收益将不能够在接下来100个块中使用,以防出现分叉后被舍弃的无效块被用来交易。
但是由于记账时,矿工们都是选择收益最大的交易来进行记账,就算出现分叉,同样高度的块上总应该包含交易的信息才对。

分叉规避

检查

为了避免因为分叉导致的经济损失,尤其是硬分叉,每个节点都会检查自己是否与最新的块的生成版本存在差异,如果存在差异,则会报警(调用bitcoind -alertnotify设置的命令or脚本,同时在getnetworkinfo RPC 的结果中设置警告)
每个节点同时都会监听所有的新块生成广播,一旦发现有六个块以上的分叉,则会报警。

更新

在比特币开发初期,中本聪更新版本的时候,都是直接release出来。由于各个节点的节奏没有保持一致,一旦出现分叉,会存留比较长一段时间。
后续大家对此进行了优化:约定时间或者块高度到多少的时候统一进行版本切换
再往后:会判断网络中新版本的节点算力达到 (75% or 95%) 时,发送signal通知大家统一进行版本切换。

猜你喜欢

转载自blog.csdn.net/tjock/article/details/81070873