121 / 736IBD

Initial Block Download

节点首次同步

新启动的 Bitcoin 节点还不了解网络的过去。要依靠自己判断支付情况,它必须先追上并处理这段历史。Initial Block Download 解释了为什么首次启动时,仅有高速网络还不够。

Initial Block Download,简称 IBD,是 Bitcoin 节点的首次同步过程。通常,节点会取得历史区块,按照自身软件的规则检查它们,并建立目前尚未花费的资金记录。

你在家启动一个 Full Node,也就是独立检查 Bitcoin 区块和交易的软件。区块把交易组成一批,加入共同历史记录。其他参与者已经掌握了漫长的历史,而你的新节点还没有。它首先取得区块头,即连接各个区块的简要记录,其中也包含 Proof of Work,证明已经完成的计算工作。矿工通过反复计算寻找这个证明,其他人则能快速检查找到的结果。区块头列表有点像一本书的目录:目录能帮助定位,却不意味着你已经读过并核查了每一页。 [1] [7]

如果相邻节点提供不同的历史分支,你的节点不会数票决定。区块头让它能够比较累计计算工作量,选出值得进一步验证的候选分支。区块更多,不一定代表工作量更多。即使工作量很大,无效交易也不能因此获得规则豁免;选中分支的内容仍需检查。 [1] [2] [6]

节点可以同时从多个邻居取得区块,不必受单一发送方速度限制。但要把它们接入已经验证的历史,就必须知道此前的状态。支付的输入指向它打算花费的先前款项。节点必须确认这些款项确实存在,而且尚未被花掉。因此,已经下载的较新区块,可能仍要等待较早区块处理完毕。这也是下载完成不等于同步完成的原因。 [1] [2]

节点会把区块内容与区块头内的交易指纹进行比较,这个指纹由 Merkle Tree 结构生成。它还会检查花费的前后关系,以及矿工获得的奖励是否超过允许金额等事项。适用的是历史上该位置已经生效的规则。数字签名利用私钥这个秘密数值证明付款获得授权,同时不泄露私钥。对于旧签名及其他花费条件的检查,有一个特殊设置 assumevalid,下文会解释。区块头,或看起来可信的邻居发来的文件,都不能取代这一整套检查。 [2] [3]

每处理一个区块,节点就移除已花费输出并加入新输出。输出是带有日后花费条件的一笔具体金额。如果尚未花费,它就叫 UTXO。把这些输出汇总起来,软件便能验证下一笔支付,而不必每次都从头重读全部历史。这既不是银行账户清单,也不是所有历史交易的副本。 [2] [3]

在特定条件下,Bitcoin Core 可以跳过旧的脚本检查,也就是签名及其他花费条件的检查。assumevalid 设置指定一个历史已由外部验证的已知区块;祖先关系、足够的工作量和深度也必须满足要求。其他必要检查仍然进行,但部分验证结果会被当作前提。因此,错误的前提并非没有风险。设置 assumevalid=0 可关闭这项优化,代价是电脑需要完成更多工作。 [2]

Pruned Node 在处理完旧区块文件后将其删除,同时保留当前 UTXO 集合及其他必要数据。因此,在普通 IBD 过程中,它仍会取得并处理历史,只是不永久保存全部历史。节省的是磁盘空间,而不一定是首次下载的数据量。以后某项任务若需要已删除的区块,可能必须重新取得它们。 [2] [7]

Bitcoin Core v29.0 会考虑最近接受区块的时间、最低累计工作量以及加载状态等因素。这个运行标志一旦变成 false(初始同步已结束),在同一次程序运行中就不会重新变成 true(初始同步仍在进行)。它用于指导软件行为,并不能证明世界上任何地方都不存在更新的区块。即使后来断开连接,它也不会因此成为可靠的实时同步指标。 [2] [5]

高速连接有帮助,但电脑还需要计算并向磁盘写入。处理器、内存、存储设备以及邻居是否可用都会影响耗时。在 getblockchaininfo 的技术输出中,verificationprogress 是对验证进度的估计,并不承诺还剩多少分钟,也不只是已下载字节的比例。正常关闭程序后,再次启动可以接着已保存的进度继续,无需每次从零开始。 [5] [7]

AssumeUTXO 允许使用受支持的 UTXO 快照,也就是某个区块时保存的状态。软件将快照内容与预期指纹进行比较,然后可以从该状态更早追上当前进度,同时在后台处理历史。之后,它还会比较通过历史验证得到的状态。这不是随便接受陌生人提供的数据库,也不是永远不再验证过去。更早可用与完成历史验证,是两个不同的阶段。 [4] [8]

要获得更完整的理解,请将本词条与以下词条结合阅读: Pruned Node, AssumeUTXO, Block Propagation, Compact Blocks, Bitcoin, Bitcoin Core. 反向关联还来自: Block Propagation, Compact Blocks, Pruned Node, AssumeUTXO.

DOC · 001Bitcoin Developer Guide — Initial Block Download文档 DOC · 002Bitcoin Core — validation文档 DOC · 003Bitcoin Core — chainstate文档 DOC · 004Bitcoin Core — AssumeUTXO design文档 DOC · 005Bitcoin Core — getblockchaininfo文档 DOC · 006Satoshi Nakamoto — Bitcoin whitepaper一手来源 DOC · 007Bitcoin.org — Running a Full Node文档 DOC · 008Bitcoin Core v29.0 — AssumeUTXO usage文档
修订日期: 来源优先 · 非投资建议