精通比特币(88):改变共识之硬分叉

  • A+
网络也可能会分叉到两条链条,这是由于共识规则的变化。这种分叉称为硬分叉,因为这种分叉后,网络不会重新收敛到单个链路上。相反,这两条链子独立发展。当比特币网络的一部分节点按照与网络的其余部分节点不同的一致性规则运行时,硬分叉就会发生。
这可能是由于错误或者由于故意改变了协商一致规则的实施而发生的。硬分叉可用于改变共识的规则,但需要在系统中所有参与者之间进行协调。没有升级到新的共识规则的任何节点都不能参与共识机制,并且在硬分叉时刻被强制到单独的链上。

 

因此,硬分叉引入的变化可以被认为不是“向前兼容”,因为未升级的系统不能再处理新的共识规则。

 

硬分叉的技巧和具体的例子

下图显示区块链出现两个分叉。在块高度4处,发生单一个区块分叉。经过块5的挖掘,网络在一条链上重新收敛,分叉被解决。

精通比特币(88):改变共识之硬分叉

然而,后来在块高度6处发生了硬分叉。我们假设原因是由于新共识规则的变化出现新的客户端版本。从块高度7开始,矿工运行新的版本,需要接受新类型的数字签名,我们称之为“Smores”签名,它不是基于ECDSA的签名。紧接着,运行新版本的节点创建了一笔包含Smores签名的交易,一个更新了软件的矿工挖矿出了包含此交易的区块7b。
任何尚未升级软件以验证Smores签名的节点或矿工现在都无法处区块7b。从他们的角度来看,包含Smores签名的交易和包含该交易的块7b的交易都是无效的,因为它们是根据旧的共识规则进行评估的。
这些节点将拒绝该笔交易和区块,并且不会传播它们。正在使用旧规则的任何矿工都不接受块7b,并且将继续挖掘其父级为块6的候选块。实际上,使用如果它们连接的所有节点都是也遵守旧的规则,遵守旧规则的矿工甚至可能接收不到块7b,因此不会传播这个区块。最终,他们将能够开采区块7a,这个旧的规则是有效的,其中不包含与Smores签名的任何交易。
这两个链条从这一点继续分歧。 “b”链的矿工将继续接受并开采含有Smores签名的交易,而“a”链上的矿工将继续忽视这些交易。即使块8b不包含任何Smores签名的交易,“a”链上的矿工也无法处理。对他们来说,它似乎是一个孤立的块,因为它的父“7b”不被识别为一个有效的块。

 

硬分叉:软件,网络,采矿和链

对于软件开发人员来说,术语“分叉”具有另一个含义,对“硬分叉”一词增加了混淆。在开源软件中,当一组开发人员选择遵循不同的软件路线图并启动开源项目的竞争实施时,会发生叉。我们已经讨论了两种情况,将导致硬分叉:共识规则中的错误,以及对共识规则的故意修改。在故意改变共识规则的情况下,软件叉在硬分叉之前。但是,对于这种类型的硬分叉,新的共识规则必须通过开发,采用和启动新的软件实现。

 

试图改变共识规则的软分叉的例子包括Bitcoin XT,Bitcoin Classic和最近的Bitcoin Unlimited。但是,这些软分叉都没有产生硬分叉。虽然软件叉是一个必要的前提条件,但它本身不足以发生硬分叉。
对于硬分叉发生,必须是由于采取相互竞争的实施方案,并且规则需要由矿工,钱包和中间节点激活。相反,有许多比特币核心的替代实现方案,甚至还有软分叉,这些没有改变共识规则,阻止发生错误,可以在网络上共存并互操作,最终并未导致硬分叉。

 

不同的共识规则在交易或块的验证中会以明确的和清晰的方式有所不同。这种差别可能以微妙的方式表现,比如共识规则适用于比特币脚本或加密原语(如数字签名)时。最后,共识规则的差别还可能会由于意料之外的方式,比如由于系统限制或实现细节所产生的隐含共识约束。在将Bitcoin Core 0.7升级到0.8之前的意料之中的硬分叉中看到了后者的一个例子,这是由于用于存储块的Berkley DB实现的限制引起的。

 

