什么是比特币的分叉?

区块链是比特币中具体实现分布式账簿的数据结构。它由许多区块首尾相连而成,每一个区块都记录着系统一段时间内的交易数据。与区块链不同,分叉是不同参与者在确定通用规则时发生的技术事件。

假设比特币的网络是同步的,且不存在多个矿工同时挖出一个合法区块的情况,那么系统中的区块会依次不断产生并添加到区块链尾部。在这种状态下,系统中的所有节点所存储的区块链数据一致。

然而,比特币是基于点对点网络建立的系统,区块的传播必然存在延时,且矿工之间的挖矿工作相互独立,存在同时挖矿成功的可能。在这种情况下,系统将不再处于理想状态。考虑延时和竞争的情况下,假设当前区块链的长度为L,链尾部区块为b。在某一时刻,矿工Alice 首先挖出了区块ba,并开始向全网传播ba。与此同时,系统中的另一位矿工Bob也在对长度为L的区块链进行挖矿,恰巧Bob在ba传达到他之前独自挖出了一个区块bb。他并不知道区块ba已经被挖出,于是开始向全网传播bb。这时网络中同时有两个区块ba和bb在传播,且这两个区块都指向同一个前驱区块b。随着这两个区块被不断转发,系统中的节点将会分别以Alice和Bob为中心维护着两个长度同为L+1的链chaina和chainb,但两者尾部区块并不相同。最终,网络中在Alice和Bob中间的一些节点最终会收到来自两边试图延伸同一个区块链的不同区块。这些节点会将两个区块都追加在区块b处,这就是区块链的分叉。

比特币处理区块链分叉方法是先让节点继续在两条链上继续挖矿,一旦有一条链的高度超过了其他支链,那么这条链就会胜出成为主链,而其他支链将会被抛弃。这些被抛弃链上的区块不再有任何意义,被称为孤块。这种处理分叉的方法实际上就是比特币的共识,即所有节点都遵循的一个公开规范。共识也是去中心化系统解决竞争问题的主要方式之一。

比特币的设计决定了其升级或者修改规范是非常难以实现的。因为去中心化的特性,任何对区块结构或者是计算规范的改变,都会影响每一个节点的挖矿、验证以及历史数据的合法性。但是,分叉可以用来巧妙地实现协议或者规范升级。比特币有两种分叉升级策略:硬分叉和软分叉。

硬分叉升级有一个特点,即旧的区块按照新规范仍然能被验证通过,但新的区块不能被旧的规范所认可。所以,硬分叉在实施前会事先调查新规范的接受程度,当多数节点同意升级规范后,新规范就被正式实施。硬分叉初期,系统将会产生大量按照新规范产生的区块,而未升级的节点无法验证通过这些区块而舍弃它们。由于不同的共识,硬分叉会使未升级节点与升级节点分别在旧区块链上和新的分支上继续挖矿。但是,由于升级节点占多数,未升级矿工也会逐渐升级,新的分支最终将会替代旧链,升级过程得以实现。硬分叉的实施关键取决于大部分计算能力是否支持升级方案。截止到目前,比特币还未进行过任何的正式硬分叉升级,而正在准备进行的SegWit2x将会是比特币第一次正式硬分叉(SegWit2x是将区块大小上限扩大为2 MB的方案)。

软分叉不是真正意义上的分叉,而是一种双向兼容的规范设计。软分叉要求新规范下的区块能够被未升级节点认可,而升级节点同样也能够认可按照旧规范产生的区块。这种升级不会造成实际分叉,是一种非常平稳的方法,适用于细微的规范和协议修改。2012年,比特币通过软分叉实现了BIP(Bitcoin Improvement Proposal)16中 添 加 P2SH 锁 定 脚本签名方案的升级。软分叉对设计有着相当高的要求,在对协议或者规范进行破坏性修改时,软分叉的实现会非常困难,甚至不能胜任。而一旦软分叉的实现过于复杂,其实现过程中出现漏洞的可能性也会增大。

比特币的这两种分叉升级策略各有优缺点,所以升级时需要按照实际情况选择使用。