为了顺利引入新的 PoC2+ 标准 ,需要将全节点在共识层面上进行适当改造,也即所谓的分叉。本文为 Lava 核心开发者团队提出的分叉方案介绍。分叉一般有两种形态,一种是硬分叉,另一种是软分叉。该方案基于区块链的去中心化和社区自治精神,提出了一种由矿工投票激活的硬分叉方案,既有别于传统的硬分叉,也有别于比特币经常采用的 MASF (矿工激活软分叉)。

什么是硬分叉?

如果软件 / 硬件的规则发生改变,并且这种规则改变无法向前兼容。在区块链中,使用旧版本的节点和使用新版本的节点各成体系、无法互相辨认,称为硬分叉。

现实中的例子:

·苹果公司在 iPhone 5 上使用了 Lightning 接口,以替代此前的 30 针 Dock 接口。 iPhone 5 以前的手机无法使用新的接口, iPhone 5 以后的新手机也无法使用旧的接口。

什么是软分叉?

软分叉一般都是向前兼容的( Forward Compatibility ),也可以说是未来兼容。通俗解释就是:旧版本的软件 / 硬件,可以使用新版本的软件 / 硬件产生的数据。在区块链上可以理解为旧节点可以验证并接受新节点出的块。

现实中的例子:

·立体声 FM 广播是向前兼容,它既可以被单声道的老式收音机播放,但没有立体声效果;也可以被新式的立体声收音机播放,具有立体声效果。

软分叉在特殊情况下也可以是向后兼容( Backward Compatibility ),也即新版本的软件 / 硬件,可以使用旧版本软件 / 硬件产生的数据。在区块链上可以理解为,新节点也可以验证并接受老节点出的块。

现实中的例子:

· Intel 的 x86 指令集 CPU 是向后兼容的,新款 CPU 依然可以运行老款 CPU 的软件,这是由于 Intel 希望保证老版本 CPU 有的指令集在新版本中也得以保留。这种只增加不删除的策略,保证了我们换 CPU 时无需更换相配套的软件。

分叉涉及的技术层面

针对 Lav a PoC2+ 的分 叉方案中,在共识层面需要改动以下几处:

1. 区块头中需要新增一个 LAVA 挖矿者地址的字段。这种区块头中附带地址用以验证的方式, burst 已经使用,其地址即为区块头中的 PID 。因此 LAVA 中将以前的 PID 替换为 LAVA 专属地址的方法也是该思路的延续。

2. 挖矿相关的一系列接口,包括: Miner 请求信息, Miner 提交信息后的验证,以及全节点的铸块时校验等。

3. 全节点同步其他区块时的验证过程。

4. 全节点重启后读盘时的区块验证过程。

5. 绑定关系数据库升级。

详细分叉方案的分析

1. 向前兼容的软分叉

首先排除该方案。虽然该方案是区块链软分叉首选,但是由于需要修改区块头中的字段,因此就无法满足旧节点能够接收新节点出的区块这一大前提。

2. 向后兼容的软分叉

该方案的实际效果如下图 1 。根据向后兼容的大前提,由于新节点可以接收并验证老

节点出的区块,而旧节点却无法接收新节点出的区块。因此最后新节点逐渐超过旧节点算力达到 51% 时,两条链分叉。这虽然保证了分叉的效果,但是也存在相应的问题(如图 2 ),在最初始的网络中,由于旧节点算力占优( 51%~100% ),而新节点出块始终无法被旧节点接收,因此会存在很大程度上新节点算力的浪费。假设某时刻新节点挖出另一条链与老链分叉,在一段时间后老链的算力和长度会逐渐超过新链,新节点的向后兼容性又使得新链被旧链覆盖,整条新链的算力全都浪费。

图 1. 新节点算力超过 51%

图 2. 新节点算力不到 51% ,回到旧链

3. 传统硬分叉

传统硬分叉方式实际效果如下图 3 。 传统硬分叉是指直接通过更新软件来进行分叉,更新后的软件和原有版本的软件无法互认,因此形成两条独立的区块链。传统的硬分叉若没有得到生态中参与者的同意,容易造成生态的分裂,应当谨慎考虑。

图 3. 传统硬分叉

4. 一种由算力激活的链上硬分叉方案

Lava 提出了一种由矿工投票激活的硬分叉方案。这种方案的实际效果如图 4 。

该方案将硬分叉分为两个阶段:

第一阶段:分叉前的矿工投票激活和锁定;

第二阶段:锁定期结束后激活分叉。

图 4. 一种由算力主导的链上硬分叉方案

该方案的好处是:

第一,解决了上述向后兼容软分叉方案中,在分叉起始时新节点可能存在的算力浪费的问题。

第二,传统硬分叉由于两条区块链互相隔离、自成体系,可能导致生态的分裂。这是因为如果有部分生态参与者不同意分叉,但又强行被另一部分参与者意见裹挟而不得不服从,就容易引起不满和争议。硬分叉后,甚至可能存在两条链独立发展,例如以太坊( ETH )和以太坊经典( ETC )的案例。

算力激活硬分叉的第一部分:投票与锁定

矿工选择跟新全节点软件版本来铸造区块,新的全节点依旧会保持旧的共识规则,也即 PoC2 标准,与未更新软件的旧节点互认。新的全节点软件版本仅在区块头的版本中变更了版本号,用以表示出块者的投票意见(更新本身即是投票,无需作出额外动作)。一段时间后,全节点会自动统计“投票”阶段中新节点出块的量,当数量达到一定阈值,即可开启下一个阶段——锁定。

锁定阶段中,新旧节点依旧使用 POC2 的共识规则进行铸块,当锁定阶段结束,即进入硬分叉的第二部分,正式激活硬分叉。锁定阶段的意义是提供共识切换前的过渡时间,以便用户可以逐渐将硬盘中的文件从 POC2 格式迁移至 POC2+ (即给出时间以进行“重新 P 盘”),用以在即将来临的新链上继续挖矿。

算力激活硬分叉第二部分:正式激活分叉

进入激活阶段后,硬分叉正式生效,旧链和新链共存。旧链依旧沿用 POC2 共识,而新链,也即新节点将使用 POC2+ 共识进行铸造,验证,同步等过程。这也意味着,从此刻开始,新节点必须使用 LAVA 专属的 P 盘格式,否则将无法出块。