概述
我们很高兴发布比特币核心 0.14.0 版本,它显著加快了新启动节点处理历史区块的速度,以及在线节点验证和中继新区块的速度。还提供了一个可选的新功能(默认情况下禁用),允许钱包用户以更高的费用重新广播他们之前发送的未确认交易之一,这可能使其更快得到确认。
下面提供了主要新功能的简要概述,以及指向本文后面更多详细信息的链接。
-
改进初始区块下载 (IBD) 性能:首次启动的完整节点现在可以比以前更快地验证所有区块,直到现在。这至少是开发人员第六次大幅改进 IBD 性能,以帮助确保新用户不会因为同步不断增长的区块链花费太长时间而却步,从而放弃运行完整节点。
-
更快的新的区块验证和中继:矿工尤其将受益于对四个现有比特币核心功能的改进。签名缓存已针对具有多个 CPU 内核的机器进行了升级——在一台具有 16 个内核的系统上的测试表明,处理新区块的速度提高了 40%。BIP152 CompactBlocks 实现现在将在区块完全验证之前中继一些区块,从而使这些区块能够比以前更快地在对等网络 (P2P) 中传播。P2P 网络代码也已进行了总体重构,以允许同时执行多个操作(并发),并提高吞吐量,消除处理新区块时出现的许多潜在延迟。最后,每个节点内存池中的未确认交易现在可以在节点重启时保存到磁盘并从磁盘恢复。
-
可选的手续费提升:比特币核心的钱包现在允许用户选择发送允许基于手续费的交易替换的交易。这允许用户即使在广播交易的早期版本后,也可以增加交易支付的手续费。此功能默认情况下处于禁用状态。
改进初始区块下载 (IBD) 性能
随着时间的推移,不断增长的区块链大小迫使新的首次节点在能够与钱包一起接收和发送支付之前处理越来越大的数据量。许多以前的比特币和比特币核心版本都包含旨在消除初始区块下载 (IBD)(也称为初始同步)带来的痛苦的主要改进。例如
| 发布 | IBD 的重大改进 |
|---|---|
| 0.5.0 | 跳过历史(检查点)签名的验证 |
| 0.8.0 | 切换到 LevelDB 和并行签名验证 |
| 0.10.0 | 先头部同步和并行区块下载 |
| 0.11.0 | 可选的区块文件修剪以节省磁盘空间 |
| 0.12.0 | 从头开始编写的新的快速签名验证库(libsecp256k1) |
| 0.13.1 | Segwit 以便将来跳过下载历史签名 |
此 0.14.0 版本包含另外两个改进,它们显著提高了 IBD 速度
- 假定有效区块
- 内存池与 UTXO 数据库缓存之间的内存共享
下面将更详细地描述这两个优化。使用 Amazon EC2 虚拟专用服务器(类型为 t2.xlarge,具有四个核心和 16 GB 内存,每小时费用为 0.188 美元(不包括块存储费用))对先前版本(比特币核心 0.13.2)的速度与此比特币核心 0.14.0 版本的速度进行了测试。所有比特币核心设置均保持默认值。
-
比特币核心 0.13.2 完成 IBD 需要 1 天 12 小时 40 分钟,总成本为 6.89 美元。
-
比特币核心 0.14.0 完成 IBD 需要 0 天 6 小时 24 分钟,总成本为 1.20 美元。
在这些测试条件下,比特币核心 0.14.0 的 IBD 速度是先前版本的 5.7 倍。
注意:比特币核心的默认值旨在使其能够在各种硬件上运行,包括具有少量内存的旧机器。对于希望同步速度超过六个小时的用户,请考虑使用 -dbcache= 选项启动比特币核心,使其高于其 300(MB)的默认值。许多现代计算机应该能够在约 3 小时内使用比特币核心 0.14.0 和 8 GB 内存(-dbcache=8000)完成同步。
假定有效区块
比特币 0.3.2 引入了一种称为检查点的机制,以防止在 IBD 期间发生拒绝服务攻击,方法是确保新的完整节点不会被欺骗,花费过多的精力来验证与特定时间点已知最佳链不同的备用区块链。
比特币 0.5.0 在这些检查点的基础上构建,通过跳过比最新检查点更早的区块链中的区块的签名验证来加快 IBD 速度。
随着时间的推移,比特币核心安全性的其他改进(例如 先头部同步 和 最小工作量)减少了对检查点的需求,而与此同时,许多比特币开发人员表达了删除检查点的愿望,因为它们让新开发人员对安全模型感到困惑——检查点使它看起来像比特币开发人员正在决定哪个链是有效的,尽管其意图始终是只接受软件已经决定有效的链。
假定有效区块是一项新功能,它将签名跳过优化与检查点拒绝服务机制分开,以便可以分别处理它们。
假定有效区块是指各个用户认为有效的区块,包括它是有效区块链的一部分。任何人都可以以完全可重复(确定性)的方式轻松测试这一点:获取任何与共识兼容的比特币实现,并在整个区块链上运行它,包括有问题的区块。如果软件没有拒绝该区块或任何之前的区块,则它是有效的。
如果首次启动新完整节点的人知道任何有效的区块,他们就可以将这些区块中高度最高的区块提供给比特币核心 0.14.0,软件将跳过验证假定有效区块之前的区块中的签名。由于验证签名在 IBD 期间会消耗大量 CPU,因此使用假定有效区块可以显著加快 IBD 速度。假定有效区块之后的区块仍然会正常检查其签名。
检查点和假定有效区块之间的一个关键区别在于,比特币 0.3.2 要求所有检查点区块都必须是区块链的一部分,但比特币核心 0.14.0 不要求任何假定有效区块都必须是链的一部分。如果用户(或系统默认值)提供的任何假定有效区块都不是区块链的一部分,比特币核心将简单地验证所有历史区块的签名。或者,如果存在区块链分叉,并且具有最多工作量证明的有效区块链不包含已知的假定有效区块,比特币核心仍将切换到新的最佳区块链,即使这意味着放弃假定有效区块。
比特币的新用户可能不知道任何有效的区块,但他们也可能不知道所有共识规则——因此他们可以简单地使用他们下载的完整节点软件的副本。比特币核心 0.14.0 附带一个默认的假定有效区块,该区块在发布过程中通过让多个知名开发人员分别确认某个区块已知对他们有效来设置(示例)。
任何希望使用比特币核心验证所有签名的人仍然可以通过使用 -assumevalid=0 启动程序来做到这一点。任何希望指定备用假定有效区块的人都可以将区块标识符指定为 assumevalid 的参数;例如
-assumevalid=00000000000000000013176bf8d7dfeab4e1db31dc93bc311b436e82ab226b90
比特币核心 0.14.0 中的默认假定有效区块是 #453354,2017 年 2 月 16 日,哈希值为 00000000000000000013176bf8d7dfeab4e1db31dc93bc311b436e82ab226b90。
内存池与 UTXO 数据库缓存之间的内存共享
在 IBD 期间,比特币核心不使用其内存池,因为在获得最新区块之前,无法验证大多数最近创建的交易。这意味着,历史上分配给内存池的内存只是未分配的,这意味着比特币核心在 IBD 期间运行的内存少于平时。
在比特币核心 0.14.0 中,未使用的内存池内存与 UTXO 数据库缓存共享,这增加了可以在快速内存中缓存的未花费交易输出 (UTXO) 的数量,而无需将其存储并从速度慢得多的磁盘驱动器中检索。
更快的新的区块验证和中继
比特币核心 0.14.0 中的四个重大改进将特别引起矿工和其他需要尽快接收和处理新区块的用户兴趣。
改进签名缓存
第一个功能是更新签名缓存以使用 布谷鸟哈希。签名缓存允许比特币核心保存(缓存)验证未确认交易中签名的结果,以便当同一笔交易出现在新区块中时,比特币核心无需再次验证签名。由于签名验证通常是处理新区块中最耗费计算量的部分,因此使用签名缓存可以显著提高已在线一段时间节点处理新区块的速度。
比特币核心 0.13.2 及以下版本中现有的签名缓存适用于 CPU 内核少于 8 个的系统,但对于 CPU 内核为 8 个或更多个的系统,会出现一个瓶颈(锁争用),这会阻止系统尽可能有效地使用所有可用内核。升级到使用布谷鸟哈希提供“布谷鸟缓存”消除了此问题,并允许更有效地使用更多内核。
在 测试中,在一台具有 16 个内核的系统上,使用 0.14.0 将新区块添加到(连接到)区块链的速度比先前版本的比特币核心快 40%。对于内核少于 8 个的系统,性能没有重大提升,尽管布谷鸟缓存确实允许缓存比以前更多的签名,而内存使用量相同,因此可能会略微提高性能。
更早的 BIP152 compactblock 中继
在比特币核心 0.14.0 中改进的第二个功能是 BIP152 compactblock 实现。以前的实现支持 BIP152 的两种可选模式
-
一种低带宽模式,尝试发送中继新区块所需的最少数据,包括等待接收节点请求该特定新区块。
-
一种高带宽模式,它在不等待接收节点请求特定区块的情况下发送新的区块数据。这存在发送接收节点与其他节点发送的相同数据的风险——浪费带宽——但有助于确保区块快速传输。
升级后的实现通过在区块完全验证之前开始中继新区块来增强高带宽节点。在最佳情况下,消除验证延迟可以使新区块在对等网络上的多个跳点之间传播的速度比以前快几倍。在最坏的情况下,会浪费一些额外的带宽来传输无效的区块。无论哪种情况,安全模型都保持不变,因为所有节点仍然会拒绝无效的区块。
专注于并发和吞吐量的 P2P 代码重构
Bitcoin Core 0.14.0 中改进的第三个功能是整个 P2P 网络代码集,该代码集已重构以支持更高的并发性和吞吐量。并发性改进有助于允许新接收到的区块(例如 BIP152 compactblocks)优先于低优先级流量进行处理,确保区块尽快中继和验证。
重构现在还允许网络活动在消息处理期间在后台继续进行,尤其是在 IBD 速度方面提供了改进,这补充了 Bitcoin Core 0.10.0 中引入的先头同步(有关更多信息,请参见上面)。
内存池保存到磁盘
第四个有助于支持签名缓存和 compactblocks 实现的功能是,每个节点接收到的未确认交易的内存池(mempool)现在在定期关闭期间保存到磁盘,然后在节点启动时重新加载到内存中。
结合压缩区块,这可以使节点不必在它们包含在新建的区块中时重新下载所有这些未确认的交易。结合签名缓存,这允许节点缓存这些未确认交易的签名验证,以便包含这些交易的新区块可以更快地得到验证。
可选的手续费提升
Bitcoin Core 0.14.0 中的一个可选功能(默认情况下禁用)会导致钱包生成的所有新交易都选择加入交易替换,特别是 BIP125 选择加入替换费用 (RBF)。
当通过使用 -walletrbf 选项启动 Bitcoin Core 来启用此功能时,会提供一个额外的 RPC(bumpfee),它允许重新发送之前发送的未确认交易,并支付更高的费用。支持选择加入 RBF 或完整 RBF 的矿工通常会在他们的队列中用更高费用的交易替换较低费用的交易,并且更高的费用将鼓励矿工更快地挖掘交易的新版本。
结论
有关 Bitcoin Core 0.14.0 中所做所有更改的详细信息,请阅读发行说明。要下载,请访问下载页面或文件目录。
下一个主要的计划版本将在 0.14.0 版本发布后大约六个月安排(但只有在经过充分测试后才会发布)。
如果您有兴趣为 Bitcoin Core 做出贡献,请参阅我们的贡献页面和文档如何为 Bitcoin Core 贡献代码。如果您不知道从哪里开始或有任何其他问题,请访问我们的IRC 聊天室,我们将尽力为您提供帮助。
哈希值用于验证
这些是已发布文件的 SHA-256 哈希值
466adccf7352f06de35afc1627a3ea721764268ceaf08fa3641f9b47e7df091a bitcoin-0.14.0-aarch64-linux-gnu.tar.gz
55957e2c35aa2ba836cbae7cbf945bcf489a46b243551b0f6fd86f60603032a6 bitcoin-0.14.0-arm-linux-gnueabihf.tar.gz
e4bb8b52acde07788dfcf024645fe291f0deca2b7172939fb2ddb8789fe56973 bitcoin-0.14.0-i686-pc-linux-gnu.tar.gz
e01e3cdd3c4138eccaf0c1267caa3bcdb6949ee63c1e396842b70f102fb4bcaf bitcoin-0.14.0-osx64.tar.gz
50fea43935e93381552b6730444eed6bbe513637a785e1b864b0c5883729228c bitcoin-0.14.0-osx.dmg
d743d4866a0d4c1457f81530c45258a8b6383d1cafc458eedcba8d01728a641e bitcoin-0.14.0.tar.gz
95a030be5c1649023e3aa81d1cd9eabd4258f1b00f0fc51066d02126219705af bitcoin-0.14.0-win32-setup.exe
864ef77b9b4812ec59adff04d44213a6039c66970a9ae31e8620997a8c1537bc bitcoin-0.14.0-win32.zip
f260d52cf2fe91c4be99ed6fcf8aa0de669ff326c5da920b7ed3a3e2ec981e0a bitcoin-0.14.0-win64-setup.exe
415693ed81cfc4960bbfcb815529003405aefbf839ef8fc901b0a2c4ef5317d0 bitcoin-0.14.0-win64.zip
06e6ceeb687e784e9aaad45e9407c7eed5f7e9c9bbe44083179287f54f0f9f2b bitcoin-0.14.0-x86_64-linux-gnu.tar.gz
