Skip to content

Commit

Permalink
Tests for kademlia automatic!!
Browse files Browse the repository at this point in the history
  • Loading branch information
NikolayBlagoev committed Mar 6, 2024
1 parent 416084f commit 631183e
Show file tree
Hide file tree
Showing 27 changed files with 456 additions and 111 deletions.
6 changes: 3 additions & 3 deletions 1.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from deccom.protocols.defaultprotocol import DefaultProtocol
from deccom.peers import Peer
from deccom.protocols.streamprotocol import StreamProtocol
Peer.me = Peer(("127.0.0.1", 10015)) # type:ignore
self.peer = Peer(("127.0.0.1", 10015)) # type:ignore

# def send(nd: StreamNode):
# print(list(me.protocol_type.get_peers().values()))
Expand All @@ -21,8 +21,8 @@


me = StreamNode(stream,"127.0.0.1", 10015)
Peer.me.tcp = me.tcp_port
print(Peer.me.id_node)
self.peer.tcp = me.tcp_port
print(self.peer.id_node)
loop = asyncio.new_event_loop()
# loop.call_later(5,
# send, me)
Expand Down
4 changes: 2 additions & 2 deletions 2.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ def send(nd: StreamNode):
stream = StreamProtocol(True, peer_connected_callback= print, disconnected_callback=print)
stream.set_lower(approval)
me = StreamNode(stream,"127.0.0.1")
Peer.me = Peer((me.ip_addr,me.port), tcp=me.tcp_port)
self.peer = Peer((me.ip_addr,me.port), tcp=me.tcp_port)
loop = asyncio.new_event_loop()
print(Peer.me.id_node)
print(self.peer.id_node)
if True:
loop.call_later(5,
send, me)
Expand Down
6 changes: 3 additions & 3 deletions 3.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ def send(nd: StreamNode):
stream = StreamProtocol(True, peer_connected_callback= print, disconnected_callback=print)
stream.set_lower(approval)
me = StreamNode(stream,"127.0.0.1")
Peer.me = Peer((me.ip_addr,me.port), tcp=me.tcp_port)
self.peer = Peer((me.ip_addr,me.port), tcp=me.tcp_port)
loop = asyncio.new_event_loop()
print(Peer.me.id_node)
# if Peer.me.pub_key == "2":
print(self.peer.id_node)
# if self.peer.pub_key == "2":
# loop.call_later(5,
# send, me)
loop.run_until_complete(me.listen())
Expand Down
5 changes: 0 additions & 5 deletions deccom/peers/peer.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
from typing import Union

class Peer(object):
me: 'Peer'

def __init__(self, addr, pub_key: Ed25519PrivateKey = None, tcp = None, id_node = None, proof_of_self = None) -> None:
self.priv_key = None
if pub_key == None:
Expand Down Expand Up @@ -92,9 +90,6 @@ def from_bytes(b: bytes):

return Peer((ip,port), pub_key, tcp ,id_node), reader.get_head() #type: ignore

@staticmethod
def get_current():
return Peer.me


class byte_reader:
Expand Down
5 changes: 3 additions & 2 deletions deccom/protocols/abstractprotocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,12 +93,13 @@ async def _lower_sendto(self, msg:bytes, addr:tuple[str,int]):
return

@bindto("start")
async def _lower_start(self):
async def _lower_start(self, p: Peer):
return

async def start(self):
async def start(self, p: Peer):
await self._lower_start()
print("started")
self.peer = p
self.started = True
def recursive_check(obj, mtd, attr):
if not hasattr(obj, mtd):
Expand Down
12 changes: 12 additions & 0 deletions deccom/protocols/peerdiscovery/_kademlia_routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ def get_top(self) -> tuple[bytes,Peer]:

class BucketManager(object):
def __init__(self, id, k, success_call, max_l = 256) -> None:
if isinstance(id, bytearray):
id = bytes(id)
if isinstance(id, bytes):
id = int.from_bytes(id, byteorder="big")
self.id = id
Expand All @@ -107,6 +109,8 @@ def bytexor(self, b1,b2):
raise Exception("WRONG IDS")
return bytes(a ^ b for a, b in zip(b1, b2))
def get_peer(self, id) -> Peer:
if isinstance(id, bytearray):
id = bytes(id)
if isinstance(id, bytes):
id = int.from_bytes(id, byteorder="big")
dist = self.id ^ id
Expand All @@ -116,6 +120,8 @@ def get_peer(self, id) -> Peer:


def update_peer(self, id, node) -> Peer:
if isinstance(id, bytearray):
id = bytes(id)
if isinstance(id, bytes):
id = int.from_bytes(id, byteorder="big")
dist = self.id ^ id
Expand All @@ -124,6 +130,8 @@ def update_peer(self, id, node) -> Peer:


