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

Understanding Kademlia find_node and adding nodes to the routing table

我正在通读 Kademlia white paper 并尝试实现路由 table 部分。

我正在使用 160 位地址 space 并且有一个 160 k 桶的数组。据我了解,此实现将根据节点 ID 具有的前导零位将节点 ID 存储在存储桶中。 IE。 bucket[0] 的节点 ID 有 160 个前导零(只有 1 个节点),bucket[159] 的节点没有前导零(整个地址的 50% space)。

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

使用此实现我看不到 place/need 使用 Kademlia 所基于的 XOR,所以我认为我的实现不正确。

首先提个醒:您要链接的论文是 。 160 桶数组路由 table 布局是论文证明的一种简化方法,后来的修订版引入了更复杂的基于树的 table.

I.e. bucket[0] would have node ids with 160 leading zeros (only 1 node) and bucket[159] would have nodes with no leading zeros (50% of the entire address space).

好吧,你可以这样做,但是只计算异或距离中的前导零并将其用作索引更简单。 IE。 0 个共享前缀位 = 无 (0) 前导零 = buckets[0] = 离您自己的 ID 最远的桶。

Question Using this implementation, when finding the closest k-nodes to a target nodeId would I just count the leading zeros for the target and return everything in that k-bucket?

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

平面路由 table 布局中的桶是根据您自己的节点 ID 组织的。当回答对某个任意目标 ID 的查询时,这不一定与该目标的接近程度一致。因此,最简单的方法是只扫描路由 table 中所有已填充的存储桶,并计算相对于查询目标地址最近的 N 个节点,然后 return 将这些节点作为响应。避免完全扫描会涉及一些 ,但我只针对基于树的布局而不是平面布局这样做。