问题标签 [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 投票
0 回答
62 浏览

python - 如何重复使用 twisted 调用函数而不会遇到无限递归问题?

我正在使用twisted 开发P2P 应用程序。我试图在我的 DHT 中重复搜索特定键,并在值更改时将其添加到字典中。代码或多或少在做我想要完成的事情,除了一旦我得到一个新值,我仍然有多个正在运行的请求。这有时会给我一个运行时错误,说我已经超过了最大递归深度。我怎样才能改变这一点,以便一次只运行一个获取请求,但它仍然不断搜索?我以前从未使用过twisted,所以我仍在努力掌握它。

0 投票
1 回答
129 浏览

dht - 更改 Kademlia 指标 - 单向属性重要性

Kademlia 使用 XOR 度量。除其他外,这具有所谓的“单向”属性(= 对于任何给定的点 x 和距离 e>0,恰好有一个点 y 使得 d(x,y)=e)。

第一个问题是一个普遍的问题:度量的这个属性是否对 Kademlia 的功能至关重要,或者它只是有助于揭示来自某些节点的压力(正如原始论文所暗示的那样)。换句话说,如果我们想改变指标,那么同时拥有一个“单向”的指标有多重要?

第二个问题是关于指标的具体变化:假设我们有节点标识符(地址)作为 X 位数字,以下任何指标是否适用于 Kademlia?

  1. d(x,y) = abs(x-y)
  2. d(x,y) = abs(x-y) + 1/(x xor y)

第一个指标只是提供数字之间的差异,因此对于节点 ID 100,ID 为 90 和 110 的节点距离相等,因此这不是单向指标。在第二种情况下,我们修复了添加 1/(x xor y),我们知道 (x xor y) 是单向的,因此具有 1/(x xor y) 应该保留此属性。

因此,对于节点 ID 100,节点 ID 90 为d(100,90) = 10 + 1/62,而与节点 ID 110 的距离为d(100,110) = 10 + 1/10

0 投票
1 回答
251 浏览

bittorrent - Bittorrent KRPC - 为什么节点 ID 的大小是 info_hash 的一半并使用每个字符 az?

这让我非常困惑。

最初的 Kademlia 提供像 sha1 这样的 160 位十六进制应该用于明显的原因:当搜索与 infohash 相关的对等点时,您只需搜索 nodeID,因为它们应该等同于与 sha1 infohash 相同的系统。

但读这个: http: //www.bittorrent.org/beps/bep_0005.html

idabcdefghi0123456789是:1) 大小的一半 2) 使用比标准十六进制编码更多的字符。

那么我错过了什么?

为什么节点ID是这样的?

0 投票
1 回答
683 浏览

dht - 一个节点可以在 Kademlia DHT 的路由表中保留多少个 k-bucket?

来自维基百科
Kademlia routing tables consist of a list for each bit of the node ID. If a node ID consists of 128 bits, a node will keep 128 such lists.

鉴于密钥空间来自0-2^160它意味着最大节点可以存在于该密钥空间中2^160,并且每个节点 ID 为 160 位。如果 k=20,则节点可以在其路由表中保留的最大条目为160x20。节点如何在其路由表中跟踪如此大量的节点。一个节点不应该只保留它自己的 k-bucket 中存在的 20 个节点的条目k=20吗?即使该节点本身不在这些列表中,除了它存在于具有 20 个节点的一个列表中之外,它如何保留 160 个这样的列表?

我交替使用列表和存储桶,它们都是相同的。

0 投票
2 回答
604 浏览

java - 将 DHT 和 Torrent 客户端拼接在一起

我有两个 java 库。一个连接到 DHT 并可以成功下载 torrent 文件。另一个下载与种子相关的实际数据。

torrent 客户端库需要 torrent 中的announce 或announce-list 部分,并且不理解“nodes”条目。

问题是如何更改 torrent 客户端代码以了解 torrent 文件的“节点”部分。或者我如何从一组 ip:port DHT 对等地址计算跟踪器 URL?

我可以通过猜测端口号并在其上附加 /announce 来猜测 url.. 但这肯定不对吗?

有谁知道这是如何工作的?

0 投票
1 回答
691 浏览

bittorrent - bittorrent DHT 详细规范

在我的新周末项目中,我决定从头开始编写一个 bittorrent 客户端,根本没有准备好使用的库。在寻找文件两天后,我已经要放弃了:微笑:。我知道有BEP,但它们远远不足以理解所有规范。在阅读了更多之后,我认为跟踪器和对等协议似乎很旧并且易于理解/实现(是的,我知道,要编写一个平衡、对等选择、优化的好代码,这并不像我刚才所说的那样容易,但我只想做基础知识来学习,而不是与那里的数十个好客户竞争。)

所以,我决定从 DHT 开始,这似乎是更复杂的部分,而且记录也更少。当您停止寻找 bittorrent DHT 或主线 DHT 并开始寻找 kademlia DHT 时,您会获得更多信息,但如何将它们组合在一起并不那么明显。

