我们使用的硬件配置:
给 Bitcoin Core 节点使用的设置包括:
使用 Bitcoin Core 时,NVMe 固态硬盘完成测试花了 784 秒,而机械硬盘完成测试花了 1066 秒。而使用 Utreexo CSN,NVMe 固态硬盘完成测试花了 1643 秒,而机械硬盘花了 1700 秒。 注意,当前的 Utreexo CSN 实现上还有许多性能上的优化可以做。它现在比 Bitcoin Core 要慢是因为我们复用了 btcd,而 btdc 本身比 Bitcoin Core 要慢得多。 好处 # 2 的重要性让初次区块下载可以并行化 为避免误解,这里说的 “并行化” 指的是链层面的并行化,也就是一个节点可以同时验证多个范围内的区块,例如:10 0001 ~ 20 0000 和 20 0001 ~ 30 0000 的;并不是指区块层面的并行化(可以同时验证一个区块内的多个签名),因为这个在 btcd 和 bitcoin core 里面都已经实现了。 计算科学中的 “并行化” 指的是可以同时执行多个线程,它可以更好地利用硬件(CPU)的性能,在硬件有资源闲置时可以提高性能。近几年来,由于在提高时钟速度方面的物理限制,CPU 开发陷入了瓶颈。反过来说,比起提升时钟速度,人们更关注核心的数量。软件开发的范式也紧随其后,为了利用更多的 CPU 核心,今天的软件开发也特别强调并行化。 初次区块下载的并行化具有非常强大的潜能,有望在全节点同步上扮演破局者、让个人能够更容易运行一个全节点。更多的节点让比特币网络更难被攻击。在这个意义上,并行化也可以被认为是对比特币的安全性的提升。 好处 # 2 的进度任何区块的验证都基于前一个区块所形成的 UTXO 集。举个例子,如果你要验证 501 号区块,你就需要区块号 500 处的 UTXO 集。不过,要想获得区块号 500 处的 UTXO 集,我们又需要区块号 499 处的 UTXO 集。这个依赖于前序区块处理完之后的 UTXO 集的问题可以一路上溯到创世区块(它是硬编码的)。这解释链层面的并行化的难点。 有了 Utreexo,问题就变得更简单了,因为 UTXO 集只有几百个字节,而不是几 GB。所以我们可以把整个 UTXO 的表示硬编码到软件中,作为并行化验证的起点。 注意,对等节点可能是恶意的,可能会给出一个错误的 UTXO 集。不过,这不会降低我们的安全假设,因为我们只是让多个 CPU 核心从创世区块一路验证到区块号 499 处。我们从区块高度 501 处继续验证,是利用了这些 CPU 一直有闲置的事实。当创世块到 499 号区块的验证完成时,我们就能检查区块来看看该区块与区块高度 500 处的 UTXO 集是否匹配。因此被硬编码的 UTXO 集合表示只是用来加快处理的,所有的事情跟原来一样,都是得到验证的。 为了支持这种类型的链并行化,我码必须支持保管多个需要读写的链状态。保管任意 n 个链状态(哪怕 n 为 2)的主要困难在于要跟踪 n 个 UTXO 集。因为一个 UTXO 集就需要一个数据库和一个相应的缓存,存储在硬盘上以备加速,这会使运行节点的硬件门槛提高许多。不过,因为 Utreexo CSN 消除了对数据库的需要,这也不是一个问题。 保存多个链状态的实现(Bitcoin Core 中的 CChainState,在 btcd 种写作 “Blockchain”)已经在开发了。这件事情对 Utreexo 来说已经大大简化了,因为不需要为每个链状态安排一个数据库,所以我们可以实现保存任意 n 个链状态。 当前,我们还在研究每个链状态要如何处理网络的 p2p 消息。我们一直在尝试不同的方法(设置两个初始区块下载管理器;跟踪哪个链状态请求了哪个区块;等等),但还有许多功夫要花。 这个版本的局限性在当前的版本中,我们还不支持链重组和交易池。因此节点会在 “只下载区块(blocksonly)” 模式下运行,如果出现了链重组,节点就会宕机。这两件事在 Utreexo 库中都还未实现,这就是为什么这个版本只是一个演示。这个版本不支持同步比特币主网,也不应用于管理真正的自己找,因为它还处在带有已知 bug 的早期节点。 下一步就像我们在 “好处 # 1 的进展” 一节里说得,我们会在 Utreexo CSN 上做一系列性能优化。既包括加快 Utreexo 累加器的速度,也包括 btcd 组件的速度。我们现在已经知道了,许多问题一旦修复了就可以加快 CSN 的速度(只是实现和测试问题)。 链重组处理的开发从去年开始,但被搁置了,因为还有其它许多紧迫的问题要处理。重组处理将在不远的将来实现。虽然交易池的实现还未开始,我们已经计划了一段时间了。我完全相信交易池功能将在今年内实现。 当前的 Utreexo 累加器的代码是用 Go 语言编写的。将累加器的代码移植到 Rust 和 C++ 是我们正在做的事。我们不知道这些事情要花多少实现,但我们的代码已经有了骨架,允许我们并行开发了。有很多工作要做,欢迎你来贡献! (完) 作者:Calvin Kim 来源:https://blog.bitmex.com/progress-towards-utreexo-goals/ 本文发表于 2021 年 2 月 1 日。 |