关注过比特币的人多多少少都知道区块链这个名词,毕竟区块链(BlockChain)是支撑比特币的底层技术,顾名思义,区块链就是一条由一个个区块串联而成的链,如下图所示,每个小框框表示一个区块,区块里包含若干份交易;每个小框框里的数字表示该区块被打包生成的顺序。
除了创世区块(第一个区块),每个区块都包含上一个区块的哈希值。也就是说,区块1的哈希值会存入区块2里面,区块2的哈希值也会存入区块3里边.……而哈希是种什么东西呢?哈希本质是一个函数,可以简单认为是一种输入不同的数据,会得到不同结果的函数(严格来讲不是如此的,但是这里不用太深究)。
比特币的这种机制有个非常好的特性:假如一个坏人,恶意去篡改了区块2里的交易,那么区块2就发生变化了,那么区块2的哈希值就会发生变化,区块2的哈希值发生变化了,那么区块3也会跟着发生变化,区块3发生变化,那区块4也会跟着改变...牵一发而动全身,像多米诺骨牌那样,如果你没有足够多的算力的话,想要篡改比特币系统里的数据是不可能的。
区块链有一种与生俱来的优势:难以篡改,各行各业都需要这样一个数据难以篡改的数据库,所以说,区块链是一种很有前景的技术的。
下面正式阐述区块链分叉的知识。
分叉就是指,在某一时刻,链上同时出现了两个都满足要求的不同的区块,如下图:
这两个7号区块都是合法的,只是因为很巧合刚好在同一时间上挖出两个不同的区块,那么矿工们,都相信这两个区块是合法的,有些矿工会选择在第一个7号区块后继续挖,也有些矿工则是会选择在第二个7号区块后继续挖。随着时间的推移,这两个方向上的链的长度会变得不一样,长的那个就是最终存活的那个,短的那个就会被丢弃,最终仍然只剩下一条链。
那么什么是软分叉、什么是硬分叉呢?
所谓软分叉和硬分叉,是软还是硬,看的是分叉的时间是暂时的,还是永久的。
像上边举的例子,链上只是暂时出现分叉,过了一段时间后,就会回归为一条链了,这种分叉叫做软分叉。
那么有没有永久性的分叉呢?有!这种永久性的分叉就是硬分叉,而且往往是由于升级底层协议造成的。
但是升级底层协议造成的分叉,并不一定是硬分叉,也可能是软分叉。
区块链(公有链)作为一种去中心化的数据库,需要由许许多多的全节点进行维护,如果底层协议发布新的版本了,所有的矿工都愿意跟随升级,那就不会分叉了。可是现实情况可能是,一部分结点选择了升级协议,一部分结点并不同意升级,那么就会陷入一个很有趣的局面。
我把升级前、后的协议分成以下4种情况:
①升级后的新协议,认可旧协议下挖出来的区块;旧协议也认可新协议下挖出的区块
(新认可旧,旧认可新)
②升级后的新协议,认可旧协议下挖出来的区块;旧协议不认可新协议下挖出的区块
(新认可旧,旧不认可新)
③升级后的新协议,不认可新协议发布之后旧协议再挖出的结点;旧协议也不认可新协议下挖出来的区块
(新不认可旧,旧也不认可新)
④升级后的新协议,不认可新协议发布之后旧协议再挖出的结点;但旧协议认可新协议下挖出来的区块
(新不认可旧,旧认可新)
先来看第①种情况:升级后的新协议,认可旧协议下挖出来的区块;旧协议也认可新协议下挖出的区块(新、旧互相认可)
这种情况不会造成分叉,但是区块链里的各个区块是新、旧混杂的,不统一而已。
第②种情况:升级后的新协议,认可旧协议下挖出来的区块;旧协议不认可新协议下挖出的区块(新认可旧,旧不认可新)
由于旧协议不认可新协议下挖出的区块,所以红色区块永远不会出现在有绿色区块的链上。
由于升级后的新协议认可旧协议下挖出来的区块,所以新协议也会在旧协议挖出的区块后边跟着挖,如下图,其中对于新、旧协议来说,第一个分叉的3个绿色区块的那个分支都是无效的,因为新协议认可底下两条链,旧协议只认可最底下那条链,而最上边的那条链均不被新、旧的认可,这意味着那3个绿色的区块白挖了,。
由于新协议可以在旧协议挖出的区块后继续挖,挖出的区块所在的链的长度,比只跟在绿色的后边挖要长,因此升级新协议,挖出的区块可能并没有得到区块奖励,因此,这种情况下节点升级新协议的动力不大。
第二种情况下的分叉可以归结为永久性的,虽然升级新协议并不能带来更好的区块奖励,但协议之所以是新的,可能是出于其他方面的考量,所以升级新协议之后的节点,也不会全都降回旧协议,所以就权当认为是硬分叉吧。
第③种情况:升级后的新协议,不认可新协议发布之后旧协议再挖出的结点;旧协议也不认可新协议下挖出来的区块。(新不认可旧,旧也不认可新)
这种情况和第②种情况差不多,但分析起来更简单。新节点和旧节点,互相认为对方的链是无效的,各挖各的,这种分叉是永久性的,属于硬分叉。
第④种情况:升级后的新协议,不认可新协议发布之后旧协议再挖出的结点;但旧协议认可新协议下挖出来的区块。(新不认可旧,旧认可新)
这种情况比较特殊了。
因为升级后的新协议,不认可新协议发布之后旧协议再挖出的结点,所以,分叉后会先是变成下图这样:
但是由于旧协议认可新协议下挖出来的区块,所以,红色区块可能会出现在绿色区块的屁股后边,比如下图:
然而,升级后的新协议并不认可新协议发布之后旧协议再挖出的结点,所以绿色区块永远不会跟在红色区块屁股后边,如下图:
这意味着什么?
跟在绿色区块后边的红色区块,由于被新协议不认可旧协议,也就是说1,3,4号链是不被新协议认可,而旧协议认可新协议,可以跟在绿色节点的后边,在绿色的链的基础上挖,但由于区块链只认可最长的那条,所以1,3,4号链也是不被旧协议接受的。这样一来,使用旧协议挖出来的红色区块,可能并没有得到区块奖励。受利益的驱动,这些运行着旧协议的节点,会逐步升级为新协议。
所以这种情况下的分叉,是暂时性的,是软分叉。
以上仅是一人之言,如果文章有错误之处,还请指出多多包涵。
各位看官对此有任何看法,可以直言。