交换“存货”

在连接到对等节点后,全节点将尝试构建完整的区块头链。如果它是一个全新的节点,并且没有任何区块链,那么它只知道一个区块,即创世区块,该区块静态地嵌入在客户端软件中。从区块 #0(创世区块)开始,新节点将需要下载数十万个区块才能与网络同步并重新建立完整的区块链。

同步区块链的过程始于版本消息,因为其中包含 BestHeight,即节点当前的区块链高度(区块数量)。一个节点将会收到来自其对等节点的版本消息,了解它们各自拥有的区块数量,并将其与自己的区块链进行比较。对等节点将交换一个包含其本地区块链顶部区块哈希的 getheaders 消息。其中一个对等节点将能够识别接收到的哈希属于一个不在顶部的区块,而是属于一个旧的区块,从而推断出自己的本地区块链比远程节点的区块链更长。

拥有更长区块链的对等节点比其他节点拥有更多区块,并且可以确定其他节点需要哪些区块头来“赶上”。它将识别出要共享的前 2,000 个区块头,并使用一个 headers 消息进行分享。节点会持续请求额外的区块头,直到收到远程对等节点声称拥有的每个区块头为止。

同时,节点将开始使用一个 getdata 消息为先前收到的每个区块头请求区块。节点将从每个已选对等节点请求不同的区块,这使得它可以断开与明显比平均速度慢的对等节点的连接,以寻找更新(可能更快)的对等节点。

例如,假设一个节点只有创世区块。然后,它将从对等节点接收到一个包含链中接下来的 2,000 个区块头的 headers 消息。它将开始向所有连接的对等节点请求区块,并保持一个最多包含 1,024 个区块的队列。区块需要按顺序进行验证,因此,如果队列中最旧的区块(节点下一个需要验证的区块)尚未收到,则节点会断开与应该提供该区块的对等节点的连接。然后,它会找到一个新的对等节点,该对等节点可能能够在节点的所有其他对等节点能够提供 1,023 个区块之前提供一个区块。

每个区块到达后,它都会被添加到区块链中,正如我们将在第 11 章中看到的那样。随着本地区块链逐渐建立起来,将请求和接收更多的区块,这个过程会一直持续,直到节点赶上网络的其余部分。

每当节点长时间离线时,比较本地区块链与对等节点并检索任何缺失区块的过程都会发生。

Last updated