def add_peer(self,id,node, lv=0):
if isinstance(id, bytearray):
id = bytes(id)
# print(lv)
if isinstance(id, bytes):
id = int.from_bytes(id, byteorder="big")
Expand All @@ -150,13 +158,17 @@ def _get_index(self, dist)->int:
# print("indx for", dist, "is",indx)
return indx
def remove_peer(self, id):
if isinstance(id, bytearray):
id = bytes(id)
if isinstance(id, bytes):
id = int.from_bytes(id, byteorder="big")
dist = self.id ^ id
idx = self._get_index(dist)
self.buckets[idx].remove_peer(dist)

def get_closest(self, id, alpha = None) -> list[Peer]:
if isinstance(id, bytearray):
id = bytes(id)
if isinstance(id, bytes):
id = int.from_bytes(id, byteorder="big")
if alpha == None:
Expand Down
2 changes: 1 addition & 1 deletion deccom/protocols/peerdiscovery/abstractpeerdiscovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def __init__(self, bootstrap_peers: list[Peer] = [], interval: int = 10, submodu
self.bootstrap_peers = bootstrap_peers
self.disconnected_callback = disconnected_callback
self.connected_callback = connected_callback
self.connection_approval: Callable[[tuple[str,int], Peer, Callable[[tuple[str,int],Peer],None], Callable[[tuple[str,int],Peer],None], AbstractProtocol],None] = lambda addr, peer, success, failure: success(addr,peer)
self.connection_approval: Callable[[tuple[str,int], Peer, Callable[[tuple[str,int],Peer],None], Callable[[tuple[str,int],Peer],None], AbstractProtocol],None] = lambda addr, peer, success, failure: self.add_peer(addr,peer)
self.peers: dict[bytes, Peer] = dict()

def set_connected_callback(self, callback: Callable[[Peer], None]):
Expand Down
5 changes: 3 additions & 2 deletions deccom/protocols/peerdiscovery/fixedpeers.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,11 @@ def __init__(self, peer_list: list[Peer], bootstrap_peers: list[Peer] = [], inte
self.a_to_p[p.addr] = p
self.peers[p.id_node] = p
self.introduced = []
async def start(self):
await super().start()
async def start(self, p: Peer):
await super().start(p)
loop = asyncio.get_running_loop()
loop.call_later(2, self.introduce_to_others)

def introduce_to_others(self):
loop = asyncio.get_running_loop()
for a in self.a_to_p:
Expand Down
14 changes: 7 additions & 7 deletions deccom/protocols/peerdiscovery/gossipdiscovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ def __init__(self, bootstrap_peers: list[Peer] = [], interval: int = 10, submodu
self.sent_finds = dict()


async def start(self):
await super().start()
async def start(self, p: Peer):
await super().start(p)
for p in self.bootstrap_peers:
await self.introduce_to_peer(p)
msg = bytearray([GossipDiscovery.ASK_FOR_ID])
Expand Down Expand Up @@ -78,7 +78,7 @@ async def _push_or_pull(self):

p1 = ids[randint(0, len(ids)-1)]
msg = bytearray([GossipDiscovery.PULL])
msg = msg + bytes(Peer.me)
msg = msg + bytes(self.peer)
await self._lower_sendto(msg, self.peers[p1].addr)
loop = asyncio.get_running_loop()
self.refresh_loop = loop.call_later(self.interval+2, self.push_or_pull)
Expand All @@ -90,7 +90,7 @@ def remove_peer(self, addr: tuple[str, int], node_id: bytes):
async def introduce_to_peer(self, peer: Peer):
# print("introducing to", peer.id_node)
msg = bytearray([GossipDiscovery.INTRODUCTION])
msg = msg + bytes(Peer.get_current())
msg = msg + bytes(self.peer)
await self._lower_sendto(msg, peer.addr)

async def sendto(self, msg, addr):
Expand Down Expand Up @@ -152,7 +152,7 @@ def process_datagram(self, addr: tuple[str, int], data: bytes):
id = data[i+1:]
# print(seeker.id_node," is looking for ",id)
self.sent_finds[data] = i
if id == Peer.me.id_node:
if id == self.peer.id_node:
# print("THATS ME")
loop = asyncio.get_running_loop()
loop.create_task(self.introduce_to_peer(seeker))
Expand All @@ -175,7 +175,7 @@ def process_datagram(self, addr: tuple[str, int], data: bytes):
elif data[0] == GossipDiscovery.ASK_FOR_ID:
print("ASKING FOR ID")
msg = bytearray([GossipDiscovery.INTRODUCTION])
msg = msg + bytes(Peer.get_current())
msg = msg + bytes(self.peer)
loop = asyncio.get_running_loop()
loop.create_task(self._lower_sendto(msg, addr))

Expand All @@ -201,7 +201,7 @@ async def _find_peer(self, fut, id):
msg = bytearray([GossipDiscovery.FIND])
if isinstance(id, str):
id = id.encode("utf-8")
msg = msg + bytes(Peer.me) + id
msg = msg + bytes(self.peer) + id
l = list(self.get_peers())
for p in l:
if self.get_peers().get(p) is None:
Expand Down
Loading

0 comments on commit 631183e

Please sign in to comment.