以下是我目前所了解的(我希望填补一些空白):

  1. 我从空的 DHT 树开始
  2. find_nodes在我的引导节点上使用
  3. 将接收到的节点添加到我自己的树中,这样我就可以选择更接近我自己 ID 的节点
  4. 开始向find_nodes选定的人发出并将他们的响应添加到我的树
  5. 返回 3 直到我停止接收未知/新节点
  6. 如果我收到一个announce_peer,那么info_hash我应该将其信息保存在本地数据库中(发送者的 info_hash 和 ip/port)
  7. 如果一个节点get_peersinfo_hash我的数据库中的一个节点一起使用,那么我发送信息,否则我应该发送我在自己的树中拥有的更接近节点的列表(最接近那个 info_hash)
  8. 当我get_peers在其他节点上使用时,我将收到对等节点或节点,在后一种情况下,我认为节点更接近info_hash而不是我自己的nodeId,所以,我应该将这些节点添加到我的树中还是基于它们开始一个新树?
  9. 当我想宣布我对我info_hash应该announce_peer在任何地方使用还是只对nodeId更接近目标的节点感兴趣时info_hash?离多少才够近?

在这一点上,我有很多节点的 ID 更接近我自己的 ID,而关于 info_hash'es 的信息我并不真正感兴趣。

恐怕我有一个巨大的愚蠢问题:我为什么这样做?

我的意思是:我做所有这些工作的自私理由是找到我感兴趣的 info_hash 的对等点。我知道一个 info_hash 的信息很可能保存在 ID 更接近该 info_hash 的节点上。因此,如果我创建一个更接近 info_hash 而不是更接近我自己的 ID 的节点树,我找到它的信息的机会就更大(此时,如果你知道这个主题,你已经注意到我是多么迷茫)。

我应该创建多个树吗?一个给我(在那里将 info_hashes 的信息保存到更靠近我的 nodeID 人们发送给我的位置),以及另一个更靠近我的每个目标 info_hashes 的树,以便我可以检索他们的信息?

我是否应该在我的节点 ID 附近创建一棵树,并在查询这棵树以获取所需的 info_hashes 时希望获得最好的结果?

既然我完全误解了 DHT 背后的想法,我应该放弃吗?

好吧,任何真实的文档,流程图,任何东西都将受到欢迎!

0 投票
1 回答
225 浏览

dns - 通过 DNS 种子参与 Kademlia 网络

如果一个节点想要参与 Kademlia 网络,它将查找一个引导节点作为引导过程的一部分。事实上,这个Java 实现似乎也是这样做的。

在比特币协议中,一个节点也会查找以了解其他对等节点是谁。而且,首选模式似乎是 DNS 种子。引用这个答案

如今,比特币核心客户端和许多其他实现都依赖于 DNS 种子。DNS 种子是特殊的 DNS 服务器,它们被配置为从网络中返回许多随机选择的节点。DNS 种子的运营商还运行爬虫来枚举种子将返回的可公开访问的节点。

Kademlia 节点是否存在这样的查找机制?

0 投票
1 回答
227 浏览

bittorrent - kademlia 最近的好节点在两个请求之间不会有足够的交集

在进行 bep44 实现时,我使用定义的 kademlia 算法来找到给定哈希 id 的最近的好节点。

使用我的程序,我go run main.go -put "Hello World!" -kname mykey -salt foobar2 -b public得到了存储超过一百个节点的值(好)。

现在,当我连续多次运行它时,put 请求写入的 ip 集相交很差。

这是一个问题,因为当我尝试执行 get 请求时,查询的 ips 集与 put 集不相交,因此找不到该值。

在我的测试中,我使用公共 dht 引导节点

当我查询节点时,我选择了 8 个最近的节点 ( nodes := s.ClosestGoodNodes(8, msg.InfoHash())),在递归遍历后,它们通常最终出现在一个 ~1K 查询列表中。

据我了解,考虑到表的状态,在 dht 表中存储信息哈希的地址是确定性的。当我进行连续查询时,我希望表格确实会改变,但不会改变那么多。

存储节点集不相交是如何发生的?

0 投票
1 回答
1153 浏览

java - Java 中的 Kademlia 实现

我想建立一个 Kademlia 网络来连接对等点并建立一个 p2p 网络。我将分配网络内节点的处理能力。对于网络,我发现这个 Kademlia Java 从 git 实现了 Setup。 https://github.com/JoshuaKissoon/Kademlia
在此处输入图像描述

我想知道如何设置它并用于实现网络。我找到

用于创建对等点的 2 个实例,并使用以下代码将它们相互连接。

但那是将它们连接到它运行的同一个程序中。

我想为不同的计算机相应地连接它们。被困在这里好几个小时了。我不知道如何使用这个。

0 投票
1 回答
84 浏览

bittorrent - 搜索给定的目标,如何扩大搜索范围?

给定目标 id x...19x,让我们考虑程序运行递归查询,构建一个表,一旦没有更多节点可供查询,它会发现最近的结果节点小于 8 个的情况。

我怎样才能扩大搜索范围,以便表为任何给定的 id 返回至少 8 个节点?

我可以简单地获取目标 ID(信息哈希)并搜索 info_hash+1 / info_hash-1 吗?

如果是这样,在编程方面,如何增加/减少以“afe0 ...”形式给出的id?

如果没有,可以做些什么来达到冗余节点的数量?