From f4182cb996f78f1861c154bf2d28571e2084377e Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Fri, 5 Feb 2021 02:19:23 +0000 Subject: [PATCH] implemented peer exchange --- .../torgossip/commandhandlers.py | 14 +++++----- .../default-plugins/torgossip/peerdb.py | 27 +++++++++++++++---- .../default-plugins/torgossip/runtest.py | 15 +++++++---- .../default-plugins/torgossip/server.py | 4 +++ 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/static-data/default-plugins/torgossip/commandhandlers.py b/static-data/default-plugins/torgossip/commandhandlers.py index fec6ef48..cfd8fb55 100644 --- a/static-data/default-plugins/torgossip/commandhandlers.py +++ b/static-data/default-plugins/torgossip/commandhandlers.py @@ -2,8 +2,6 @@ Handle commands for the torgossip server """ -from onionrblocks import generators -from onionrblocks.generators import anonvdf import blockio import onionrblocks @@ -26,9 +24,13 @@ along with this program. If not, see . def peer_exchange(peers: 'Peers', num_of_peers: bytes): - #7 - num_of_peers = int.from_bytes(num_of_peers, 'little') - return peers.get_highest_score_peers(num_of_peers) + """command 7: exchange a number of our top performing peers""" + num_of_peers = int(chr(int.from_bytes(num_of_peers, 'little'))) + peers = peers.get_highest_score_peers(num_of_peers) + just_addresses = [] + for i in peers: + just_addresses.append(i[0]) + return b''.join(just_addresses) def put_block(safe_db, block): @@ -41,7 +43,7 @@ def put_block(safe_db, block): safe_db) except ValueError: pass - except Exception as e: + except Exception as _: # noqa return b"0" return b"1" diff --git a/static-data/default-plugins/torgossip/peerdb.py b/static-data/default-plugins/torgossip/peerdb.py index f4b1a499..8ca5d58a 100644 --- a/static-data/default-plugins/torgossip/peerdb.py +++ b/static-data/default-plugins/torgossip/peerdb.py @@ -29,7 +29,7 @@ class TorGossipPeers: # name it this way to avoid collisions in SharedState PACK_FORMAT = "qQ" - def __init__(self, encrypt=True): + def __init__(self, encrypt=False): self.db = safedb.SafeDB( identify_home() + "/torgossip-peers.db", protected=encrypt) @@ -54,18 +54,30 @@ class TorGossipPeers: # name it this way to avoid collisions in SharedState self.db.put(peer, pack(self.PACK_FORMAT, score, seen)) - def get_highest_score_peers(self, max=5): + def get_highest_score_peers(self, max): assert max >= 1 peer = self.db.db_conn.firstkey() + if peer == b'enc': + peer = self.db.db_conn.nextkey(peer) + print('p', peer) + assert len(peer) == 34 + if not peer: + return [] top = [(peer, self.db.get(peer))] - for peer in self.db.db_conn.nextkey(peer): + while peer: + peer = self.db.db_conn.nextkey(peer) + if not peer: + break + if peer == b"enc": + continue peer_data = self.db.get(peer) overwrite = None if len(top) != max: top.append((peer, peer_data)) + peer = self.db.db_conn.nextkey(peer) continue for count, cur_top in enumerate(top): # if peer score is greater than any set peer, overwrite @@ -75,16 +87,17 @@ class TorGossipPeers: # name it this way to avoid collisions in SharedState break # below else won't execute, so it will be overwritten else: # if not overwriting, go to next peer + peer = self.db.db_conn.nextkey(peer) continue top[overwrite] = (peer, peer_data) return top - def add_score(self, peer, new_score): + def add_score(self, peer, plus): shrunk = self._shrink_peer_address(peer) score, _ = unpack("qQ", self.db.get(shrunk)) self._pack_and_store_info( - shrunk, new_score=score + new_score) + shrunk, new_score=score + plus) def update_seen(self, peer): peer = self._shrink_peer_address(peer) @@ -92,3 +105,7 @@ class TorGossipPeers: # name it this way to avoid collisions in SharedState def add_peer(self, peer): self._pack_and_store_info(peer) + + def remove_peer(self, peer): + peer = self._shrink_peer_address(peer) + del self.db.db_conn[peer] diff --git a/static-data/default-plugins/torgossip/runtest.py b/static-data/default-plugins/torgossip/runtest.py index 3c9ebf1f..dc1acf0c 100644 --- a/static-data/default-plugins/torgossip/runtest.py +++ b/static-data/default-plugins/torgossip/runtest.py @@ -1,7 +1,7 @@ import socket import os import secrets -from base64 import b32encode +from base64 import b32decode, b32encode from utils import identifyhome from onionrblocks import blockcreator @@ -73,10 +73,15 @@ def torgossip_runtest(test_manager): shared_state.get_by_string("SafeDB").get('bl-tbt')) - 64 # test peer list - #fake_peer = _fake_onion() - #shared_state.get_by_string('TorGossipPeers').add_peer(fake_peer) - #s.sendall(b'71') - #assert s.recv(100) == fake_peer + fake_peer = _fake_onion() + shared_state.get_by_string('TorGossipPeers').add_peer(fake_peer) + shared_state.get_by_string('TorGossipPeers').add_score(fake_peer, 100000) + s.sendall(b'71') + stored = s.recv(1000) + expected = b32decode(fake_peer.replace('.onion', '')).replace(b'.onion', b'') + print(stored, expected) + assert stored == expected + shared_state.get_by_string('TorGossipPeers').remove_peer(fake_peer) s.sendall(b'9') assert s.recv(64) == b"BYE" diff --git a/static-data/default-plugins/torgossip/server.py b/static-data/default-plugins/torgossip/server.py index 82f5e1b7..cc8b96f5 100644 --- a/static-data/default-plugins/torgossip/server.py +++ b/static-data/default-plugins/torgossip/server.py @@ -82,6 +82,10 @@ def start_server(shared_state): conn.sendall( commandhandlers.handle_check_block( shared_state.get_by_string('SafeDB'), data)) + elif cmd == GossipCommands.PEER_EXCHANGE: + conn.sendall( + commandhandlers.peer_exchange( + shared_state.get_by_string('TorGossipPeers'), data)) else: conn.sendall(b'Unknown ' + str(cmd).encode('utf-8')) else: