问题标签 [kademlia]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
293 浏览

p2p - Kademlia 密钥用于识别节点和数据是什么意思?

好的,我最近一直在阅读有关 Kademlia 的文章论文,以实现一个使用 kademlia dht 算法的简单 p2p 程序。那些论文说,Kademlia 节点中的那些 160 位密钥用于识别节点(节点 ID)和数据(以元组的形式存储)。

我对“两者”部分感到很困惑。

据我了解,Kademlia 二叉树中的每个节点都唯一地代表一个客户端(IP、端口),每个客户端都拥有一个文件列表。

这是我理解的一般流程。

  1. 客户端 (.exe) 被启动
  2. 创建节点组件
  3. 新创建的节点加入网络(引导)
  4. 将 find_node(filehash) 发送到 k-closest 节点
    • 假设哈希是通过散列名为 file1.txt 的文件二进制文件生成的
  5. 接收到的节点各自在其不同的哈希表 中找到查询的文件哈希
    • 比如说,一个包含文件列表的哈希映射(文件哈希,文件位置)
  6. 重复步骤 4,5 直到找到节点(同时所有关联节点都在更新存储桶)

这个流程看起来没问题吗?

此外,Kademlia 的引导方法也让我感到困惑。当节点被创建(用户执行程序)时,它似乎使用引导节点来填充桶。但是什么是引导节点?它是另一个一直在运行的进程吗?如果引导节点被关闭怎么办?

有人可以帮助我更好地理解这个概念吗?

我在这里先向您的帮助表示感谢。

0 投票
2 回答
198 浏览

bittorrent - Mainline DHT:为什么 ping 中的哈希与 find_node 中的哈希不同?

我正在使用 Mainline DHT 实现。我看到了奇怪的行为。

假设我知道节点 IP 和端口:1.1.1.1:7777。我以我自己的节点哈希作为目标向他发送“find_node”请求。我从他那里得到了 8 个节点,假设第一个哈希是:abcdeabcdeabcdeabcde 和 IP:2.2.2.2:8888。现在我向 2.2.2.2:8888 发送“ping”请求,该节点以与“find_node”响应中从 1.1.1.1:7777 得到的完全不同的哈希响应我。我看到这不是个别情况。这是怎么回事?为什么来自 2 个不同来源的同一节点的哈希值不同?感谢您的回答。

0 投票
1 回答
147 浏览

p2p - Kademlia节点id的实现

我正在尝试使用 Kademlia论文来实现 DHT ,以更好地理解这些系统是如何工作的。

我已经阅读了一些其他文章,这些文章提到了这种实现分布式哈希表的方式,但是有些东西我无法理解。在 p2p 交换文件网络中,密钥 ID 可以实现为文件名摘要,以通过搜索机制保持一致性。

但是节点 ID 本身呢?

例如,我应该采用“WAN-IP:PORT”组合的摘要还是简单地从头开始生成一个完全随机的 id?

在第二种情况下,总是存在两个节点生成相同 id 的风险。但是使用我的 WAN-IP:PORT 我依赖于这样一个事实,即我的客户端正在运行一个永远不会改变的 WAN-IP 后面的节点。

它应该如何来自网络本身?我的意思是,在第一次接触时,对等点会发挥一些作用并给新节点一个 id ?

我将不胜感激有关如何实现 Kademlia 节点 ID 生成的一些意见。

0 投票
1 回答
114 浏览

p2p - Kademlia DHT:重复节点 ID 的后果 (GUID - Sybil)

在 Kademlia 和其他 DHT 中,每个节点都应该是唯一可识别的,但本质上并没有强制随机创建 ID。

因此我的问题是:一个新的(对抗性)对等点加入具有现有节点 ID 的网络的后果是什么?由于具有关联 IP 的节点 ID 已经存在于许多 k-bucket 中,新的(对抗性)对等点是否会被拒绝?

从原始论文:

每个 Kademlia 节点都有一个 160 位的节点 ID。节点 ID 的构造与 Chord 中一样,但为了简化本文,我们假设机器 在加入系统时只是选择一个随机的 160 位标识符。

0 投票
1 回答
112 浏览

p2p - Kademlia 最小子树的距离和高度的关系

我正在看 Kademlia 的论文,我遇到了一个我无法理解的问题。

In a fully-populated binary tree of 160-bit IDs, the magnitude of the distance between two IDs is the height of the smallest subtree containing them both.

在此处输入图像描述

这个结果显然是错误的,我肯定有什么地方不对劲,那这句话应该怎么理解,期待你的回复。谢谢

Kademlia P2P 系统中的伪可靠广播

反过来,Kademlia 将其节点组织成二叉树。(有关 Kademlia 内部机制的深入讨论,请参阅 [2]。)节点之间的距离是使用 XOR(异或)函数计算的,它本质上捕捉了二叉树拓扑的思想。对于任何节点 A 和 B,它们的距离的大小 d(A,B)=AB,例如 d 的最重要的非零位是包含它们的最小子树的高度。

