sendheaders
直接请求块头的公告。
收到该消息后,节点被允许通过headers
命令去通告新区块(而不是INV命令)。
这个消息类型在协议版本 >= 70012 或 比特币版本 >= 0.12.0 支持。
详细信息在BIP 130 中。
这个消息不携带额外的 信息。
getaddr
getaddr消息向节点发送请求,询问有关已知活动节点的信息,以帮助查找网络中的潜在节点。 接收该消息的响应是来自活跃节点的数据库 一个或多个 活跃节点的 addr消息与。 典型的推测是,如果一个节点在最近三个小时内发送了一条消息,那么该节点可能是活跃的。
此消息不会传输额外的数据
headers
Description | Data type | Comments |
---|---|---|
count | var_int | 区块头数量 |
headers | block_header[] | 所有的区块头 |
该命令用来回复 getheaders
请求,内容为区块头信息。
payload:
Description | Data type | Comments |
---|---|---|
count | var_int | 区块头数量 |
headers | block_header[] | 所有的区块头 |
OnHeaders 消息
OnHeaders : 接收到块头信息,将它连接到本地的块头信息上; 到达检查点后,向网络中请求这些区块的数据()。
getblocks(请求)
Filed Size | Description | Data Type | Comments |
---|---|---|---|
4 | version | uint32_t | 协议版本 |
1+ | 哈希数量 | var_int | 定位器中包含的哈希数量 |
32+ | 定位器中的哈希 | char[32] | 块的定位器,(最远回到创世块) |
32 | 停止哈希 | char[32] | 截止区块的哈希。设置为全0,标识希望获取尽可能多的哈希。 |
该消息中包含一个定位器对象,定位器对象中是一系列区块头哈希.(从当前Tip开始,最多至创世块;还有一个截止哈希。)
该消息获取的返回信息是:当前激活链从定位器开始至结束哈希/最多500个 的区块。
这些定位器的哈希,被接收节点以在收到的信息中出现的顺序进行处理。如果一个块哈希在接收节点的主链中含有,它的一系列后代区块则通过INV信息,传输给发送节点,无论是否达到请求的限制,剩下的定位器会被忽略。
为了再次接收接下来的块,一个节点需要使用新的定位器再次发送getblocks
信息. 记住:如果这个定位器中包含的块哈希出现在他们的无效的分支上,一些客户端可能会提供一些无效的区块。
该消息的payload:
Filed Size | Description | Data Type | Comments |
---|---|---|---|
4 | version | uint32_t | 协议版本 |
1+ | 哈希数量 | var_int | 定位器中包含的哈希数量 |
32+ | 定位器中的哈希 | char[32] | 块的定位器,(最远回到创世块) |
32 | 停止哈希 | char[32] | 截止区块的哈希。设置为全0,标识希望获取尽可能多的哈希。 |
创建一个块定位器对象,从当前主链的Tip一直递推到创世块。从Tip递推10个区块后,接下来的步数就按照两倍的步数开始起跳。
注意:这个消息允许定位器包含最少一个哈希。然而,块定位器的目的是在调用者的激活链上检测一个错误的分支。如果接收节点检测到你偏离了主链,它将发送比你已知的更早块哈希。所以如果你仅发送最后一个块哈希,并且这个块偏离了主链,则对等节点只能从1号块给你发送区块了。
INV消息(InvTypeBlock类型;getblocks的应答)
当一个节点收到getblocks 请求后,对这个消息作出的应答。
getblocks请求中,会包含一个区块定位器和一个stophash.
这个应答信息包含两种情况
- 定位器对象中包含的某个区块在当前节点的主链中找到,且stophash也在当前主链中找到,则返回 查找到的哈希的下一个区块至stophash 的所有区块哈希;
- 定位器对象中包含的某个区块在当前节点的主链中找到,但stophash 没有在当前主链中找到,则允许返回 查找到的区块后 最后最大的区块哈希数量/或至当前主链的Tip块。(软件系统中,硬编码为500)
- 如果找不到stophash,且没有提供定位器,则什么也不返回。
OnVersion 放在syncmanager 来处理;
全局时间戳,放在哪里。
网友评论