使用UTXO快照加速比特币节点同步
比特币核心v28版本新增了一项开发历时5年的功能。该功能由James O’Beirne于2019年首次提出,AssumeUTXO允许全节点通过加载特定区块高度的UTXO集合快照来延迟验证旧的区块链历史,并从该点开始同步到链顶端。这使得使用全节点的钱包和其他软件能够在节点启动后几分钟内开始接收和发送交易,而不必等待数小时或数天从创世区块开始同步和验证链。
使用AssumeUTXO时,节点从快照开始同步到链顶端,然后在后台下载并验证旧的区块链历史,直到最终验证其在加载快照时的初始UTXO状态,使其最终获得与不使用AssumeUTXO的节点相同的无信任安全性。
如何使用UTXO快照
-
下载UTXO快照文件。您可以在我的网站上找到区块高度840,000的快照,或通过此种子下载:magnet:?xt=urn:btih:596c26cc709e213fdfec997183ff67067241440c&dn=utxo-840000.dat&tr=udp%3A%2F%2Ftracker.bitcoin.sprovoost.nl%3A6969
-
下载比特币核心v28或更高版本
-
运行比特币核心但阻止正常对等节点同步:
1
bitcoind -daemon -maxconnections=0
-
通过以下命令加载快照:
1
bitcoin-cli -rpcclienttimeout=0 loadtxoutset /path/to/utxo-snapshot-height-840000.dat
-
等待命令完成(根据机器速度,这将需要几十分钟到几小时)
-
命令完成后,您的节点同步进度将跳转到快照的区块高度
-
启用对等节点连接后重新启动比特币核心:
1
bitcoin-cli stop && bitcoind -daemon
-
到达链顶端后,节点将在后台开始从创世区块进行同步,但在此期间节点仍可使用
常见问题解答
快照dat文件的来源是否重要? 不重要;比特币核心只会加载聚合UTXO集合哈希与核心代码中硬编码匹配的快照。
我可以创建自己的快照并加载吗? 您可以使用dumptxoutset RPC命令或此实用程序脚本生成快照。但是,除非快照位于核心代码中硬编码的区块高度之一,否则您将无法加载快照。在撰写本文时,唯一支持的高度是840,000。
我可以使用此功能同步修剪节点吗? 可以。
我可以在启用索引的情况下同步节点吗? 可以,但这不会加快索引构建速度 - 索引仍然需要从创世区块线性生成。
节点同步速度提升多少?
我在基准测试机器上使用完整默认设置运行了两次比特币核心v28同步。一次完全从创世区块同步,另一次在开始同步后立即加载快照。
节点加载快照用了10分钟,然后用了84分钟完成到链顶端的同步。另一方面,从创世区块进行完整同步用了659分钟。
我们可以看到速度提升非常显著!
值得这么麻烦吗?
在决定是否要从快照同步节点时,您需要权衡一些利弊:
- 您有多着急使用节点?
- 您的节点硬件速度如何?如果速度非常快,可以在一天内从创世区块同步,那么加载快照的额外步骤可能不值得。像树莓派这样的设备可能会从加载快照中获得更大的好处。
虽然我预计目前只有技术更熟练、熟悉命令行操作的节点运营者会利用此功能,但为了获得数量级的速度提升,这些额外步骤肯定是值得的!
也许未来,比特币核心可以提供包含最近快照的捆绑下载,在启动时自动加载,这样不太精通的用户也可以利用此功能。