比特币的分叉

一、分叉概述

比特币的区块链分叉有两种:状态分叉和协议分叉。

1. 状态分叉(state fork)

比特币系统每个节点都可以出块,如果有两个以上节点同时出块,或者在短时间内相继出块,那么就会出现状态分叉,状态分叉一般是临时性分叉,随着时间流逝,总会有一条链胜出成为最长合法链,其他分叉将会成为孤块,挖出这些区块的节点不会获得任何奖励。

分叉攻击(forking attack):
分叉攻击也属于状态分叉,恶意节点不接在最长合法链上的最新区块后面继续挖矿,而是接在之前的某一个区块后面出块,继而产生分叉,如果这条分叉的长度赶上最长合法链,分叉将成为最长合法链,这条链上的交易将被共识为合法交易,而被分叉的原先最长合法链的上的交易将全部失效。一般认为,需要占据全网51%的算力,分叉攻击的成功概率较高。

2. 协议分叉(protocol fork)

协议分叉指的是节点间对比特币协议意见不一致,不同协议可能会对区块的合法性产生不同的认定。协议分叉可分为硬分叉和软分叉,它们对比特币社区也会产生不同的影响。

  • 硬分叉(hard fork)
    旧节点不认可新节点的协议,必须所有节点更新为同一协议,才不会永久分叉。
  • 软分叉(soft fork)
    旧节点认可新节点的协议,只要系统中半数以上节点更新为新协议,就不会永久分叉。

下面将分别举例解释硬分叉和软分叉

二、硬分叉(hard fork)

比特币区块大小限制在1MB字节以内,每笔交易大概是250字节,可算出一个区块大约4000笔交易,推导过程如下:
1000 , 000 250 = 4000 \frac{1000, 000字节}{250字节}=4000笔交易
大约平均每隔10min产生一个区块,可算出因此比特币的吞吐量大约是7tps,推导过程如下:
4000 10 × 60 = 7 / \frac{4000笔}{10×60秒}=7笔/秒
由上可知,区块的大小是限制比特币吞吐量的一个重要因素,因此有人提议通过增大区块来提高吞吐量,这就会造成硬分叉。

如果大部分节点(51%算力以上)认可这项提议,更新软件去认可4MB字节的区块,并在新协议下产生了最长合法链,这时只要存在一部分节点不更新软件,将1MB字节以上的区块认定为非法区块,1MB字节协议的节点将会分叉为另一条链,这就导致了永久分叉,继而引起比特币社区的分裂。如下图所示:
在这里插入图片描述
分叉造成社区分裂,两条链将各自运营,但是引发一个新问题,分叉之前的交易输出在两条链上都是可以花费的,如果付款人在一条链上将一笔交易输出付给收款人,收款人可以将该条链上的这笔交易重放到另一条链,签名、交易来源在另一条链上也是完全有效的,所以收款人可以轻易在两条链上都获取一笔资金。

以太坊之前因为硬分叉分裂为ETC和ETH两个社区,后来在交易中加入了chainID字段,以便识别某一条交易属于哪条链,在另一条链上重放后就会被认为是无效交易。

三、软分叉(soft fork)

相反地,我们以区块大小减小为0.5MB字节为例(实际上缩小区块没有任何好处),如果大部分节点(51%算力以上)认可这项提议,更新软件只认可0.5MB字节以内的区块,超过0.5MB字节的则认定为非法区块,这时0.5MB字节协议的节点将形成最长合法链。未更新软件的1MB节点同样认为0.5MB的新区快为合法区块,也会接在这条最长合法链上挖矿产生区块,所以不会分叉为新的链。

但是由于更新软件的节点不认可1MB字节的区块,最长合法链上永远不会有1MB字节的区块,它们将成为孤块,所以未更新软件的节点相当于白白地付出算力,得不到任何区块奖励。如下图所示:
在这里插入图片描述

只要是给目前协议中没有规定的域赋予新的含义,都是软分叉,例如:

  • 目前coinbase中前8字节没有任何特殊含义,一般用作额外nonce值,曾有人提议将UTXO组成Merkle tree,根哈希写到coinbase域,为更新的旧节点对该域没有任何检查,如果该域被新节点修改为根哈希,旧节点仍然认可这个交易,不会独立成链,因此这种更新也可以认为是软分叉。
  • P2SH在比特币最初版本中没有出现,后期通过软分叉更新加入。旧节点只验证第一阶段,也就是验证哈希是否吻合,因此旧节点是认可带有P2SH的交易的,不会独立成链,而新节点则还会进行第二阶段的反序列化脚本验证,只要大部分节点(51%算力以上)加入P2SH特性,那么就可以认为比特币系统更新版本成功了。
发布了13 篇原创文章 · 获赞 2 · 访问量 2406

猜你喜欢

转载自blog.csdn.net/ice_fire_x/article/details/104173885