主页 > imtoken.im > 比特币网络节点发现
比特币网络节点发现
[目录]
0x0 概述
比特币节点发现是指节点查找其他节点地址(IP和PORT)的方法。 主要有以下几种类型:
为每个地址保留一个时间戳,以跟踪上次查看节点地址的时间。 当从节点接收到消息时,此时间戳会更新。 时间戳仅在地址上更新比特币节点,并在时间戳早于 20 分钟时保存到数据库中。
0x1 获取地址消息
当一个节点收到“getaddr”请求时,它首先计算它在最近 3 小时内有多少个地址有时间戳。 如果地址数超过 2500 个,则随机选择最新的 2500 个地址。
0x01 发现方法 本节点的外网地址
本地节点发现自己的外网地址需要使用公共服务。 比特币网络(中本聪版)中的流程如下:
IRC地址
不再支持
DNS地址
节点启动时,会发出dns解析请求,请求种子节点的地址。 截至2017年比特币节点,种子节点域名列表如下:
硬编码种子地址
这些地址仅作为最后的手段使用。
地址广播(地址消息)
节点可能会在发送“getaddr”请求后收到“addr”消息中的地址,或者“addr”消息可能会未经请求到达,因为节点在中继它们(见下文)或建立连接时无条件地通告地址。
如果地址来自一个非常旧的版本,它会被忽略; 如果它来自不太旧的版本,如果我们已经有 1000 个地址,它将被忽略。
如果发件人发送的地址超过 1000 个,则全部忽略。
从“addr”消息中收到的地址有时间戳,但时间戳不一定可信。
对于邮件中的每个地址:
如果时间戳太低或太高,则设置为 5 天前。
我们从时间戳中减去 2 小时并添加地址。
如果该地址在过去 24 小时内并且时间戳现在超过 60 分钟,它将更新为 60 分钟前。
如果地址在过去 24 小时内没有出现,并且时间戳当前超过 24 小时,它将更新为 24 小时前。
地址中继
一旦从“addr”消息(见上文)中添加了地址,它们就可以中继到其他节点。 首先,必须设定以下标准[9]:
对于符合上述条件的每个地址,节点对地址、日期(整数)和一个随机的 256 位值(在客户端启动时生成)进行哈希处理。 节点取哈希值最低的两个地址,并将“addr”消息中继给它们。 这确保每个节点在任何给定时间仅将“addr”消息中继到另外两个客户端,并且随机选择另外两个客户端,并且随机选择至少每 24 小时开始一次。
自播
每 24 小时,一个节点向所有连接的节点公布其地址。
它还会清除我们认为远程节点拥有的地址列表,这会触发发送到该节点的刷新。
地址存储
地址存储操作大约每 0.1 秒调用一次并执行一次。
文本文件中给出的地址
客户端将自动读取比特币数据目录中名为“addr.txt”的文件,并将在那里找到的任何地址添加为节点地址。 这些节点对其他地址没有特别的偏好。 它们只是添加到地址池中。
从文本文件加载的地址最初被赋予零时间戳,因此它们不会发布以响应“getaddr”请求。