从概念上讲,我们可以将硬分叉子看成四个阶段:软分叉,网络分叉,挖矿分叉和区块链分叉。
该过程开始于开发人员创建的客户端,这个客户端对共识规则进行了修改。当这种新版本的客户端部署在网络中时,一定百分比的矿工,钱包用户和中间节点可以采用并运行该版本客户端。得到的分叉将取决于新的共识规则是否适用于区块,交易或系统其他方面。
如果新的共识规则与交易有关,那么当交易被挖掘成一个块时,根据新规则创建交易的钱包可能会产生出一个网络分叉,这就是一个硬分叉。

 

如果新规则与区块有关,那么当一个块根据新规则被挖掘时,硬分叉进程将开始。
首先,是网络分叉。基于旧的共识规则的节点将拒绝根据新规则创建的任何交易和块。此外,遵循旧的共识规则的节点将暂时禁止和断开发送这些无效交易和块的任何节点。因此,网络将分为两部分:旧节点将只保留连接到旧节点,新节点只能连接到新节点。基于新规则的单个交易或块将通过网络波动,实现分区,导致出现两个网络。
一旦使用新规则的矿工开采了一个块,挖矿和区块链也将分叉。新的矿工将在新区块之上挖掘,而老矿工将根据旧的规则挖掘一个单独的链条。处于分区的网络将使得按照各自共识规则运行的矿工将不会接收彼此的块,因为它们连接到两个单独的网络。

 

分离矿工和难度

随着矿工们被分裂开始开采两条不同的链条,链上的哈希算力也被分裂。两个链之间的挖矿能力可以分成任意比例。新的规则可能只有少数人跟随,或者也可能是绝大多数矿工。
我们假设,例如,80%-20%的分割,大多数挖矿能力使用新的共识规则。我们还假设分叉在改变目标(retarget)后立即出现。这两条链将从改变目标之后各自接受自己的难度。新的共识规则拥有80%的以前可用的挖矿权的承诺。从这个链的角度来看,与上一周期相比,挖矿能力突然下降了20%。区块将会平均每12分钟发现一次,这意味着可以扩大这条链的挖矿能力下降了20%。这个块发行速度将持续下去(除非有任何改变哈希功率的因素出现),直到2016块开采,这将需要大约24,192分钟(每个块需要12分钟)或16.8天。 16.8天后,基于此链中哈希算力的减少,改变目标将再次发生,并将难度调整(减少20%)每10分钟产生一个区块。
少数人认可的那条链,根据旧规则继续挖矿,现在只有20%的哈希算力,将面临更加艰巨的任务。在这条链上,平均每隔50分钟开采一次。这个难度将不会在2016个块之前进行调整,这将需要100,800分钟,或大约10周的时间。假设每个块具有固定容量,这也将导致交易容量减少5倍,因为每小时可用于记录交易的块大幅减少了。

 

有争议的硬叉

硬分叉被视为有风险,因为它们迫使少数人被迫选择升级或是必须保留在少数派链条上。将整个系统分为两个竞争系统的风险被许多人认为是不可接受的风险。结果,许多开发人员不愿使用硬分叉机制来实现对共识规则的升级,除非整个网络都能达成一致。
任何没有被所有人支持的硬分叉建议也被认为是“有争议”的,不愿冒险分裂系统。硬分叉的问题在比特币开发社区也是非常有争议的,尤其是与控制区块大小限制的共识规则的任何提议相关。一些开发商反对任何形式的硬叉,认为它太冒险了。另一些人认为硬分叉机制是提升共识规则的重要工具,避免了“技术债务”,并与过去提供了一个干净的了断。
最后,有些开发商看到硬分叉作为一种应该很少使用的机制,应该经过认真的计划,并且只有在近乎一致的共识下才建议使用。我们已经看到出现了新的方法来解决硬分叉的危险。

发表评论

您必须才能发表评论!