Bitcoin ABC和区块上限
通过技术实现更大的区块
这篇文章将描述比特币(BCH)在提升区块上限时进行的工作及已取得的技术进步。这将是Bitcoin ABC团队系列文章之一,我们想向外界传达更多关于我们开发的信息。
我们扩容的途径
作为BCH最初版本软件的开发团队,Bitcoin ABC在那时就提出了线上扩容的理由,我们也一直在致力于不断提升区块容量的上限。然而,线上扩容不仅是对软件上一个参数进行一个简单的改动,而是需要进行多重技术升级和优化,才能够使整个系统既安全又高效地处理更大的区块。
我们目前在扩容上有双管齐下的方案:
1、移除了当前区块扩容在执行层面的瓶颈;
2、为未来链上大幅扩容搭建了技术基础。
Bitcoin ABC支持“可调整的区块上限”, 正如这个概念所说,可以让任何节点运行者自主调节区块大小的上限。我们赞成提高这个上限值并最终移除区块大小的限制。然而运行ABC软件的矿工,他们会希望提升区块上限后的软件,对他们生产和接收区块是有效的。这就意味着,当我们想帮助矿工提升区块上限至他们选择的上线值,最好的方法就是去除软件上的瓶颈。
截至目前我们一直在努力,已经解决了部分区块大小的技术制约,未来也会继续移除那些仍存留的限制。本文下面的章节列出了我们已经完成的工作,和前方那些尚存的任务。
我们已经解决的问题
大型交易时哈希运算呈平方增长
在对交易数据进行哈希运算获得签名时(使用OP_CHECKSIG脚本操作码),每一个输入值都会产生一组不同的交易数据,然后进行哈希运算。由于交易的大小与被执行哈希运算的交易数据呈线性关系,因此在对有多项输入值的交易进行哈希运算时,时间的消耗会以二次方上升。当一个交易的大小达到将近1M的时候,这个问题将变得非常严重。不过,这个问题在BCH里已经得到了永远的解决,BIP-143衍生的重放机制保护了签名的哈希算法。
*参考文献1:
致密区块的索引值限制
过去,致密区块中交易的索引值自始至终都在代码中呈现为16位数值,但当一个区块超过65536个交易时这个机制将失灵。理论上,区块大小接近4M时就可能触及这个极限值(假设这个区块中包含的所有交易都是只有1个输入值的OP_TRUE交易),而且在现实中,8M以上的区块基本都将出现这个问题。不过,Bitcoin ABC和Bitcoin XT已经将索引值调整至32位,单一区块的交易量限制的问题已被修复。
*参考文献2:
*参考文献3:
P2P协议网络的信息大小限制
过去,节点之间的P2P通讯协议规定了信息的大小需要限制在32M以内。这意味着区块大小如果接近或超过32M,节点之间就无法进行通讯了。这个限制在Bitcoin ABC 0.17.0版本被移除。在此之前,Bitcoin Unlimited也已移除了这个限制。
*参考文献4:
*参考文献5:
RPC接口问题
信息大小的限制阻碍了超过16M大小的区块通过PRC提交,这个瓶颈已经在Bitcoin ABC0.17.1中移除。
*参考文献6:
*参考文献7:
我们将要做的
挖矿的RPC问题
目前,矿工们使用的交流接口(getblocktemplate和Stratum)是非常低效和不便的,最主要的缺点是它们很难处理大区块。这在当前32M区块上限的情况下已经显现出困难,那么如果区块上限提高后这个问题将更加显著。
解决这个问题需要大量的工作,我们要面对许多不同的开发项目和方案。Bitcoin ABC目前正在重构RPC系统,目的是允许更多相互依存的信息能够传输。这是在为区块的模版管理器不再需要依赖全球变量而做准备,这也将使执行挖矿的接口可以更有效地处理比现在更大的区块。这个过程中,我们也将与矿工和矿池合作,共同引入升级后的协议。
*参考文献8:
*参考文献9:
*参考文献10:
交易内存池的准入逻辑
由于在交易内存池的接收代码上我们设置了单线程的锁定,因此在持续性每秒交易超过100的时候(等同于区块接近32M时的情况),内存池接收交易就开始出现困难。在Bitcoin Unlimited开发团队进行Gigablock Testnet项目时,这个问题被发现,从而进行了相关研究。因此我们认为并行处理内存池接收代码从而移除这个单线程限制是至关重要的。
*参考文献11:
长期规划
当我们面临时技术瓶颈时,移除这些瓶颈固然重要,但是我们也必须为未来大幅扩容奠定基础。首先,我们将建立可进行大幅扩容的数据结构,这个改变非常简单明了也很容易被理解,这其中就包括CTOR(交易规范排续规则)。比特币现金的基础设计本来就非常适合大幅扩容,实现这一点只需要很小的升级改动。一旦上述数据结构到位,软件就可以得到提升从而在各种层面利用平行处理机制。这将是一个长期项目,所以我们现在需要将新的数据结构建立好才能开启这个项目。
*参考文献12:
www.bitcoinabc.org/2018-08-27-…
结论
Bitcoin ABC始终致力于开发能够处理更大区块的软件,从而不断提升区块上限。
实现这一目标最优的途径绝不是象征性地改一个数值,而是持续地构建实现链上大幅扩容技术上的可能性。