首页 百科知识 交换“库存”

交换“库存”

时间:2022-07-17 百科知识 版权反馈
【摘要】:完全节点与其他节点连接后,它要做的第一件事就是尝试创建一个完整的区块链。互联的对等节点首先交换一个getblocks消息,消息包含各自本地区块链最顶部区块的哈希(指纹)。它将识别出第一批需要分享的500个区块,通过inv消息将这500个区块的哈希传播出去。缺失这些区块的节点通过发送一系列getdata消息,并根据从inv消息获取到的哈希,请求完整的区块数据。

完全节点与其他节点连接后,它要做的第一件事就是尝试创建一个完整的区块链。如果这是一个全新节点,本地完全没有区块链数据,那么它将只知道一个区块,即创世区块,它被静态内嵌到客户端软件里。从0号区块(创世区块)开始,新节点必须下载成千上万的区块来实现与网络的同步,并重建本地区块链。

同步区块链的过程始于版本(version)消息,版本消息中包含了最佳高度(BestHeight)信息,它是节点当前的区块链高度(区块数量)。节点从其对等节点获取version消息,了解它们有多少区块,并与自身区块数量进行比较。互联的对等节点首先交换一个getblocks消息,消息包含各自本地区块链最顶部区块的哈希(指纹)。如果某个节点发现接收到的哈希不等于区块链最顶部区块的哈希值,它就可以判断出接收到的哈希不属于最新区块,而是一个比较老的区块,从而判断自身的区块链比对等节点更长。

拥有更长区块链的节点,其区块数量比对等节点更多,因而能识别哪些区块是对端需要“追赶”的。它将识别出第一批需要分享的500个区块,通过inv(库存,inventory)消息将这500个区块的哈希传播出去。缺失这些区块的节点通过发送一系列getdata消息,并根据从inv消息获取到的哈希,请求完整的区块数据。

举个例子,我们假设一个节点只有创世区块。它从对等节点接收到一个inv消息,包含了后继500个区块的哈希值。接下来,这个节点将向所有相连的节点请求区块数据,为防止将单一节点压垮,它会把负载分散到不同节点上。节点跟踪每个对等节点正在“传输”的区块数量(已发送请求,尚未接收完成的),检查其是否超过限制(MAX_BLOCKS_IN_TRANSIT_PER_PEER)。这样,如果一个节点需要获取大量的区块,它只会在早先的请求完成后才发送新的请求,如此一来,节点就能够控制更新节奏,避免压垮网络。当区块被接收后,它被加入区块链(我们将在第7章看到相关介绍)。随着本地区块链的逐步建立,更多的区块将被请求和接收,整个过程将一直持续到这个节点完成与全网络的同步。

不管与网络断开多长时间,一旦重新连接,节点都要重新进行本地区块链与对等节点的比较过程,从而获取丢失的区块。不管是离线几分钟、丢失几个区块,还是离线一个月、丢失几千个区块,节点都要从发送getblocks开始,获取inv应答,并下载丢失的区块(图6.6描述了库存和区块传播协议)。

图6.6 节点通过从对等节点获取区块同步区块链

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