Как реализовать Kademlia DHT

#python #p2p #kademlia

#python #p2p #kademlia

Вопрос:

Я пытаюсь реализовать Kademlia (двоичное дерево) DHT на python. Насколько я понимаю, таблица маршрутизации должна сравнивать отдельные биты из идентификатора корневого узла с новой записью. Если биты идентификатора не совпадают, вы идете налево, если они совпадают, вы идете направо. Это можно сделать рекурсивно, и условием остановки является либо то, что вы достигли конца длины идентификатора, либо то, что вы достигли конечного узла. Тогда каждый конечный узел содержит свой собственный kbucket (массив).

В настоящее время я попробовал следующее:

 #!/usr/bin/python

class Node:
    def __init__(self, id, data):
        self.id = id
        self.data = data
        self.left = None
        self.right = None

    def __str__(self):
        return '{id:'   self.id   ','   self.data   '}'

class Tree:
    def __init__(self):
        self.root = None

    def find_placement(self, node, previous_node, id_index):
        if (node == None):
            return previous_node, id_index
        elif (node.right == None and node.left == None):
            return node, id_index
        elif (node.id[id_index] == previous_node.id[id_index]):
            return self.find_placement(node.right, node, id_index 1)
        elif (node.id[id_index] != previous_node.id[id_index]):
            return self.find_placement(node.left, node, id_index 1)
 
    def add(self, id, data):
        new_node = Node(id, data)
        if (self.root == None):
            self.root = new_node
            return
        previous_node = current_node = self.root
        id_index = 0
        current_node, id_index = self.find_placement(current_node, previous_node, id_index)
        if (current_node.id[id_index] == new_node.id[id_index]):
            current_node.right = new_node
        elif (current_node.id[id_index] != new_node.id[id_index]):
            current_node.left = new_node
        new_node.parent = current_node

    def printtree(self, node=None, level=0, lr = ''):
        if (node == None):
            node = self.root
        
        print (lr, level, node)
        if (node.left != None):
            self.printtree(node.left, level 1, 'L')
        if (node.right != None):
            self.printtree(node.right, level 1, 'R')



if __name__ == "__main__":
    t = Tree()
    t.add('0000','test')
    t.add('0100','test')
    t.add('0010','test')
    t.add('0001','test')
    t.add('0101','test')

    t.printtree()

  

В настоящее время я пытаюсь найти конечный узел, дочерним элементом которого может быть новый узел.

Может ли кто-нибудь помочь мне понять, что именно я делаю неправильно? Если я пропустил что-то необходимое, я заранее приношу извинения и приветствую любые предложения о том, как я мог бы улучшить этот пост!

Я думаю, в чем моя проблема:

В настоящее время мои узлы сортируются в соответствии с первым битом, который противоречит биту с тем же индексом корневого узла. Вместо этого мне нужно отсортировать узлы таким образом, чтобы самый правый узел был вашим собственным узлом после начальной загрузки.

Если это так, каким будет корневой узел? Есть ли способ сделать это, когда корневой узел является вашим собственным узлом, сохраняя при этом целостность сети?

После добавления нового узла в сеть, как мне реструктурировать дерево, чтобы поддерживать правило, согласно которому ветви, которые вы проходите (каждая новая ветвь), представляют один бит в идентификаторе конечного узла? До такой степени, что крайний правый узел является ближайшим к вашему собственному узлу, а крайний левый будет самым удаленным.

Подробнее о дереве можно узнать здесь: https://www.researchgate.net/publication/2492563_Kademlia_A_Peer-to-peer_Information_System_Based_on_the_XOR_Metric

Комментарии:

1. Вы на самом деле не указали, с какой проблемой вы столкнулись.

2. @the8472 спасибо за критику. Я обновил свой пост, чтобы более четко задавать вопросы и указывать, в чем моя проблема. Если есть что-то еще, что я могу добавить, дайте мне знать!