区块链里面有三种形式的分叉。
第一种是经常发生但大家都熟视无睹的。这种分叉是去中心化共识的副产物。对于比特币来说,只要两个矿工几乎同时完成记账就会发生分叉,因为他们同时广播了两个区块,当后续的多个区块链接到其中一个区块,使这个链最长,另一个区块或其小分叉就会被网络“孤立”以至“抛弃”掉。这种形式的分叉是常见而且正常的,一般我们在讨论分叉时很少提及它。
以太坊也常发生分叉。但不同的是:在以太坊中,孤块被称为“叔块”(uncle block),它们可以为主链的安全作出贡献,因此挖出七代内的叔块都能够得到奖励,并且叔块的代数离主链上下一次挖出的区块的代数越近,则其被矿池招安能够得到的奖励将会也多,根据离的代数越远,奖励比例也越小,依次为7/8、6/8、5/8、4/8、3/8、2/8、1/8。叔块奖励 = 奖励比例 * 出块奖励。
另外两种分叉则是基于共识层面而产生的,它们需要社区谨慎处理,因为它们在社区无法达成共识时,有可能造成社区和项目的分裂。
软分叉
软分叉是在原有的规则范围内强化既有规则。譬如新规则单纯将区块的大小由1MB 减小到500K,因原有的规则为区块的大小未超过1MB就是有效的区块,所以未升级的节点会继续将新交易视为有效。然而未升级节点继续挖出的1MB区块将被已升级节点视为无效区块而被拒绝。这也就是说,旧节点无法觉察到协议的变化,不能发现软件已升级,从而继续参与新节点用新协议所挖出的区块的验证工作,但旧节点矿工将无法在新区块上继续添加新节点矿工视为无效的区块,旧节点矿工无法获得对应工作的收益——如果社区未达成共识,多数节点(实质为多数算力)拒绝升级,那么其分叉方案就可能对社区造成伤害。
那么部署一个成功的软分叉,因为需要网络的大部分算力的支持,最好是在达成社区共识的前提下进行。缺乏充分共识的软分叉并不可取。
硬分叉
硬分叉是改变原有的规则,引入不兼容旧软件的新规则。譬如将区块的大小上限由1MB 增加到8MB,没升级的节点会将新区块视为无效,因此未升级节点无法协同已升级节点的工作,和软分叉不同的是矿工马上会发现这一问题!从这个角度说,硬分叉更透明更清晰些。
业界有一种认识上的误区,认为只有软分叉是向后兼容的。实际上无论哪种分叉,都是必须是向后兼容的。“向后兼容性”是指新的软件或协议接受原有的旧格式的数据,只是软分叉到了分叉的哪个时间点后,新的软件或协议将不一定接受旧格式的数据。
比特币此前就曾因代码bug被利用等情况而经历多次的软硬分叉。以太坊也曾经几次硬分叉,并且它现在正在通过硬分叉解决其交易拥堵以及升级换代等诸多问题。
另外要提醒大家的是:除了公链,区块链应用(dApp)也是可以分叉的,因为区块链应用如果遵循区块链的核心价值,那么其智能合约及其数据就都是公开透明的,合约的调用就是无需许可的,从技术上说,分叉就往往变得非常容易了。譬如去中心化交易所Sushi就是从大名鼎鼎的Uniswap分叉产生的。