区块链“分叉”的产生“ & ”BestChain选择准则

“分叉”现象的产生

非人为“分叉”的产生原因

所谓“挖矿”,是计算一个HASH值<=TargetHash的过程;

而符合计算规则的结果Hash有很多个,所以会出现同时好多个“矿工”同一时段(考虑到网络延迟)宣布“挖矿”成功;

所以,同一区块高度会出现多个区块的时候,由此就产生了区块链的Fork,也就是“分叉”现象。(插一句,这就是为什么中本聪要规定均值10分钟产生一个区块,为的就是降低碰撞的频次,减少fork次数);

人为“分叉”的产生原因

这种人为分叉,要从区块链的共识机制说起。

区块链是由点对点的去中心化节点共同维护的,区块链的有序运转靠的就是大家的共识;

即对于哪些交易是可以接受的、哪些节点具有记账权等关键事宜,有一套公认的标准。

这套标准是部署在区块链底层协议中自动化执行的。

当不同节点运行的底层标准(即客户端软件版本不一致)不一致的时候,人为分叉自然而然就产生了。

PS:为什么会出现不同的客户端软件版本不一致呢?主要原因有以下几种

  1. 利益原因:不同的矿工因为利益关系,矿工个体本身有选择性的接受或者不接受新的升级版本
    • 不接受新版本,挖到的新矿就在某个分支上。如果算力过硬,该分支有可能取代其他分支,作为主链。
  2. 时延原因:不可能所有的客户端在同一时刻同时升级,即使所有节点都同意升级并立刻升级,也会有时延
  3. 区块链网络节点可自由动态加入或者离线,离线的那部分节点会感知不到升级,等再次入局升级的时候,这中间会有一段时间。

“分叉”之后,最佳链(bestChain)的选择准则?

那么,要保证区块链的MainChain唯一性,当出现多处分叉的时候,该用什么准则去选择最佳链(select the bestChain as mainChain)呢?

  1. 如果不同分支的区块高度不同,那么选择最长区块高度的分支为MainChain(在POW共识机制下,最长工作量代表着最权威的说服力);
  2. 如果高度一致,则选择难度系数最大的分支为MainChain(在POW共识机制下,difficulty越大,则说明该区块被创造所需要的工作量越大,则权威说服力越大);
  3. 区块高度如果相同,并且难度系数也一样,那么选择接受时间最早的那个分支为MainChain;
  4. 若所有的评判系数均相同,则等待各自某分支的区块高度+1之后,重新重复上述1~3步骤选择出一个BestChain。

软分叉 VS 硬分叉

比特币网络正常运行出现的“分叉”,是非人为干扰的系统“自分叉”,系统的筛选逻辑可解决该种分叉;

所以,也会存在人为“分叉”,人为“分叉”分为:软分叉和硬分叉;

硬分叉指的是改变了比特币底层协议,使得之前被验证无效的区块变得有效,而为了保持兼容性,会强制要求所有节点都更新协议版本至最新。(一句话就是:凡是霸王手段耍流氓式的要求所有节点必须升级,否则运行机制不兼容影响新生成区块和交易验证的分叉都是硬分叉)

软分叉指的是虽然改变了比特币底层协议,但是只会使之前被验证有效的区块变的无效,而且即使节点不升级(虽然官方WIKI是这么描述的,但是是有具体的实施机制的,下文中会详细说明,暂不提),也不会影响新生成区块和交易被验证接受。软分叉是“向后兼容”的。

参考