日度归档:2016 年 10 月 17 日

矿工指引:如何安全的硬分叉到Bitcoin Unlimited

由于 Bitcoin Unlimited 并没有程序来控制硬分叉启动的条件,所以硬分叉到 Bitcoin Unlimited 需要参与的矿池联合起来,达成一致行动。另外矿池如果配置不当可能会造成遭受大块攻击,或者造成比特币网络突然的提前分叉,这是非常危险的。随着越来越多的矿池对 Bitcoin Unlimited 感兴趣,我建议矿池按照下面所述的步骤来实施硬分叉。

整个硬分叉过程应该分为三步。第一步:算力投票阶段,如果在一个完整的难度周期中,由 Bitcoin Unlimited 挖出的区块占比等于或大于 75% 则进入下一步骤。第二步:锁定阶段,共两个难度周期,供比特币社区升级他们的软件到 Bitcoin Unlimited, 如果两个难度周期内任何一个难度周期中 Bitcoin Unlimited 的区块没有满足 75% 条件,则回到第一步。第三步:实施阶段,开始硬分叉。

在第一步中,如果矿池配置不当或者使用 Bitcoin Unlimited 的默认配置,可能会遭受到别有用心的人发出的大区块攻击。如果这时候 Bitcoin Unlimited 算力占比比较小,会造成 Bitcoin Unlimited 一方工作在错误的链上,造成严重损失。如果双方势均力敌,那么比特币会面临分裂的危险。如果已经到了第二步,那么分叉会发生在预定的时间之前,这会造成混乱。

我的建议是矿池在第一步和第二步的时候,把 Bitcoin Unlimited 配置为 EB1/AD6, 其含义为接受 1MB 大小的区块,如果有更大的区块,只有在该大区块之后有 6 个或以上的区块,并且包含大块的链为最长链,那么比特币节点会切换到包含大区块的链上。可以通过在 Bitcoin 配置文件中添加下面两行来实现:

excessiveblocksize=1000000
excessiveacceptdepth=6

在这样的设置下,攻击者必须要有 51% 以上的算力才可以实现大区块攻击,已经足以保证安全了。AD 不宜设置的过大,因为在到达到第三步的时候,矿池不大可能在同一时间切换,AD6 的设定保证矿池即使没有及时修改配置,也可以及时切换到最长链,降低损失。

另外,矿池还需要设置区块版本号和挖出的区块大小。Bitcoin Unlimited 的默认版本号为 Bitcoin Classic 的版本号 0x30000000,这是容易引起误解的,建议改为 0x20000000. 另外,挖出的区块大小应配置为 1MB. 可以通过在 Bitcoin 配置文件中添加下面两行来实现:

blockversion=536870912
blockmaxsize=1000000

到达第三步之后,矿池修改接受的区块大小和挖出的区块大小,开始硬分叉。我建议先硬分叉到 2MB,这是经过充分测试证明网络能够支持的大小,是风险最低的选择。可以通过修改 Bitcoin 配置文件来实现:

excessiveblocksize=2000000
blockmaxsize=2000000

相信通过这样的步骤和配置,可以让硬分叉变得更安全。