refactor KadPeerInfo construction
This commit is contained in:
parent
1512ae27a1
commit
69f9aa5f0e
|
@ -1,10 +1,7 @@
|
||||||
from collections import Counter
|
from collections import Counter
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from multiaddr import Multiaddr
|
from .kad_peerinfo import KadPeerHeap, create_kad_peerinfo
|
||||||
from libp2p.peer.id import ID
|
|
||||||
from libp2p.peer.peerdata import PeerData
|
|
||||||
from .kad_peerinfo import KadPeerInfo, KadPeerHeap
|
|
||||||
from .utils import gather_dict
|
from .utils import gather_dict
|
||||||
|
|
||||||
|
|
||||||
|
@ -186,14 +183,4 @@ class RPCFindResponse:
|
||||||
be set.
|
be set.
|
||||||
"""
|
"""
|
||||||
nodelist = self.response[1] or []
|
nodelist = self.response[1] or []
|
||||||
output = []
|
return [create_kad_peerinfo(*nodeple) for nodeple in nodelist]
|
||||||
for nodeple in nodelist:
|
|
||||||
#TODO check if nodeple is of the right format
|
|
||||||
# node_id, ip, port
|
|
||||||
node_id = ID(nodeple[0])
|
|
||||||
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
|
||||||
addr = [Multiaddr("/ip4/" + str(nodeple[1]) + "/udp/" + str(nodeple[2]))]
|
|
||||||
peer_data.add_addrs(addr)
|
|
||||||
output.append(KadPeerInfo(node_id, peer_data))
|
|
||||||
|
|
||||||
return output
|
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
import heapq
|
import heapq
|
||||||
|
import random
|
||||||
|
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
from multiaddr import Multiaddr
|
||||||
from libp2p.peer.peerinfo import PeerInfo
|
from libp2p.peer.peerinfo import PeerInfo
|
||||||
|
from libp2p.peer.id import ID
|
||||||
|
from libp2p.peer.peerdata import PeerData
|
||||||
from .utils import digest
|
from .utils import digest
|
||||||
|
|
||||||
P_IP = "ip4"
|
P_IP = "ip4"
|
||||||
|
@ -126,3 +130,14 @@ class KadPeerHeap:
|
||||||
|
|
||||||
def get_uncontacted(self):
|
def get_uncontacted(self):
|
||||||
return [n for n in self if n.peer_id not in self.contacted]
|
return [n for n in self if n.peer_id not in self.contacted]
|
||||||
|
|
||||||
|
def create_kad_peerinfo(raw_node_id=None, sender_ip=None, sender_port=None):
|
||||||
|
node_id = ID(raw_node_id) if raw_node_id else ID(digest(random.getrandbits(255)))
|
||||||
|
peer_data = None
|
||||||
|
if sender_ip and sender_port:
|
||||||
|
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
||||||
|
addr = [Multiaddr("/"+ P_IP +"/" + str(sender_ip) + "/"\
|
||||||
|
+ P_UDP + "/" + str(sender_port))]
|
||||||
|
peer_data.add_addrs(addr)
|
||||||
|
|
||||||
|
return KadPeerInfo(node_id, peer_data)
|
||||||
|
|
|
@ -1,18 +1,14 @@
|
||||||
"""
|
"""
|
||||||
Package for interacting on the network at a high level.
|
Package for interacting on the network at a high level.
|
||||||
"""
|
"""
|
||||||
import random
|
|
||||||
import pickle
|
import pickle
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
from multiaddr import Multiaddr
|
|
||||||
|
|
||||||
from libp2p.peer.id import ID
|
|
||||||
from libp2p.peer.peerdata import PeerData
|
|
||||||
from .protocol import KademliaProtocol
|
from .protocol import KademliaProtocol
|
||||||
from .utils import digest
|
from .utils import digest
|
||||||
from .storage import ForgetfulStorage
|
from .storage import ForgetfulStorage
|
||||||
from .kad_peerinfo import KadPeerInfo
|
from .kad_peerinfo import create_kad_peerinfo
|
||||||
from .crawling import ValueSpiderCrawl
|
from .crawling import ValueSpiderCrawl
|
||||||
from .crawling import NodeSpiderCrawl
|
from .crawling import NodeSpiderCrawl
|
||||||
|
|
||||||
|
@ -42,8 +38,7 @@ class Server:
|
||||||
self.ksize = ksize
|
self.ksize = ksize
|
||||||
self.alpha = alpha
|
self.alpha = alpha
|
||||||
self.storage = storage or ForgetfulStorage()
|
self.storage = storage or ForgetfulStorage()
|
||||||
new_node_id = ID(node_id) if node_id else ID(digest(random.getrandbits(255)))
|
self.node = create_kad_peerinfo(node_id)
|
||||||
self.node = KadPeerInfo(new_node_id, None)
|
|
||||||
self.transport = None
|
self.transport = None
|
||||||
self.protocol = None
|
self.protocol = None
|
||||||
self.refresh_loop = None
|
self.refresh_loop = None
|
||||||
|
@ -90,7 +85,7 @@ class Server:
|
||||||
"""
|
"""
|
||||||
results = []
|
results = []
|
||||||
for node_id in self.protocol.get_refresh_ids():
|
for node_id in self.protocol.get_refresh_ids():
|
||||||
node = KadPeerInfo(node_id, None)
|
node = create_kad_peerinfo(node_id)
|
||||||
nearest = self.protocol.router.find_neighbors(node, self.alpha)
|
nearest = self.protocol.router.find_neighbors(node, self.alpha)
|
||||||
spider = NodeSpiderCrawl(self.protocol, node, nearest,
|
spider = NodeSpiderCrawl(self.protocol, node, nearest,
|
||||||
self.ksize, self.alpha)
|
self.ksize, self.alpha)
|
||||||
|
@ -135,11 +130,7 @@ class Server:
|
||||||
|
|
||||||
async def bootstrap_node(self, addr):
|
async def bootstrap_node(self, addr):
|
||||||
result = await self.protocol.ping(addr, self.node.peer_id)
|
result = await self.protocol.ping(addr, self.node.peer_id)
|
||||||
node_id = ID(result[1])
|
return create_kad_peerinfo(result[1], addr[0], addr[1]) if result[0] else None
|
||||||
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
|
||||||
addr = [Multiaddr("/ip4/" + str(addr[0]) + "/udp/" + str(addr[1]))]
|
|
||||||
peer_data.add_addrs(addr)
|
|
||||||
return KadPeerInfo(node_id, peer_data) if result[0] else None
|
|
||||||
|
|
||||||
async def get(self, key):
|
async def get(self, key):
|
||||||
"""
|
"""
|
||||||
|
@ -154,7 +145,7 @@ class Server:
|
||||||
if self.storage.get(dkey) is not None:
|
if self.storage.get(dkey) is not None:
|
||||||
return self.storage.get(dkey)
|
return self.storage.get(dkey)
|
||||||
|
|
||||||
node = KadPeerInfo(ID(dkey))
|
node = create_kad_peerinfo(dkey)
|
||||||
nearest = self.protocol.router.find_neighbors(node)
|
nearest = self.protocol.router.find_neighbors(node)
|
||||||
if not nearest:
|
if not nearest:
|
||||||
log.warning("There are no known neighbors to get key %s", key)
|
log.warning("There are no known neighbors to get key %s", key)
|
||||||
|
@ -180,7 +171,7 @@ class Server:
|
||||||
Set the given SHA1 digest key (bytes) to the given value in the
|
Set the given SHA1 digest key (bytes) to the given value in the
|
||||||
network.
|
network.
|
||||||
"""
|
"""
|
||||||
node = KadPeerInfo(ID(dkey))
|
node = create_kad_peerinfo(dkey)
|
||||||
|
|
||||||
nearest = self.protocol.router.find_neighbors(node)
|
nearest = self.protocol.router.find_neighbors(node)
|
||||||
if not nearest:
|
if not nearest:
|
||||||
|
|
|
@ -2,13 +2,10 @@ import random
|
||||||
import asyncio
|
import asyncio
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from multiaddr import Multiaddr
|
|
||||||
from rpcudp.protocol import RPCProtocol
|
from rpcudp.protocol import RPCProtocol
|
||||||
from libp2p.peer.id import ID
|
from .kad_peerinfo import create_kad_peerinfo
|
||||||
from libp2p.peer.peerdata import PeerData
|
|
||||||
from .kad_peerinfo import KadPeerInfo
|
|
||||||
from .routing import RoutingTable
|
from .routing import RoutingTable
|
||||||
from .utils import digest
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__) # pylint: disable=invalid-name
|
log = logging.getLogger(__name__) # pylint: disable=invalid-name
|
||||||
|
|
||||||
|
@ -49,21 +46,13 @@ class KademliaProtocol(RPCProtocol):
|
||||||
return sender
|
return sender
|
||||||
|
|
||||||
def rpc_ping(self, sender, nodeid):
|
def rpc_ping(self, sender, nodeid):
|
||||||
node_id = ID(nodeid)
|
source = create_kad_peerinfo(nodeid, sender[0], sender[1])
|
||||||
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
|
||||||
addr = [Multiaddr("/ip4/" + str(sender[0]) + "/udp/" + str(sender[1]))]
|
|
||||||
peer_data.add_addrs(addr)
|
|
||||||
source = KadPeerInfo(node_id, peer_data)
|
|
||||||
|
|
||||||
self.welcome_if_new(source)
|
self.welcome_if_new(source)
|
||||||
return self.source_node.peer_id
|
return self.source_node.peer_id
|
||||||
|
|
||||||
def rpc_store(self, sender, nodeid, key, value):
|
def rpc_store(self, sender, nodeid, key, value):
|
||||||
node_id = ID(nodeid)
|
source = create_kad_peerinfo(nodeid, sender[0], sender[1])
|
||||||
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
|
||||||
addr = [Multiaddr("/ip4/" + str(sender[0]) + "/udp/" + str(sender[1]))]
|
|
||||||
peer_data.add_addrs(addr)
|
|
||||||
source = KadPeerInfo(node_id, peer_data)
|
|
||||||
|
|
||||||
self.welcome_if_new(source)
|
self.welcome_if_new(source)
|
||||||
log.debug("got a store request from %s, storing '%s'='%s'",
|
log.debug("got a store request from %s, storing '%s'='%s'",
|
||||||
|
@ -74,25 +63,16 @@ class KademliaProtocol(RPCProtocol):
|
||||||
def rpc_find_node(self, sender, nodeid, key):
|
def rpc_find_node(self, sender, nodeid, key):
|
||||||
log.info("finding neighbors of %i in local table",
|
log.info("finding neighbors of %i in local table",
|
||||||
int(nodeid.hex(), 16))
|
int(nodeid.hex(), 16))
|
||||||
|
source = create_kad_peerinfo(nodeid, sender[0], sender[1])
|
||||||
node_id = ID(nodeid)
|
|
||||||
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
|
||||||
addr = [Multiaddr("/ip4/" + str(sender[0]) + "/udp/" + str(sender[1]))]
|
|
||||||
peer_data.add_addrs(addr)
|
|
||||||
source = KadPeerInfo(node_id, peer_data)
|
|
||||||
|
|
||||||
# source = Node(nodeid, sender[0], sender[1])
|
# source = Node(nodeid, sender[0], sender[1])
|
||||||
self.welcome_if_new(source)
|
self.welcome_if_new(source)
|
||||||
node = KadPeerInfo(ID(key))
|
node = create_kad_peerinfo(key)
|
||||||
neighbors = self.router.find_neighbors(node, exclude=source)
|
neighbors = self.router.find_neighbors(node, exclude=source)
|
||||||
return list(map(tuple, neighbors))
|
return list(map(tuple, neighbors))
|
||||||
|
|
||||||
def rpc_find_value(self, sender, nodeid, key):
|
def rpc_find_value(self, sender, nodeid, key):
|
||||||
node_id = ID(nodeid)
|
source = create_kad_peerinfo(nodeid, sender[0], sender[1])
|
||||||
peer_data = PeerData() #pylint: disable=no-value-for-parameter
|
|
||||||
addr = [Multiaddr("/ip4/" + str(sender[0]) + "/udp/" + str(sender[1]))]
|
|
||||||
peer_data.add_addrs(addr)
|
|
||||||
source = KadPeerInfo(node_id, peer_data)
|
|
||||||
|
|
||||||
self.welcome_if_new(source)
|
self.welcome_if_new(source)
|
||||||
value = self.storage.get(key, None)
|
value = self.storage.get(key, None)
|
||||||
|
@ -141,7 +121,7 @@ class KademliaProtocol(RPCProtocol):
|
||||||
|
|
||||||
log.info("never seen %s before, adding to router", node)
|
log.info("never seen %s before, adding to router", node)
|
||||||
for key, value in self.storage:
|
for key, value in self.storage:
|
||||||
keynode = KadPeerInfo(ID(digest(key)))
|
keynode = create_kad_peerinfo(key)
|
||||||
neighbors = self.router.find_neighbors(keynode)
|
neighbors = self.router.find_neighbors(keynode)
|
||||||
if neighbors:
|
if neighbors:
|
||||||
last = neighbors[-1].distance_to(keynode)
|
last = neighbors[-1].distance_to(keynode)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user