区块链作为一个数据结构,把历史数据按时间分成了一个个区块,每个区块上有一个指向上一个区块的指针,把区块串成了区块链。如果区块的产生是由一个中心化机构来负责,那么区块何时产生、如何产生和发布就不存在分歧,这种中心化区块链上的区块会始终保持队形整齐的不断增长1。
然而现在对于区块链技术的关注焦点在于其能实现去中心和去信任,这可是文明进步级的创新发明,区块链技术实现这个目标的做法是在如何产生新区块上做文章。我之前从分布式系统如何解决拜占庭将军问题开始用了好几篇博文来谈比特币区块链是如何实现了目前为止还算成功的去中心化和去信任的货币系统。
我之所以一直在说比特币区块链,而没有介绍其他密码货币或者其他领域的区块链应用,是因为在去中心和去信任这个终极目标上,没有任何区块链应用比比特币走得更远,很多区块链应用在这个领域都只在初级阶段。上一篇《比特币网络挖矿简史》提到按硬件设备将比特币网络的挖矿历史分成了四个时代,而其他的密码货币极少有从CPU一步步自然进化到第四代ASIC的,大部分还停留在GPU阶段(第二代),即便是已经到ASIC阶段的密码货币,基本上都是比特币进化过程中的分支,也可以说是分叉出来的。
区块链分叉的由来
为了实现去中心和去信任的共识,比特币引进了工作量证明(PoW)来竞争新区块的发布权。在复杂的P2P网络环境中,竞争者们共同去PK一个新区块的发布权,一定会产生各种各样的分歧。最常见的是十分钟内可能有两个节点同时2产生两个不同但都合法的新区块,这种情形我在《比特币网络的运行过程原理 》中介绍了比特币网络是通过一个简单规则来解决这类分歧的,就是最长链会被全网公认为正宗嫡传的区块链。
上图就是在比特币网络运行中经常出现的这类分叉,按照规则,经过若干个区块后,全网会把最长的那个链认作合法有效的区块链,不在这个链上的竞争区块就沦落为孤儿一样飘荡在比特币网络中,然后慢慢消失。下图是本文写作时比特币网络发生的最近一个孤块分叉。
但是我们今天要谈的分叉并不是刚刚说的这种分叉,在比特币网络中,还存在着其他类型的分叉,它们会给比特币网络带来很多风险,这些分叉主要来自于两个方面的原因:
1、比特币网络是一个软件系统,只要是软件就会有缺陷(bug),比特币网络当然也不例外。从诞生起,比特币历史上曾经出现过非常严重的系统漏洞,因此比特币网络经常需要升级软件版本来消除已知缺陷。可是比特币网络存在一个其他软件系统没有的情况,它是完全去中心化的点对点系统,所有节点是否愿意升级软件是一个疑问,甚至很多节点能不能知道有软件升级这回事都存在问题。于是比特币网络节点的软件版本也许是百花齐放。有些版本升级所解决的缺陷可能对整个区块链没有太多影响,升不升级不那么敏感,但有些缺陷的处理会对区块链的共识产生严重影响,这就需要谨慎对待了。我在《比特币创世区块的神话传说》那篇博文提到,比特币创世区块所得到的50枚比特币奖励不能使用,就是这样的缺陷,在两害取其轻的选择下,比特币网络只好牺牲谁也不认识的中本聪的利益了,一直没有去修改那个缺陷。
2、比特币网络2009年刚刚问世的时候,他的规则有许多内在的硬性限制,比如每个区块产生的平均时间、每个区块的大小、每个区块的签名数目、比特币总量和区块奖励结构等等。那时没有人会想到比特币会发展成一个重要的国际货币,因此这些初始设计现在看来确实有很多不合理的地方,其中有两个是争议最大的:
(1)比特币网络的交易处理能力限制。这是因为比特币限制了每个区块的大小为1MB和平均每十分钟产生一个区块,那么我们根据每笔交易大约250个字节,可以算出每个区块最多容纳4000笔交易,十分钟交易4000笔就相当于1秒钟最多交易7笔。对比一下支付宝平均每秒能处理25.6万笔交易的差距,可见比特币如果不突破交易处理能力限制,那么其作为货币的应用前景将大打折扣。
(2)比特币采用的密码算法目前是安全的,但是随着对算法研究的深入以及未来计算能力越来越强的计算机出现(量子计算机),目前的密码算法终究有一天会失去安全性,那么比特币显然不能让密码算法的安全寿命限制自己的万寿无疆,未来一定需要修改密码算法来升级比特币软件。
基于以上两个原因,比特币网络需要不断升级版本来修改缺陷、修订限制条件或增加新的功能,然而正如我在第一个原因中提到,比特币网络节点(矿工)一方面可能不清楚升级的事情,不及时升级软件版本,另外一方面一些矿工可能对修订的限制条件或者新功能不满意,而故意不升级,也就是说有一部分比特币矿工可能对规则本身就有分歧,从而影响到比特币区块链的整体。
区块链是如何解决这个问题的呢,其实从软件角度并没有完美的办法解决,只能跟我们正常运行时一样,该发布升级就发布(当然需要经过非常慎重的权衡才会实施)。升级后比特币网络的节点开始分成旧版本和新版本两个阵营,各自在自己认为合法的最长区块链上继续挖矿,造成区块链出现了或短期或永远存在的两个分支,这就是我们本文所想讨论的区块链分叉。这是以去中心化为目标的区块链技术应用一定会面对的问题,如何妥善处理每一次分叉与区块链应用的成功与否密切相关。比特币现在是目前市值最高也是最重要的密码货币系统,所以比特币的区块链分叉一定是区块链所有相关方必须关注的重大事件。
区块链分叉的分类
面临分叉是区块链技术在去中心化应用里必须面对的问题,仔细分析分叉的原因和解决办法,把对区块链的影响降低至最小是至关重要的。在分析区块链分叉时一般会有两个维度来对分叉的性质进行分类,一种是从分叉起因来分类,一种是从分叉结果来分类。
从起因来看,区块链分叉存在无意识分叉和有意识分叉两种。前者一般是由于区块链规则或者软件存在缺陷,在某种场景下造成出乎意料的情况甚至有失控的风险,这一类分叉需要区块链相关各利益角色共同决定如何处理,往往特别大的漏洞不仅仅需要迅速的发布升级版本来解决,甚至可能需要回滚若干区块,这种处理非常少见(简直致命),但是在比特币早期确实也发生过3。后一种有意识分叉是指在已经了解了区块链系统存在某些潜在缺陷或者需要变更规则增加新功能的情况下,有计划的发布新软件版本来对整个区块链进行升级。有意识分叉必须要非常谨慎的分析如何实施升级计划,并且要在区块链各种角色之间进行非常充分的讨论并达成一定程度的共识才能实施。
从分叉结果来看,区块链有软分叉和硬分叉。区块链软件升级后,至少有一段时间在整个区块链网络里有升级后的节点(简称新节点)和未升级的节点(旧节点),而新旧节点对于旧节点用旧规则挖出区块的合法性可能会有分歧,同样它们对于新节点用新规则挖出区块的合法性也可能有分歧。一般会分成以下四种情况:
先解释一下上面图表的四个场景,不同场景的分别是在软件升级后,网络上存在新节点和旧节点,它们继续竞争产生新区块,新旧节点产生的新区块是分别按照新旧规则产生的。这些区块在网络上广播后,接受到的节点也有新节点和旧节点,它们要用自己新旧规则来判断收到的区块是否有效,当然它们对与自己版本相同的区块一定是接受的,关键就是对不同版本区块的态度。因此上面的图表根据新旧节点对于旧新规则区块的态度总共会有四种场景。
在分别说明各种场景之前,还有一个潜在的前提条件需要交代。任何一次软件升级之前,比特币社区都会有非常谨慎和充分的讨论,除非是紧急修补缺陷(那也是全网密切关注的时刻)。因此真的发布新版本软件时,绝大部分节点都会及时升级为新节点(除非是故意的想留在原来版本上的节点)。
软件升级场景1
这种场景新旧节点都接受对方生产的区块,因此区块链不会产生分叉。
软件升级场景2
这种场景分歧来自于新节点对旧节点生产的区块不认可,而旧节点能接受所有的区块。这样,旧节点会挖到一些无效的区块(占大多数的新节点不认可),旧节点就会奇怪的发现自己辛苦挖出的区块不被别的节点接受,于是旧节点的矿工就会主动去找原因最终升级软件。在这种场景下,区块链的增长会跟本文一开始提到的那种分叉一样,只是增加了许多临时的小型分叉而已,最后那些没被认可的区块都将被抛弃。这种分叉对区块链影响较小,被称为软分叉。
软件升级场景3和4
这两种场景最重要的特征是旧节点不接受新节点生产的区块,那么无论新节点接不接受旧节点的区块,从旧节点来看根本就不存在新节点,会一直按照旧规则校验区块和生产区块。那么那条旧的区块链会在这些旧节点的维护下继续增长,不会去看新节点们做了什么。而新节点在新规则下不断延长新规则的区块(如果新节点接受旧规则区块,则对新规则区块链就不断形成小型分叉)。从整个区块链开看,原来的区块链从某个区块开始分叉出来两条自行发展的区块链,就像平行宇宙一样,各自走向属于自己的那个时空了。这样的分叉称为硬分叉。
区块链的硬分叉就如同分家一样,直接造成区块链出现两个分支。比特币去年就经历了一场举世瞩目的大分家,其结果出现了三个都自称为正宗比特币的阵营,其中一个被称作Bitcoin Core,简称为BTC,中文为“比特币”(保留了正宗名号);另一个被称为Bitcoin Cash,简称为BCH,中文为“比特币现金”;还有一个被称作Bitcoin Gold,简称BTG,中文为“比特币黄金”。
注释:
[1] 这里提到的中心化区块链形式当然也是区块链的一种形式,其实我认为这种形式也许是区块链技术将来应用蓬勃发展的基础性应用,未来我会在介绍区块链应用时谈谈这方面的内容。由于目前社会关注点还在区块链的去中心化和去信任,所以暂时本篇继续沿着这个热点来科普这方面的技术原理。
[2] 时间间隔小于新区块发布到全网的时间。
[3] 这里我要再强调一下,那种认为区块链已经在技术上实现了去中心和去信任的安全目标的观点,是一种大大的误解,区块链实现这个目标,技术只是一个基础部分,其他各种博弈规则以及比特币社区的软件维护等等许多非技术环节都是为实现这个目标不可或缺的部分。