月度归档:2016年10月

矿工指引:如何安全的硬分叉到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

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

为什么比特币需要区块扩容以及为什么选择Unlimited

在2016年10月10日,也就是比特币在米兰的第三次扩容会议刚刚结束之后,我选择了把 ViaBTC 矿池的 Bitcoin 版本从 Bitcoin Core 切换到了 Bitcoin Unlimited. 当然,这一决定是在争取到绝大部分矿池用户的同意之后做出的,我不能把我的意志强加到用户身上。比特币区块扩容与否,是由所有比特币矿工所决定的。但是在扩容这件事情上,矿池的管理员相比于矿工有更多的专业能力,能够做出更好的选择。并且从以往的经验来看,矿工参与投票的积极性非常低。所以,我认为矿池管理员应该负起责任,做出自己的选择。

ViaBTC 在 Coinbase 中投票支持 2MB 区块大小,目前仍然挖 1MB 大小的区块,以保证与比特币主链的兼容。不需要为这个大小担心,因为这只是一个开始,一旦硬分叉成功实施,再升级区块大小就很容易了。我还特意的设置了区块版本号,没有使用 Bitcoin Unlimited 默认的 BIP109 区块版本号,因为 Bitcoin Unlimited 并没有实现 Bitcoin Classic 的 BIP109,我们也不想实现 BIP109. 也希望 Bitcoin Unlimited 开发者后续能够去掉这个默认的版本号,防止引起误解。

在我们发现第一个 Bitcoin Unlimited 区块之后,比特币社区引起了很大的反应,有很多争议和猜测,所以我觉得有必要说些什么,来澄清一些事实,阐述我的看法。

为什么比特币需要区块扩容?

很简单,如果比特币区块不扩容,那么比特币将走向失败。这不是说加密电子货币会失败,也许会有新的币替代比特币的地位。比特币还远远处于它的发展的早期,越来越多的人开始使用比特币。然而,由于临时性的 1MB 区块大小的限制,比特币开始拒绝新的用户的加入,在我看来,这是一种自杀行为。慢慢的,比特币交易费会变得高的不可接受,人们会转向其它竞争币。用户的流失对比特币的发展是致命的打击,这不是猜测,是正在发生的事情。另一方面,没有足够多的链上交易,比特币矿工获取不到足够多的交易费,若干年后,比特币挖矿变得无利可图,这会让比特币系统安全性大大降低。无论如何,这都会导致比特币的失败。

为什么隔离验证是垃圾?

人们说隔离验证能够安全的让比特币扩容到1.7MB,所以应该支持隔离验证,这种想法真是一叶障目。1.7MB的扩容只是减缓了比特币的死亡而已,并没有根本的解决了这个问题。并且就算隔离验证真的激活了,并不代表所有人都会马上使用隔离验证交易,真正达到1.7MB需要1年以上的时间,根本没法解决目前交易拥堵问题。另外,隔离验证给比特币社区带来了巨大的技术债务,大幅修改了比特币交易格式,需要所有的比特币节点、矿池、区块浏览器、钱包、交易所等比特币应用进行升级。这样的代价远远大于硬分叉,而这所有的一切,仅仅是为了1.7MB的扩容?别忘了,Bitcoin Core 提出隔离验证是为了阻止比特币通过硬分叉的方式扩容。一旦隔离验证得到激活,那么Core团队再也不会有硬分叉扩容了。比特币区块大小将会锁定在1MB的大小,不可避免的走向死亡。

为什么闪电网络行扩容行不通?

首先,闪电网络应用场景非常有限。想想人们为什么要使用比特币,是为了更快的交易确认速度还是因为比特币是一种去中心化的货币?比特币牺牲了速度和效率,带来了去中心化的安全,缓慢的确认速度对于比特币来讲并不是问题。其次,闪电网络上的交易并不是真正的比特币交易,和交易所内部的发生在数据库上的交易没有本质的区别。部署闪电网络对于普通用户来讲非常困难。如果闪电网络真的部署成功,成为比特币交易的主要形式,那么最后会形成多个中央节点,用户需要把币寄存在这些中央节点里面,这和现存的银行系统有什么本质的区别?最后,把比特币当做结算网络的想法非常可笑,比特币先是数字货币,然后才是结算网络,一旦比特币失去了货币属性,那结算属性立刻崩溃。闪电网络也不是一无是处,能够解决一部分问题,可以替代一部分比特币交易,但想把闪电网络作为主要的比特币交易通道行不通。

为什么选择Bitcoin Unlimited?

我们在区块大小这个问题上,浪费了太多的时间,我们需要一劳永逸的方案解决区块大小的问题。过大或者或小的区块都不合适,这应该交由市场来选择,随着比特币网络和技术的进步动态的调整。Bitcoin Unlimited 的扩容方案把区块大小的选择交给了矿工,符合我们的需要。Bitcoin Unlimited 允许矿工设置自己挖掘的区块大小和接受的区块大小,并通过 Coinbase 对区块的大小进行投票。如果节点发现有更大区块的链长度大于当前的链4个区块(默认)长度,会自动切换到最长的链而忽视区块的大小,这让比特币再次升级区块大小变得很容易。

为什么硬分叉并不危险?

硬分叉最大的危险在于,有可能出现两条链。但据我所知,在比特币扩容这件事情上,人们没有本质的分歧,绝大数人希望扩容,只是选择的方式不同。以太坊出现两条链是因为人们出现了本质的分歧,那就是:区块链是否可以被修改?并且,由于比特币难度调整的滞后性和10分钟1个区块的设定,在绝大部分算力支持硬分叉的情况下,出现两条链的可能性很小。原链会由于过慢的处快速度变得不可用,理性用户会选择新链,留下的矿工收益会大大降低,理性的选择也是切换到新链。

应该如何实施硬分叉?

对于 Bitcoin Unlimited 来讲,并没有一个程序自动设定的阈值。理论上来讲,只要有矿池愿意,任何时间都可以启动分叉,但这很危险并且意义不大。在 Bitcoin Unlimited 硬分叉这件事情上,矿池需要联合起来,达成一致行动。

首先,什么条件下启动硬分叉?我建议使用 Bitcoin Classic 的 75%的阈值,就是支持 Bitcoin Unlimited 的算力占比达到 75% 以上的时候再启动硬分叉。如果阈值过高,共识几乎永远不可能达成。75%的算力支持足以进行安全的硬分叉。

其次,什么时间启动硬分叉?我建议,首先,留够最少1个月的时间,为比特币社区升级自己的节点做准备。其次,我们应该选择在一次难度调整之后的马上进行分叉,让留在原链的算力调整难度变得异常困难,不得不放弃原链。

写在最后

纵观 Core 以及 BlockStream 在米兰比特币扩容会议上的种种提案,都是以杀死比特币和矿工为己任。在关系到比特币矿工和用户的切身利益时候,我们需要联合起来,让比特币重生。