问题标签 [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.
p2p - Kademlia 密钥用于识别节点和数据是什么意思?
好的,我最近一直在阅读有关 Kademlia 的文章和论文,以实现一个使用 kademlia dht 算法的简单 p2p 程序。那些论文说,Kademlia 节点中的那些 160 位密钥用于识别节点(节点 ID)和数据(以元组的形式存储)。
我对“两者”部分感到很困惑。
据我了解,Kademlia 二叉树中的每个节点都唯一地代表一个客户端(IP、端口),每个客户端都拥有一个文件列表。
这是我理解的一般流程。
- 客户端 (.exe) 被启动
- 创建节点组件
- 新创建的节点加入网络(引导)
- 将 find_node(filehash) 发送到 k-closest 节点
- 假设哈希是通过散列名为 file1.txt 的文件二进制文件生成的
- 接收到的节点各自在其不同的哈希表
中找到查询的文件哈希
- 比如说,一个包含文件列表的哈希映射(文件哈希,文件位置)
- 重复步骤 4,5 直到找到节点(同时所有关联节点都在更新存储桶)
这个流程看起来没问题吗?
此外,Kademlia 的引导方法也让我感到困惑。当节点被创建(用户执行程序)时,它似乎使用引导节点来填充桶。但是什么是引导节点?它是另一个一直在运行的进程吗?如果引导节点被关闭怎么办?
有人可以帮助我更好地理解这个概念吗?
我在这里先向您的帮助表示感谢。
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 个不同来源的同一节点的哈希值不同?感谢您的回答。
p2p - Kademlia节点id的实现
我正在尝试使用 Kademlia论文来实现 DHT ,以更好地理解这些系统是如何工作的。
我已经阅读了一些其他文章,这些文章提到了这种实现分布式哈希表的方式,但是有些东西我无法理解。在 p2p 交换文件网络中,密钥 ID 可以实现为文件名摘要,以通过搜索机制保持一致性。
但是节点 ID 本身呢?
例如,我应该采用“WAN-IP:PORT”组合的摘要还是简单地从头开始生成一个完全随机的 id?
在第二种情况下,总是存在两个节点生成相同 id 的风险。但是使用我的 WAN-IP:PORT 我依赖于这样一个事实,即我的客户端正在运行一个永远不会改变的 WAN-IP 后面的节点。
它应该如何来自网络本身?我的意思是,在第一次接触时,对等点会发挥一些作用并给新节点一个 id ?
我将不胜感激有关如何实现 Kademlia 节点 ID 生成的一些意见。
p2p - Kademlia DHT:重复节点 ID 的后果 (GUID - Sybil)
在 Kademlia 和其他 DHT 中,每个节点都应该是唯一可识别的,但本质上并没有强制随机创建 ID。
因此我的问题是:一个新的(对抗性)对等点加入具有现有节点 ID 的网络的后果是什么?由于具有关联 IP 的节点 ID 已经存在于许多 k-bucket 中,新的(对抗性)对等点是否会被拒绝?
从原始论文:
每个 Kademlia 节点都有一个 160 位的节点 ID。节点 ID 的构造与 Chord 中一样,但为了简化本文,我们假设机器 在加入系统时只是选择一个随机的 160 位标识符。
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 将其节点组织成二叉树。(有关 Kademlia 内部机制的深入讨论,请参阅 [2]。)节点之间的距离是使用 XOR(异或)函数计算的,它本质上捕捉了二叉树拓扑的思想。对于任何节点 A 和 B,它们的距离的大小 d(A,B)=AB,例如 d 的最重要的非零位是包含它们的最小子树的高度。
接下来我们注意到 XOR 捕获了隐含在我们基于二叉树的系统草图中的距离概念。在 160 位 ID 的完全填充的二叉树中,两个 ID 之间的距离大小是包含它们的最小子树的高度。当一棵树没有完全填充时,最接近 ID x 的叶子是其 ID 共享 x 的最长公共前缀的叶子。如果树中存在空分支,则可能存在多个具有最长公共前缀的叶子。在这种情况下,最接近 x 的叶将是通过翻转 x 中对应于树的空分支的位而产生的最接近 ID x~ 的叶。
python - 如何实施 Kademlia DHT
我正在尝试在 python 中实现Kademlia(二叉树)DHT。据我了解,路由表需要将根节点 ID 中的各个位与新条目进行比较。如果 ID 的位不匹配,则向左走,如果匹配,则向右走。这可以递归地完成,您的停止条件是您已到达 ID 长度的末尾或您已到达叶节点。然后每个叶节点都包含自己的 kbucket(一个数组)。
目前我尝试过的如下:
目前我试图做的是找到一个新节点可能是其子节点的叶节点。
谁能帮我弄清楚我到底做错了什么?如果我遗漏了任何需要的东西,我会提前道歉,并欢迎任何关于如何使这篇文章变得更好的建议!
我想我的问题是这样的:
目前我的节点是根据与根节点相同索引的位相矛盾的第一位排序的。相反,我需要做的是对节点进行排序,以便在引导后最右边的节点是您自己的节点。
如果是这种情况,根节点会是什么?有没有办法做到这一点,根节点是您自己的节点,同时仍然保持网络的完整性?
将新节点添加到网络后,我将如何重构树以维护您遍历的分支(每个新分支)代表叶节点 id 中的单个位的规则?最右边的节点是离你最近的节点,最左边的节点是最远的节点。
dht - Kadelmia 路由表 - 是否需要双向路由?
假设您的节点在其路由表u
中包含节点。w
节点u
是否必须出现在节点 w 的路由表中?
dht - Kadelmia 查找操作:如何解决冲突的值?
查找协议背后的想法是找到与该键最近的 k 个邻居,并检查其中是否有任何一个具有与查询的键对应的值。论文:http ://css.csail.mit.edu/6.824/2014/papers/kademlia.pdf
我的问题是,在这种情况下会出现价值观冲突吗?例如,一个邻居说值是x
,另一个邻居说值是y
。此类案件如何解决?
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
以下是我的代码截图: