了解Kademlia find_node并将节点添加到路由表

时间:2018-06-24 14:44:11

标签: c# kademlia

我正在阅读Kademlia white paper,并尝试实现路由表。

我正在使用160位地址空间,并具有160 k个存储桶的数组。据我了解,此实现会将节点ID存储在存储区中,即节点ID具有多少个前导零位。即bucket[0]的节点ID带有160个前导零(只有1个节点),而bucket[159]的节点ID没有前导零(占整个地址空间的50%)。

问题 使用此实现,当找到最接近目标nodeId的k个节点时,我只计算目标的前导零并返回该k桶中的所有内容?

使用此实现,我认为没有必要/不需要使用Kademlia构建的XOR,因此我认为我的实现不正确。

1 个答案:

答案 0 :(得分:1)

首先请注意:您链接到的论文是the pre-proceedings version only containing the basic sketch without later refinements。 160桶阵列路由表布局是本文的一种简化方法,后来的修订引入了更复杂的基于树的表。

  

即bucket [0]的节点ID带有160个前导零(只有1个节点),bucket [159]的节点ID没有前导零(占整个地址空间的50%)。

好吧,您可以用这种方法来做,但是只简单地计算异或距离中的前导零并将其用作索引会更简单。即0个共享前缀位=否(0)前导零= buckets[0] =距离您自己的ID最远的存储桶。

  

问题使用此实现,当找到与目标nodeId最接近的k节点时,我只计算目标的前导零并返回该k桶中的所有内容?

以下假设您在问如何回答远程节点的查询。

平面路由表布局中的存储区是根据您自己的节点ID进行组织的。当回答对某个任意目标ID的查询时,这不一定与针对该目标的接近度一致。因此,最简单的方法是只扫描路由表中所有填充的存储桶,并计算相对于查询目标地址的N个最近的节点,然后将其作为响应返回。避免进行全面扫描会涉及到arithmetic on the xor metric to find the correct local buckets,但是我只针对基于树的布局而不是平面布局进行了此操作。