原文地址:https://blog.csdn.net/haolifengwang/article/details/80348776
发现原理
1) 系统第一次启动随机生成本机节点NodeId,即为LocalId,生成后固定不变,本地节点记为local-eth.
该节点为第一次启动时生成,以后重新启动后不会变化。各个节点都会有一个唯一的标志NodeId。A和B都有各自NODEid
2) 系统读取公共节点信息,ping-pang握手完成后,将其写入K桶
读取公共节点,也就是说大家都知道,各个节点都有相同的公共节点信息。设为C。也就是说A不知道B,B不知道A,但A和B都知道C.这个是C点也就是知道了A点和B点。
3) 进入刷桶循环
a) 随机生成目标节点Id,记为TargetId,从1开始记录发现次数和刷新时间。
各个节点都会生成目标节点id,也就是说每个节点同时发起刷桶操作。
b) 计算TargetId与LocalId的距离,记为Dlt
计算本地节点与目标节点的距离。
c) k桶中节点NodeId记为KadId,计算KadId与TargetId的距离,记为Dkt
各个节点中k通中初始化为公共节点信息,
d) 找出K桶中Dlt大于Dkt的节点,记为K桶节点,向k桶发送FindNODE命令,FindNODE命令包括TargetId,
因为K桶节点已经知道发送FindNode命令的本地节点,所以现在需要记录本地节点信息。也就是说A向C点发送消息,C无需在记录A点信息。
e) k桶节点收到FindNODE命令后,统一执行b-d的过程,将从K通中找到的节点使用Neighboras命令发回给本机节点。
C点将B点的信息发给A点。
f) 本机节点收到Neighbour后,将收到的节点写入到K桶中
A点将B点信息进行记录
这样A点就知道B点了。同样的过程B点通过C点知道A点。