区块链,这一位于互联网之上的庞大分布式系统,遍及每一位网络参与者,即矿工的电脑之中。简言之,每当区块链需要更新或修改系统时,所有网络参与者都必须下载并运行新版本的区块链客户端,以此完成更新。然而,分布式共识系统的升级面临的一大挑战是,难以让所有网络参与者在同一时间完成更新。一旦有参与者未能及时更新客户端,网络上便会存在不同版本的区块链,导致所谓的“分叉”。因此,在进行区块链更新时,协调所有系统参与者至关重要,否则可能威胁到系统的安全性。
分布式共识系统升级的另一个难题是,必须确保所有网络参与者达成共识。若部分矿工同意更新,而另一部分则拒绝,矿工之间将出现共识问题。区块链更新时可能出现的共识问题主要包括以下四种情况:
- 新矿工接受旧矿工挖出的区块 - 新矿工不接受旧矿工挖出的区块 - 旧矿工接受新矿工挖出的区块 - 旧矿工不接受新矿工挖出的区块 - 硬分叉当系统中出现新版本的更新且与旧版本不兼容时,旧矿工无法接受新矿工挖出的全部或部分区块,区块链便会发生硬分叉。以比特币为例,若更改区块大小、挖矿难度或出块速度等重要参数,任何一个规则的变动都可能使新区块无法被旧版本的共识规则接受。例如,如果更新后区块容量限制从1MB增加到4MB,运行新版本的矿工将接受4MB的区块,但运行旧版本的矿工则会拒绝。
当新矿工占据大部分算力时,旧矿工有两个选择:一是接受更新并升级客户端软件,这意味着社群对版本更新达成共识,区块链可以安全且顺利完成更新;二是坚持维护旧版本的系统,导致区块链分裂为两条链。在这种情况下,即便接受更新的新矿工算力超过51%,旧矿工仍然不愿意接受新版本,此时“最长链共识”不适用。
若大部分矿工选择更新,新版本的算力将更强。剩下的就是看旧版本的算力是否足以支持维护一条链的安全。如果仍有部分矿工坚持维护旧版本,区块链就会分裂成两条链。在这种情况下,会出现两种不同的币(大多数硬分叉,例如以太坊的君士坦丁堡硬分叉,矿工普遍接受新版本的区块链,不存在共识问题,因此不会分裂),这就是所谓的“分叉币”。例如,比特币社群在2017年的扩容方案理念产生分歧,无法达成共识导致硬分叉,比特币现金(Bitcoin Cash)因此诞生。
对于用户而言,这种社群分裂的硬分叉,最直接的影响是可以领取分叉币。举个例子,分叉前你在钱包中有“1 btC”,分叉后你将拥有“1 btC + 1 BCH”。在没有得到所有生态参与者同意的情况下,硬分叉具有很大的风险,可能导致区块链生态系分裂、算力分裂,甚至陷入重放攻击的危险中。因此,这是一种极具争议和危险的区块链升级技术,区块链社群对硬分叉非常谨慎。
软分叉是指在新矿工算力超过51%的情况下,新矿工产生的区块不能兼容旧矿工产出的区块,而旧矿工可以兼容新矿工产出的区块。如果以“更严格的规则”进行更新,实现协议修改或添加不影响结构的功能时,则旧矿工将接受新矿工所产的区块;相反,由于新矿工所认定的协议较严格,新矿工将会拒绝旧矿工所产的区块。在这种情况下,旧矿工在正常情况下,会选择升级,否则其所产的区块会无法被新矿工接受,无法获得挖矿奖励。(遇到例如意识形态或开发观点不同等特殊情况时,旧矿工仍然有可能会选择不接受新矿工产出的区块,继续维护旧版本的链,进而导致硬分叉甚至分裂。)
以比特币为例,理想的情况是,旧矿工会意识到他们的区块被拒绝了,便会选择升级。随着越来越多的矿工升级,这将进一步孤立旧版本的区块,在利益的驱使下,会诱使更多旧矿工升级,于是,系统便能以较温和的方式完成更新。
例如,社区决定将块大小从目前的1MB限制减少到0.5MB。占多数的新矿工会拒绝旧矿工产出的1MB区块,并选择其他矿工产出的符合条件的区块。
软分叉的更新时常发生。最初比特币没有区块大小的限制,是在之后通过软分叉引入1MB的限制,还通过软分叉成功添加了pay-to-script-hash函数,该函数在不改变结构的情况下增强了代码。这种类型的更新通常只需要大多数矿工进行升级,其他矿工便会随之升级,这使得它更可行,破坏性更小。
软分叉与硬分叉相比,软分叉的过程中,在正常情况下,只会存在一条链,没有分成两条链的风险,且软分叉不要求所有矿工同一时间升级,而是以较温和的方式逐步升级,不影响软分叉过程中的系统稳定性和有效性。
然而,两者并没有孰优孰劣之分,而是适用性的问题。假如进行大规模的区块链更新,势必会牵涉到不被旧协议接受的规则,即便我们都知道软分叉比硬分叉来得安全,还是只能选择以硬分叉进行区块链升级。
不过也不需要把硬分叉想得太过可怕,因为只要全网矿工对升级有相同的共识,就不会分叉成两条区块链,影响到安全性。
总归一句,对区块链升级而言,重要的不是硬分叉还是软分叉,而是矿工与矿工之间的共识是否一致。这部分称之为“区块链治理”,若共识处理不好则容易导致革命,这也是为什么区块链的升级相较传统软件还要来的困难。
标签: 数字货币