软件由于方案优化、BUG修复等原因进行升级是一种非常常见的现象。如手机应用等传统软件,升级非常简单,只需厂商发布,用户接 受升级即可。但是对于比特币这种去中心化的系统,升级是非常困难 的,需要协调网络中每个参与者。软件升级意味着运行逻辑的改变, 但是在比特币中,升级必然会导致不同节点在一定时间内运行不同的版本,于是就会产生分叉。

分叉主要包含软分叉硬分叉两种。如果比特币升级后,新的代 码逻辑向前兼容,即新规则产生的区块仍然会被旧节点接受,则为软 分叉;如果新的代码逻辑无法向前兼容,即新产生的规则产生的区块无法被旧节点接受,则为硬分叉。

软分叉

软分叉由于向前兼容,新旧节点仍然运行在同一条区块链上,并不会产生两条链,对整个系统影响相对较小。到目前为止,比特币发生过多次软分叉,如BIP-34,BIP-65,BIP-66,BIP-9等。其中比特币改进建议(Bitcoin Improvement Proposal, BIP)指的是比特币社区成员针对比特币提出的一系列改进建议,这些改进建议的具体内容感兴趣的读者可以通过访问BIP的网站(1)自行查阅。

此处以BIP-34为例,简单说明软分叉的过程。在旧版本中,存在一个无意义的字段“coinbase data”,矿工不会去验证该字段的内容。BIP-34升级的新版本则要求该字段必须包含区块高度,同时将版本信息由“1”修改为“2”。该升级共包含三个阶段。

第一个阶段:矿工将版本号修改为“2”,此时所有矿工验证区块时,按照旧的规则验证,即不关心“coinbase data”字段内容,所有矿工不论以新规则还是旧规则打包区块,均可以被整个网络接受。

第二阶段:如果最新产生的1 000个区块中,版本号为“2”的区块个数超过75%时,则要求版本号为“2”的矿工必须按照新的规则打包区 块,升级的矿工收到 版本号为 “2”的区块时 , 只会接受“coinbase data”字段包含区块高度的区块,对于版本号为“1”的区块,仍然不校验该字段并接受。

第三阶段:如果最新产生的1 000个区块中,版本号为“2”的区块个数超过95%,则升级的矿工只接受版本号为“2”的区块,并会对“coinbase data”字段进行校验,版本号为“1”的区块则不被接受,以此来逼迫剩余少量矿工进行升级。

软分叉虽然对系统的影响较小,但是为了保证向前兼容,不能新增字段,只能在现有数据结构下修改,即可升级的内容非常有限。同时,因为这些限制,软分叉一般升级方案比较复杂,复杂的方案往往更容易产生BUG,并且可维护性很差。