在2017年1月29日,因为Bitcoin Unlimited 1.0.0软件bug导致了Bitcoin.com矿池意外生产出一个大小超过1MB的区块。Bitcoin Unlimited项目积极认真和严肃地对这个问题做出对应解决措施,并且避免将来发生类似的事情。
事情经过
在2016年12月22日,Bitcoin Unlimited代码仓合并了一个改变新区块的coinbase交易占空间大小的代码。这个改变是作为合并请求164[1](pull request 164)的一部分包含在1e085736更新确认(commit 1e085736)。为了支持非常大的区块,这个合并请求植入了BUIP040和增加了额外的特性,以及优化了内存管理[2]。这些变化都包含在了2017年1月27日发面布的Bitcoin Unlimited 1.0.0。
这些变化引入了一个bug,使得节点生成新区块时,如果矿工添加了一个自定义的coinbase交易信息,这个区块的尺寸就可以超过节点指定的最大可生产的区块尺寸大小( Maximum Generate size)。
在2017年1月29日,Bitcoin.com矿池使用Bitcoin Unlimited 1.0.0挖矿,挖到了一个区块,hash为000000000000000000cf208f521de0424677f7a87f2f278a1042f38d159565f5 [3]。由于Bitcoin.com添加了Coinbase交易信息,其软件并没有考虑这个信息导致的区块尺寸增加,导致了这个区块的大小为1,000,023字节。
这个区块因为尺寸太大,会被所有的Bitcoin Core节点和设置了EB参数为1MB的Bitcoin Unlimited节点全部拒绝。所有的矿工,包括Bitcoin.com矿池,都没有在这个超标的区块上进行挖矿,而是在这之前的区块链顶端挖矿。
因为部分Bitcoin Unlimited节点的EB参数设置为了大于1MB的值,这些节点在高度450529接受了这个区块。这些节点中的一部分被Bitcoin Core节点列为了24小时禁止连接,但是所有节点依然和全网保持了良好的连接。
答复
这个超标区块产生后,Bitcoin.com矿池的运营立即联系了Bitcoin Unlimited开发者,请求做问题诊断。他们提供了一个立即解决问题的办法,降低可生产的最大区块大小值(bitcoin-cli setminingmaxblock 999000)。其他使用Bitcoin Unlimited挖矿的矿池也被尽可能快地通知到了这一个情况。
这个bug的正确诊断是在ViaBTC池的帮助下完成的。修复bug的的合并请求259[4](pull request)已经更新确认。
为什么在测试环节没有发现这个漏洞?
在网络中只有运行Bitcoin Unlimited节点在其默认设置情况下才会接受大于1MB的区块。因此在代码QA测试环节中,这个漏洞导致的超标区块没有触发任务错误。在BU的专用测试网络中("nolnet"或"no-limit network")都曾经有集中于测试生产大于1MB区块的环节,所有的大于1MB的区块均没有报警。
接下来的工作
Bitcoin Unlimited项目将吸取这一次错误经验。我们正在采取以下步骤来解决这个问题和改进我们的流程:
新增加一个单元测试,测试生产特定大小尺寸的区块。
在生成区块(CreateNewBlock)的最后一步,区块在广播前将被检测是否小于1MB。这个检测在>1MB区块情况已经存在,(译者注:指全网接受>1MB区块为合法区块的情况下),但是在<=1MB区块情况下没有运行。这将有助于将来矿工挖更大的区块前或广播区块前更快地检查问题,
我们将长期加强和巩固我们的代码审查和开发质量。
我们将改进我们的对外沟通政策,以在未来的网络下出现意外时,确保我们的用户及时和准确地得到信息。
在接下来的几周内,我们将进行一次事故复盘。这将包括调查这个漏洞本应该可以在其生命周期的早期就被排查的,为什么事实上却没有被查出。在事故复盘后,我们将发布我们将采用的更详细的开发和测试过程,以避免将来再次发生类似的事故。
结论
Bitcoin Unlimited项目非常重要用户的利益,并努力提供可靠的软件。我们致力于给比特币全网用户提供稳定的软件,我们正在朝着这个目标不断前进。
Bitcoin Unlimited旨在消除链上扩容的障碍,我们通过向矿工和所有节点运营者提供软件来安全升级到更大区块。我们还希望努力为比特币社区未来的多客户端共存做贡献,以实现网络整体更健康和更有弹性,让网络不会因为一个项目的软件漏洞受到影响。
感谢我们所有的用户和支持者。我们重视您的支持,并努力不辜负您的期望,为比特币更光明的未来而实现链上扩容。
[1] https://github.com/BitcoinUnlimited...m ... 7c5caa7f89
[2] https://bitco.in/forum/threads/buip...e ... ocks.1643/
[3] https://www.google.com/url?q=https:...5 ... 3ok-bxcnnQ
[4] https://github.com/BitcoinUnlimited/Bit ... d/pull/259
原文链接:https://bitco.in/forum/threads/buir-201 ... 2017.1790/
原文作者:solex Moderator