State fork
由于对区块链目前的状态分歧而产生的分叉
forking attack(deliberate fork)分叉攻击
故意造成的状态分歧
Protocol fork
由于协议不同而产生的分歧
升级软件时,没办法保证去中心化的系统中所有节点都进行了升级
假设新节点是更改协议后的节点,且数量较多,旧节点不更改协议,数量较少
Hard fork
概念
对比特币协议增加新功能或特性,没有更新的节点不认可这些新特性,产生不可恢复的分叉,称为硬分叉。这意味着新增加的特性必须被所有节点接受,如果有节点不接受,就会产生永久分叉。
例如:对block size limit进行修改,从1M改为4M
旧节点不能认可新节点发布的大于1M的块,认为新节点的较长链是非法的,从而产生分叉,只要旧节点不更新协议,就会一直分叉下去
实际例子
新旧节点由于协议产生冲突,可能会导致链的分裂,从而产生两种货币共存的现象。例如以太坊ETH,现在分为了ETH和ETC两部分(c为classic),是由于以太坊在受到攻击后,选择使用硬分叉的方式回滚一些交易而造成的。
产生两种货币共存的现象后,为了区分两个链上的货币(如果不区分,会造成A本来想把ETH币转给B,但是这笔交易被记录在两条链上,A会同时把ETC币转给B的问题),使用chain ID来进行标识区分。
Soft fork
概念
对比特币协议增加新功能或特性,没有更新的节点不认可这些新特性,产生临时性的分叉,称为软分叉。意味着只要有半数以上的节点接受了这个新特性,系统就不会产生永久分叉(会暂时分叉)。
例如:对block size limit进行修改,从1M改为0.5M
新节点不认可旧节点发出的0.5M以上的块,从而维持一条0.5M以下的较长链;旧节点认可新节点发出的块,认为新节点的链是更长的合法链,因此放弃自己出的0.5M以上的块,这样会造成暂时性的分叉。
实际例子
为区块中没有使用规定的域赋予新的含义,例如coinbase域,有人提出用来存放UTXO的根Hash值(把UTXO也组织成Merkle Tree的形式),利于轻节点检查某个帐户的余额信息是否正确(需要从全节点处得到该信息)。这样会造成软分叉。
比特币历史上著名的软分叉:P2SH Pay to Script Hash
支付时不是给一个公钥的哈希,而是给出一个赎回脚本的哈希(redeem script)