区块链由一条变为两条或者多条,这一过程被称为分叉。导致分叉的原因有很多,按分叉出现的原因可分为两种:

state fork(状态分叉)

挖矿时,两个节点差不多同时挖到了矿,此时就会出现一个临时性的分叉,这是由于对于比特币区块链当前状态出现意见分歧而导致的分叉。分叉攻击(forking attack)也属于state fork,但它是人为造成的。

protocol fork(协议分叉)

当比特币的协议发生了改变,此时需要通过修改比特币系统来完成系统升级。

在一个去中心化的系统中,软件升级时无法保证所有节点同时升级软件。假如大部分节点升级了软件,少数节点因为各种原因导致没有升级,可能是还没来得及升级,也可能是不同意这个协议的修改。此时也会出现分叉。这种分叉就是protocol fork。这是因为对比特币协议产生了分歧导致的。

根据对协议修改的内容不同,又可以分为:硬分叉和软分叉。

硬分叉

如果在比特币协议增加一些新的特性,扩展一些新的功能。此时那些没有升级软件的旧节点不会认可这些新特性,就会认为这些新特性是非法的。此时就会出现分叉。

假设有人分布了一个软件更新,将区块大小由1M扩展到4M,大部分节点都已经升级到新的软件,少部分节点并未升级。

此时当大区块挖出来之后,更新了协议的节点会认为这个大区块是合法的,它们会将这个大区块添加到自己维护的链中,并沿着这条链继续往下挖。由于更新了协议的节点占网络中的大部分算力,所以这条链会越来越长。但那些没有更新协议的节点并不会认可这条链,因为对于它们来说,超过1M大小的区块就是非法的,无论这条链有多长,它们只会沿着协议更新前的链继续往下挖。

当新的节点挖出小于1M的区块时,虽然这样的区块新旧节点都会认可,但这并没有什么意义。因为在旧节点看来,新链上存在着非法区块。只要旧节点不更新协议,新链上的大区块就是非法的,这种分叉就会永久存在。所以这种分叉被称为硬分叉。

那旧节点挖出区块时的出块奖励还有没有?硬分叉后会出现两条平行的运行的链,它们各有自己的加密货币。就旧节点的出块奖励在旧链上仍然是有效的。分叉前出现的币,在新旧两条链上都是有效的。

既然分叉前的币在两条链上都有效,那就可能出现同一个币在新旧链中各花一次的问题,此时引入chain ID就可避免这种问题。以太坊的分叉就是采用的这种方式,现在以太坊的两条链就是两条独立运行的链。

软分叉

对比特币协议加一些限制,加入限制之后原来合法的交易或区块在新的协议当中有可能变的不是合法了,这就引起软分叉。

还是以修改区块大小为例,这次是将区块的大小改为0.5M。大部分节点都更新到新的协议,只有少部分节点未更新。

此时,新节点挖出的小区块对于新旧节点来说都是合法的,到会被添加到各自的链中;但就节点挖出的区块大小仍未1M,对于新节点来说是非法的,新节点会丢弃这个区块。一段时间后旧节点维护的链就会比新节点的短,此时根据比特币的“最长合法链原则”,旧节点就会同步新节点维护的链。虽然网络中会偶尔出现分叉的情况,但最终只会存在一条链,那就是新节点维护的链。旧节点挖出的区块并不会被存到新链中,也就没有出块奖励。

软、硬分叉的特定

  • 软分叉:只要系统中超过半数以上的算力更新了协议,那么系统就不会出现永久性的分叉,只可能会存在一些临时性的分叉
  • 硬分叉:必须系统中的所有节点都更新了协议,分叉才会消失

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意