Kademlia:基于 XOR 度量的点对点信息系统

接下来我们注意到 XOR 捕获了隐含在我们基于二叉树的系统草图中的距离概念。在 160 位 ID 的完全填充的二叉树中,两个 ID 之间的距离大小是包含它们的最小子树的高度。当一棵树没有完全填充时,最接近 ID x 的叶子是其 ID 共享 x 的最长公共前缀的叶子。如果树中存在空分支,则可能存在多个具有最长公共前缀的叶子。在这种情况下,最接近 x 的叶将是通过翻转 x 中对应于树的空分支的位而产生的最接近 ID x~ 的叶。

0 投票
0 回答
234 浏览

python - 如何实施 Kademlia DHT

我正在尝试在 python 中实现Kademlia(二叉树)DHT。据我了解,路由表需要将根节点 ID 中的各个位与新条目进行比较。如果 ID 的位不匹配,则向左走,如果匹配,则向右走。这可以递归地完成,您的停止条件是您已到达 ID 长度的末尾或您已到达叶节点。然后每个叶节点都包含自己的 kbucket(一个数组)。

目前我尝试过的如下:

目前我试图做的是找到一个新节点可能是其子节点的叶节点。

谁能帮我弄清楚我到底做错了什么?如果我遗漏了任何需要的东西,我会提前道歉,并欢迎任何关于如何使这篇文章变得更好的建议!

我想我的问题是这样的:

目前我的节点是根据与根节点相同索引的位相矛盾的第一位排序的。相反,我需要做的是对节点进行排序,以便在引导后最右边的节点是您自己的节点。

如果是这种情况,根节点会是什么?有没有办法做到这一点,根节点是您自己的节点,同时仍然保持网络的完整性?

将新节点添加到网络后,我将如何重构树以维护您遍历的分支(每个新分支)代表叶节点 id 中的单个位的规则?最右边的节点是离你最近的节点,最左边的节点是最远的节点。

可以在此处详细说明该树:https ://www.researchgate.net/publication/2492563_Kademlia_A_Peer-to-peer_Information_System_Based_on_the_XOR_Metric

0 投票
2 回答
38 浏览

dht - Kadelmia 路由表 - 是否需要双向路由?

假设您的节点在其路由表u中包含节点。w节点u是否必须出现在节点 w 的路由表中?

0 投票
1 回答
22 浏览

dht - 在 Kadelmia 中查找节点操作:为什么它从桶中挑选元素而不是查看整个路由表?

查找节点操作的第一步如下(如论文所述):

查找发起者首先从其最近的非空 k-bucket 中挑选 α 个节点(或者,如果该存储桶的条目少于 α 个,它只获取它所知道的 α 个最近的节点)。

k为什么它直接从桶中挑选元素,而不是在所有桶中的所有元素中寻找最接近的元素?我相信后者是算法第 2 步中发生的事情,可以在此处的可视化中看到。

0 投票
1 回答
34 浏览

dht - Kadelmia 查找操作:如何解决冲突的值?

查找协议背后的想法是找到与该键最近的 k 个邻居,并检查其中是否有任何一个具有与查询的键对应的值。论文:http ://css.csail.mit.edu/6.824/2014/papers/kademlia.pdf

我的问题是,在这种情况下会出现价值观冲突吗?例如,一个邻居说值是x,另一个邻居说值是y。此类案件如何解决?

0 投票
0 回答
157 浏览

python - Python Kademlia DHT

我对这个任务很迷茫。我们应该使用 kademlia 创建 3 个 python 文件。这两个文件是节点,然后第三个是一组查询 DHT 应用程序。我们还获得了一个 CSV 文件,我们必须将其导入并将数据发送到 DHT 网络。 任何帮助将不胜感激!!! 这是作业:

您首先需要创建一个初始起始节点(参见下面的代码)。这将在您的本地系统上的端口 8468 上启动。



接下来,您需要在端口 8469 上启动 DHT 应用程序的另一个本地节点(参见下面的代码)。



最后,以下代码将允许您查询 DHT 应用程序并添加键/值对(见下文)。



现在您已经有了两个节点的代码以及设置和查询 DHT 应用程序的代码,使用 DHT_Data.csv 文件编写一个 Python 程序来导入 CSV 文件并将该数据发送到 DHT 网络。此外,编写一些代码来获取 DHT_Data.csv 文件中的键列表并查询 DHT 应用程序以显示您可以查询和返回值。

这是 CSV 文件的屏幕截图: DHT_Data.csv

以下是我的代码截图:

KademlaiDHTServer.py

kademliaDHTAdditionalNode.py

kademliaDHTSetandQuery.py