From 3f24b015ab84ae4c0f648df87ef79515d05cca3a Mon Sep 17 00:00:00 2001 From: "Aratz M. Lasa" Date: Mon, 14 Oct 2019 00:29:28 +0200 Subject: [PATCH 1/7] Implemented Host that includes a routing system. Explicitly separating different Host types as in Go implementation --- libp2p/__init__.py | 9 +++++++-- libp2p/host/basic_host.py | 10 +++------- libp2p/host/routed_host.py | 36 ++++++++++++++++++++++++++++++++++++ libp2p/network/swarm.py | 12 +----------- 4 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 libp2p/host/routed_host.py diff --git a/libp2p/__init__.py b/libp2p/__init__.py index 08caf256..b0571881 100644 --- a/libp2p/__init__.py +++ b/libp2p/__init__.py @@ -4,6 +4,7 @@ from typing import Sequence from libp2p.crypto.keys import KeyPair from libp2p.crypto.rsa import create_new_key_pair from libp2p.host.basic_host import BasicHost +from libp2p.host.routed_host import RoutedHost from libp2p.kademlia.network import KademliaServer from libp2p.kademlia.storage import IStorage from libp2p.network.network_interface import INetwork @@ -106,7 +107,7 @@ def initialize_default_swarm( peerstore = peerstore_opt or PeerStore() # TODO: Initialize discovery if not presented - return Swarm(id_opt, peerstore, upgrader, transport, disc_opt) + return Swarm(id_opt, peerstore, upgrader, transport) async def new_node( @@ -149,7 +150,11 @@ async def new_node( # TODO enable support for other host type # TODO routing unimplemented - host = BasicHost(swarm_opt) + if disc_opt: + host = RoutedHost(swarm_opt, disc_opt) + else: + host = BasicHost(swarm_opt) + # Kick off cleanup job asyncio.ensure_future(cleanup_done_tasks()) diff --git a/libp2p/host/basic_host.py b/libp2p/host/basic_host.py index 926efed6..95a21111 100644 --- a/libp2p/host/basic_host.py +++ b/libp2p/host/basic_host.py @@ -13,9 +13,7 @@ from libp2p.protocol_muxer.exceptions import MultiselectClientError, Multiselect from libp2p.protocol_muxer.multiselect import Multiselect from libp2p.protocol_muxer.multiselect_client import MultiselectClient from libp2p.protocol_muxer.multiselect_communicator import MultiselectCommunicator -from libp2p.routing.kademlia.kademlia_peer_router import KadmeliaPeerRouter from libp2p.typing import StreamHandlerFn, TProtocol - from .host_interface import IHost # Upon host creation, host takes in options, @@ -34,16 +32,14 @@ class BasicHost(IHost): """ _network: INetwork - _router: KadmeliaPeerRouter peerstore: IPeerStore multiselect: Multiselect multiselect_client: MultiselectClient - def __init__(self, network: INetwork, router: KadmeliaPeerRouter = None) -> None: + def __init__(self, network: INetwork) -> None: self._network = network self._network.set_stream_handler(self._swarm_stream_handler) - self._router = router self.peerstore = self._network.peerstore # Protocol muxing self.multiselect = Multiselect() @@ -87,7 +83,7 @@ class BasicHost(IHost): return addrs def set_stream_handler( - self, protocol_id: TProtocol, stream_handler: StreamHandlerFn + self, protocol_id: TProtocol, stream_handler: StreamHandlerFn ) -> None: """ set stream handler for given `protocol_id` @@ -97,7 +93,7 @@ class BasicHost(IHost): self.multiselect.add_handler(protocol_id, stream_handler) async def new_stream( - self, peer_id: ID, protocol_ids: Sequence[TProtocol] + self, peer_id: ID, protocol_ids: Sequence[TProtocol] ) -> INetStream: """ :param peer_id: peer_id that host is connecting diff --git a/libp2p/host/routed_host.py b/libp2p/host/routed_host.py new file mode 100644 index 00000000..2c59e721 --- /dev/null +++ b/libp2p/host/routed_host.py @@ -0,0 +1,36 @@ +from libp2p.host.basic_host import BasicHost +from libp2p.network.network_interface import INetwork +from libp2p.peer.peerinfo import PeerInfo +from libp2p.routing.interfaces import IPeerRouting + + +# RoutedHost is a p2p Host that includes a routing system. +# This allows the Host to find the addresses for peers when it does not have them. +class RoutedHost(BasicHost): + _router: IPeerRouting + + def __init__(self, network: INetwork, router: IPeerRouting): + super().__init__(network) + self._router = router + + async def connect(self, peer_info: PeerInfo) -> None: + """ + connect ensures there is a connection between this host and the peer with + given `peer_info.peer_id`. See (basic_host).connect for more information. + + RoutedHost's Connect differs in that if the host has no addresses for a + given peer, it will use its routing system to try to find some. + + :param peer_info: peer_info of the peer we want to connect to + :type peer_info: peer.peerinfo.PeerInfo + """ + # check if we were given some addresses, otherwise, find some with the routing system. + if not peer_info.addrs: + peer_info.addrs = (await self._router.find_peer(peer_info.peer_id)).addrs + self.peerstore.add_addrs(peer_info.peer_id, peer_info.addrs, 10) + + # there is already a connection to this peer + if peer_info.peer_id in self._network.connections: + return + + await self._network.dial_peer(peer_info.peer_id) diff --git a/libp2p/network/swarm.py b/libp2p/network/swarm.py index b32e46f9..90c9475a 100644 --- a/libp2p/network/swarm.py +++ b/libp2p/network/swarm.py @@ -8,7 +8,6 @@ from libp2p.network.connection.net_connection_interface import INetConn from libp2p.peer.id import ID from libp2p.peer.peerstore import PeerStoreError from libp2p.peer.peerstore_interface import IPeerStore -from libp2p.routing.interfaces import IPeerRouting from libp2p.stream_muxer.abc import IMuxedConn from libp2p.transport.exceptions import ( MuxerUpgradeFailure, @@ -36,7 +35,6 @@ class Swarm(INetwork): peerstore: IPeerStore upgrader: TransportUpgrader transport: ITransport - router: IPeerRouting # TODO: Connection and `peer_id` are 1-1 mapping in our implementation, # whereas in Go one `peer_id` may point to multiple connections. connections: Dict[ID, INetConn] @@ -51,13 +49,11 @@ class Swarm(INetwork): peerstore: IPeerStore, upgrader: TransportUpgrader, transport: ITransport, - router: IPeerRouting, ): self.self_id = peer_id self.peerstore = peerstore self.upgrader = upgrader self.transport = transport - self.router = router self.connections = dict() self.listeners = dict() @@ -96,10 +92,7 @@ class Swarm(INetwork): if not addrs: raise SwarmException(f"No known addresses to peer {peer_id}") - if not self.router: - multiaddr = addrs[0] - else: - multiaddr = self.router.find_peer(peer_id) + multiaddr = addrs[0] # Dial peer (connection to peer does not yet exist) # Transport dials peer (gets back a raw conn) try: @@ -232,9 +225,6 @@ class Swarm(INetwork): # No maddr succeeded return False - def add_router(self, router: IPeerRouting) -> None: - self.router = router - async def close(self) -> None: # TODO: Prevent from new listeners and conns being added. # Reference: https://github.com/libp2p/go-libp2p-swarm/blob/8be680aef8dea0a4497283f2f98470c2aeae6b65/swarm.go#L124-L134 # noqa: E501 From 814356383160fb30d376850710d240d9360cea91 Mon Sep 17 00:00:00 2001 From: "Aratz M. Lasa" Date: Tue, 15 Oct 2019 01:01:16 +0200 Subject: [PATCH 2/7] Added tests for 'RoutedHost' and modified 'FindPeer' --- libp2p/host/routed_host.py | 6 ++- libp2p/peer/peerinfo.py | 12 +++++ .../routing/kademlia/kademlia_peer_router.py | 27 ++-------- tests/host/__init__.py | 0 tests/host/test_routed_host.py | 53 +++++++++++++++++++ tests/routing/test_kad_peer_router.py | 12 ++--- tests/utils.py | 25 +++++++++ 7 files changed, 105 insertions(+), 30 deletions(-) create mode 100644 tests/host/__init__.py create mode 100644 tests/host/test_routed_host.py diff --git a/libp2p/host/routed_host.py b/libp2p/host/routed_host.py index 2c59e721..1b63848b 100644 --- a/libp2p/host/routed_host.py +++ b/libp2p/host/routed_host.py @@ -1,4 +1,5 @@ from libp2p.host.basic_host import BasicHost +from libp2p.host.exceptions import ConnectionFailure from libp2p.network.network_interface import INetwork from libp2p.peer.peerinfo import PeerInfo from libp2p.routing.interfaces import IPeerRouting @@ -26,7 +27,10 @@ class RoutedHost(BasicHost): """ # check if we were given some addresses, otherwise, find some with the routing system. if not peer_info.addrs: - peer_info.addrs = (await self._router.find_peer(peer_info.peer_id)).addrs + found_peer_info = await self._router.find_peer(peer_info.peer_id) + if not found_peer_info: + raise ConnectionFailure("Unable to find Peer address") + peer_info.addrs = found_peer_info.addrs self.peerstore.add_addrs(peer_info.peer_id, peer_info.addrs, 10) # there is already a connection to this peer diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index 069a67dd..d744c0a5 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -1,3 +1,4 @@ +import json from typing import List, Sequence import multiaddr @@ -14,6 +15,17 @@ class PeerInfo: self.peer_id = peer_id self.addrs = list(addrs) + def to_string(self) -> str: + return json.dumps([self.peer_id.to_string(), list(map(lambda a: str(a), self.addrs))]) + + def __eq__(self, other): + return isinstance(other, PeerInfo) and self.peer_id == other.peer_id and self.addrs == other.addrs + + @classmethod + def info_from_string(cls, info: str) -> "PeerInfo": + peer_id, raw_addrs = json.loads(info) + return PeerInfo(ID.from_base58(peer_id), list(map(lambda a: multiaddr.Multiaddr(a), raw_addrs))) + def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: if not addr: diff --git a/libp2p/routing/kademlia/kademlia_peer_router.py b/libp2p/routing/kademlia/kademlia_peer_router.py index 59eaa1e5..9710d704 100644 --- a/libp2p/routing/kademlia/kademlia_peer_router.py +++ b/libp2p/routing/kademlia/kademlia_peer_router.py @@ -1,42 +1,23 @@ -import ast -from typing import Union - -from libp2p.kademlia.kad_peerinfo import KadPeerInfo, create_kad_peerinfo from libp2p.kademlia.network import KademliaServer from libp2p.peer.id import ID +from libp2p.peer.peerinfo import PeerInfo from libp2p.routing.interfaces import IPeerRouting class KadmeliaPeerRouter(IPeerRouting): - server: KademliaServer def __init__(self, dht_server: KademliaServer) -> None: self.server = dht_server - async def find_peer(self, peer_id: ID) -> KadPeerInfo: + async def find_peer(self, peer_id: ID) -> PeerInfo: """ Find a specific peer :param peer_id: peer to search for - :return: KadPeerInfo of specified peer + :return: PeerInfo of specified peer """ # switching peer_id to xor_id used by kademlia as node_id xor_id = peer_id.xor_id # ignore type for kad value = await self.server.get(xor_id) # type: ignore - return decode_peerinfo(value) - - -def decode_peerinfo(encoded: Union[bytes, str]) -> KadPeerInfo: - if isinstance(encoded, bytes): - encoded = encoded.decode() - try: - lines = ast.literal_eval(encoded) - except SyntaxError: - return None - ip = lines[1] - port = lines[2] - peer_id = lines[3] - # ignore typing for kad - peer_info = create_kad_peerinfo(peer_id, ip, port) # type: ignore - return peer_info + return PeerInfo.info_from_string(value) if value else None # TODO: should raise error if None? diff --git a/tests/host/__init__.py b/tests/host/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/host/test_routed_host.py b/tests/host/test_routed_host.py new file mode 100644 index 00000000..bcc53ca6 --- /dev/null +++ b/tests/host/test_routed_host.py @@ -0,0 +1,53 @@ +import asyncio + +import pytest + +from libp2p.host.exceptions import ConnectionFailure +from libp2p.peer.peerinfo import PeerInfo +from tests.utils import set_up_routers, set_up_nodes_by_transport_opt, set_up_nodes_by_transport_and_disc_opt + + +@pytest.mark.asyncio +async def test_host_routing_success(): + routers = await set_up_routers([5678, 5679]) + transports = [["/ip4/127.0.0.1/tcp/0"], ["/ip4/127.0.0.1/tcp/0"]] + transport_disc_opt_list = zip(transports, routers) + (host_a, host_b) = await set_up_nodes_by_transport_and_disc_opt(transport_disc_opt_list) + + # Set routing info + await routers[0].server.set(host_a.get_id().xor_id, PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string()) + await routers[1].server.set(host_b.get_id().xor_id, PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string()) + + # forces to use routing as no addrs are provided + await host_a.connect(PeerInfo(host_b.get_id(), [])) + await host_b.connect(PeerInfo(host_a.get_id(), [])) + + # Clean up + await asyncio.gather(*[host_a.close(), host_b.close()]) + routers[0].server.stop() + routers[1].server.stop() + + +@pytest.mark.asyncio +async def test_host_routing_fail(): + routers = await set_up_routers([5678, 5679]) + transports = [["/ip4/127.0.0.1/tcp/0"], ["/ip4/127.0.0.1/tcp/0"]] + transport_disc_opt_list = zip(transports, routers) + (host_a, host_b) = await set_up_nodes_by_transport_and_disc_opt(transport_disc_opt_list) + + host_c = (await set_up_nodes_by_transport_opt([["/ip4/127.0.0.1/tcp/0"]]))[0] + + # Set routing info + await routers[0].server.set(host_a.get_id().xor_id, PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string()) + await routers[1].server.set(host_b.get_id().xor_id, PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string()) + + # routing fails because host_c does not use routing + with pytest.raises(ConnectionFailure): + await host_a.connect(PeerInfo(host_c.get_id(), [])) + with pytest.raises(ConnectionFailure): + await host_b.connect(PeerInfo(host_c.get_id(), [])) + + # Clean up + await asyncio.gather(*[host_a.close(), host_b.close(), host_c.close()]) + routers[0].server.stop() + routers[1].server.stop() diff --git a/tests/routing/test_kad_peer_router.py b/tests/routing/test_kad_peer_router.py index 69d374ca..e2ff2607 100644 --- a/tests/routing/test_kad_peer_router.py +++ b/tests/routing/test_kad_peer_router.py @@ -15,11 +15,11 @@ async def test_simple_two_nodes(): node_a_value = await node_b.bootstrap([("127.0.0.1", 5678)]) node_a_kad_peerinfo = node_a_value[0] - await node_a.set(node_a_kad_peerinfo.xor_id, repr(node_a_kad_peerinfo)) + await node_a.set(node_a_kad_peerinfo.xor_id, node_a_kad_peerinfo.to_string()) router = KadmeliaPeerRouter(node_b) returned_info = await router.find_peer(ID(node_a_kad_peerinfo.peer_id_bytes)) - assert repr(returned_info) == repr(node_a_kad_peerinfo) + assert returned_info == node_a_kad_peerinfo @pytest.mark.asyncio @@ -37,11 +37,11 @@ async def test_simple_three_nodes(): node_a_kad_peerinfo = node_a_value[0] await node_c.bootstrap([("127.0.0.1", 5702)]) - await node_a.set(node_a_kad_peerinfo.xor_id, repr(node_a_kad_peerinfo)) + await node_a.set(node_a_kad_peerinfo.xor_id, node_a_kad_peerinfo.to_string()) router = KadmeliaPeerRouter(node_c) returned_info = await router.find_peer(ID(node_a_kad_peerinfo.peer_id_bytes)) - assert str(returned_info) == str(node_a_kad_peerinfo) + assert returned_info == node_a_kad_peerinfo @pytest.mark.asyncio @@ -65,8 +65,8 @@ async def test_simple_four_nodes(): await node_d.bootstrap([("127.0.0.1", 5803)]) - await node_b.set(node_a_kad_peerinfo.xor_id, repr(node_a_kad_peerinfo)) + await node_b.set(node_a_kad_peerinfo.xor_id, node_a_kad_peerinfo.to_string()) router = KadmeliaPeerRouter(node_d) returned_info = await router.find_peer(ID(node_a_kad_peerinfo.peer_id_bytes)) - assert str(returned_info) == str(node_a_kad_peerinfo) + assert returned_info == node_a_kad_peerinfo diff --git a/tests/utils.py b/tests/utils.py index 4b4357db..6c1fa473 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -1,7 +1,9 @@ import multiaddr from libp2p import new_node +from libp2p.kademlia.network import KademliaServer from libp2p.peer.peerinfo import info_from_p2p_addr +from libp2p.routing.kademlia.kademlia_peer_router import KadmeliaPeerRouter from tests.constants import MAX_READ_LEN @@ -36,6 +38,29 @@ async def set_up_nodes_by_transport_opt(transport_opt_list): return tuple(nodes_list) +async def set_up_nodes_by_transport_and_disc_opt(transport_disc_opt_list): + nodes_list = [] + for transport_opt, disc_opt in transport_disc_opt_list: + node = await new_node(transport_opt=transport_opt, disc_opt=disc_opt) + await node.get_network().listen(multiaddr.Multiaddr(transport_opt[0])) + nodes_list.append(node) + return tuple(nodes_list) + + +async def set_up_routers(router_confs): + bootstrap_node = KademliaServer() + await bootstrap_node.listen(router_confs[0]) + + routers = [KadmeliaPeerRouter(bootstrap_node)] + for port in router_confs[1:]: + node = KademliaServer() + await node.listen(port) + + await node.bootstrap_node(("127.0.0.1", router_confs[0])) + routers.append(KadmeliaPeerRouter(node)) + return routers + + async def echo_stream_handler(stream): while True: read_string = (await stream.read(MAX_READ_LEN)).decode() From 65b5e7aeeaeebebdf6109629b13d4e9fe634c31f Mon Sep 17 00:00:00 2001 From: aratz-lasa Date: Tue, 15 Oct 2019 16:31:20 +0200 Subject: [PATCH 3/7] Update libp2p/peer/peerinfo.py Co-Authored-By: Kevin Mai-Husan Chia --- libp2p/peer/peerinfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index d744c0a5..385d3684 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -18,7 +18,7 @@ class PeerInfo: def to_string(self) -> str: return json.dumps([self.peer_id.to_string(), list(map(lambda a: str(a), self.addrs))]) - def __eq__(self, other): + def __eq__(self, other: Any) -> bool: return isinstance(other, PeerInfo) and self.peer_id == other.peer_id and self.addrs == other.addrs @classmethod From d1d91e4091d29ab89463d51034ef05882bc51fad Mon Sep 17 00:00:00 2001 From: "Aratz M. Lasa" Date: Tue, 15 Oct 2019 19:02:03 +0200 Subject: [PATCH 4/7] Refactored for 'lint' testenv --- Pipfile | 12 + Pipfile.lock | 508 ++++++++++++++++++ libp2p/__init__.py | 35 +- libp2p/host/basic_host.py | 5 +- libp2p/peer/peerinfo.py | 18 +- .../routing/kademlia/kademlia_peer_router.py | 4 +- tests/host/test_routed_host.py | 34 +- 7 files changed, 584 insertions(+), 32 deletions(-) create mode 100644 Pipfile create mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile new file mode 100644 index 00000000..d67db83f --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +libp2p = {editable = true,extras = ["dev"],path = "."} + +[requires] +python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 00000000..4e710971 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,508 @@ +{ + "_meta": { + "hash": { + "sha256": "cc8bcd521fb53a31146f2d86c74dd937263fbdc5d9a668883f9f98e98fb805ff" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "appdirs": { + "hashes": [ + "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", + "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" + ], + "version": "==1.4.3" + }, + "asn1crypto": { + "hashes": [ + "sha256:5abe83e773026162e4869f4ac16edf7554f661e8cc0bb6d2be3bc6915456731b", + "sha256:8f3f9470d4ba7aa53afb00278dc26aac22dc3a0d4ed1335fd772f034e094401e" + ], + "version": "==1.1.0" + }, + "atomicwrites": { + "hashes": [ + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" + ], + "version": "==1.3.0" + }, + "attrs": { + "hashes": [ + "sha256:ec20e7a4825331c1b5ebf261d111e16fa9612c1f7a5e1f884f12bd53a664dfd2", + "sha256:f913492e1663d3c36f502e5e9ba6cd13cf19d7fab50aa13239e420fef95e1396" + ], + "version": "==19.2.0" + }, + "base58": { + "hashes": [ + "sha256:1e42993c0628ed4f898c03b522b26af78fb05115732549b21a028bc4633d19ab", + "sha256:6aa0553e477478993588303c54659d15e3c17ae062508c854a8b752d07c716bd", + "sha256:9a793c599979c497800eb414c852b80866f28daaed5494703fc129592cc83e60" + ], + "version": "==1.0.3" + }, + "black": { + "hashes": [ + "sha256:09a9dcb7c46ed496a9850b76e4e825d6049ecd38b611f1224857a79bd985a8cf", + "sha256:68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c" + ], + "version": "==19.3b0" + }, + "cffi": { + "hashes": [ + "sha256:041c81822e9f84b1d9c401182e174996f0bae9991f33725d059b771744290774", + "sha256:046ef9a22f5d3eed06334d01b1e836977eeef500d9b78e9ef693f9380ad0b83d", + "sha256:066bc4c7895c91812eff46f4b1c285220947d4aa46fa0a2651ff85f2afae9c90", + "sha256:066c7ff148ae33040c01058662d6752fd73fbc8e64787229ea8498c7d7f4041b", + "sha256:2444d0c61f03dcd26dbf7600cf64354376ee579acad77aef459e34efcb438c63", + "sha256:300832850b8f7967e278870c5d51e3819b9aad8f0a2c8dbe39ab11f119237f45", + "sha256:34c77afe85b6b9e967bd8154e3855e847b70ca42043db6ad17f26899a3df1b25", + "sha256:46de5fa00f7ac09f020729148ff632819649b3e05a007d286242c4882f7b1dc3", + "sha256:4aa8ee7ba27c472d429b980c51e714a24f47ca296d53f4d7868075b175866f4b", + "sha256:4d0004eb4351e35ed950c14c11e734182591465a33e960a4ab5e8d4f04d72647", + "sha256:4e3d3f31a1e202b0f5a35ba3bc4eb41e2fc2b11c1eff38b362de710bcffb5016", + "sha256:50bec6d35e6b1aaeb17f7c4e2b9374ebf95a8975d57863546fa83e8d31bdb8c4", + "sha256:55cad9a6df1e2a1d62063f79d0881a414a906a6962bc160ac968cc03ed3efcfb", + "sha256:5662ad4e4e84f1eaa8efce5da695c5d2e229c563f9d5ce5b0113f71321bcf753", + "sha256:59b4dc008f98fc6ee2bb4fd7fc786a8d70000d058c2bbe2698275bc53a8d3fa7", + "sha256:73e1ffefe05e4ccd7bcea61af76f36077b914f92b76f95ccf00b0c1b9186f3f9", + "sha256:a1f0fd46eba2d71ce1589f7e50a9e2ffaeb739fb2c11e8192aa2b45d5f6cc41f", + "sha256:a2e85dc204556657661051ff4bab75a84e968669765c8a2cd425918699c3d0e8", + "sha256:a5457d47dfff24882a21492e5815f891c0ca35fefae8aa742c6c263dac16ef1f", + "sha256:a8dccd61d52a8dae4a825cdbb7735da530179fea472903eb871a5513b5abbfdc", + "sha256:ae61af521ed676cf16ae94f30fe202781a38d7178b6b4ab622e4eec8cefaff42", + "sha256:b012a5edb48288f77a63dba0840c92d0504aa215612da4541b7b42d849bc83a3", + "sha256:d2c5cfa536227f57f97c92ac30c8109688ace8fa4ac086d19d0af47d134e2909", + "sha256:d42b5796e20aacc9d15e66befb7a345454eef794fdb0737d1af593447c6c8f45", + "sha256:dee54f5d30d775f525894d67b1495625dd9322945e7fee00731952e0368ff42d", + "sha256:e070535507bd6aa07124258171be2ee8dfc19119c28ca94c9dfb7efd23564512", + "sha256:e1ff2748c84d97b065cc95429814cdba39bcbd77c9c85c89344b317dc0d9cbff", + "sha256:ed851c75d1e0e043cbf5ca9a8e1b13c4c90f3fbd863dacb01c0808e2b5204201" + ], + "version": "==1.12.3" + }, + "click": { + "hashes": [ + "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", + "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + ], + "version": "==7.0" + }, + "coincurve": { + "hashes": [ + "sha256:03c807bac341e60fc79171ca38476fb4e44c1b52d7c2682bc3b8021f278961c1", + "sha256:0fa46ea93be6b937e996ebc25b7be2a87f7309df7b6d3c2ba0b6227a9a545582", + "sha256:2066656ef6c872e50937450b253ea242e8d8f7f8c564e1a6c79fd849943d1d02", + "sha256:3819be894cd47b86aea47eba01f183db55ea6f0b3f6758bd30eeb51a13acb0d7", + "sha256:3a019085202d635875ca516d549c927de8483e035651370b0b3a60728aaed567", + "sha256:4e6eda6debad80d7bbc4c4453f9cab72de462987eb66b941a25af51e2fe2cbda", + "sha256:56821ea2affad77cea295bda3794f23cfdcc8824c7e7bf19fb2c752104f3d508", + "sha256:7366f624b4f4554a8d8bbb1bc2d94b62570f2558f133bc77e7c0ff7328d022b6", + "sha256:7c3b4ba9473f8cf8ede80f707b5cb2849a3e4cf1fbd36c7ff022c70cd50ed516", + "sha256:ca340d05e0618f27cb8e55c8d46835b912b1a3e19dc55377be53859f3d89393f", + "sha256:d7c85c173d5911c1813168ab7f68d49b68fa487cb79fd8b5c727867cbf4ae8c3", + "sha256:d90ad29dabd62cc38a040f34309a8aea106951360321e2eed8d4c5474269bdbd", + "sha256:df4a73ff310821d9cbf9ac761c836c3f29667842a86eec8d39265817ab263bf2", + "sha256:f0e89d422fa50c86a08e1fcef05a36d41806260c4a9b5e0a44b2aa8eadf353e5", + "sha256:f589a91eac6b239eaab49e2d58f60022e350c8d6172730a35f9332cf5ed081f5", + "sha256:fa1c3c6325b904e46349dc81d820124c556baf998c859ceb7bb9abd33da68fa1", + "sha256:fb156cff2235517bf213dde46c58eec5ebe84c5ad8414823d717590e7a7e8e90" + ], + "version": "==10.0.0" + }, + "entrypoints": { + "hashes": [ + "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", + "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" + ], + "version": "==0.3" + }, + "factory-boy": { + "hashes": [ + "sha256:728df59b372c9588b83153facf26d3d28947fc750e8e3c95cefa9bed0e6394ee", + "sha256:faf48d608a1735f0d0a3c9cbf536d64f9132b547dae7ba452c4d99a79e84a370" + ], + "version": "==2.12.0" + }, + "faker": { + "hashes": [ + "sha256:45cc9cca3de8beba5a2da3bd82a6e5544f53da1a702645c8485f682366c15026", + "sha256:a6459ff518d1fc6ee2238a7209e6c899517872c7e1115510279033ffe6fe8ef3" + ], + "version": "==2.0.2" + }, + "fastecdsa": { + "hashes": [ + "sha256:12e952e2a70e2a896083f4cf304b4653f108ead4aac9c63ac8333343182fceac", + "sha256:9d253175f74a96b7aa9c4ce266f96d1c663ca9f12a7e997c9cbe9dc58ea06f0e", + "sha256:b40816ebc663d88b312c503533432bfa6bf7dc50133682d02ecc4ac158d79d5c" + ], + "version": "==1.7.4" + }, + "filelock": { + "hashes": [ + "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", + "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" + ], + "version": "==3.0.12" + }, + "flake8": { + "hashes": [ + "sha256:19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", + "sha256:8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696" + ], + "version": "==3.7.8" + }, + "importlib-metadata": { + "hashes": [ + "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", + "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" + ], + "markers": "python_version < '3.8'", + "version": "==0.23" + }, + "isort": { + "hashes": [ + "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", + "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" + ], + "version": "==4.3.21" + }, + "libp2p": { + "editable": true, + "extras": [ + "dev" + ], + "path": "." + }, + "lru-dict": { + "hashes": [ + "sha256:365457660e3d05b76f1aba3e0f7fedbfcd6528e97c5115a351ddd0db488354cc" + ], + "version": "==1.1.6" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "more-itertools": { + "hashes": [ + "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", + "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" + ], + "markers": "python_version > '2.7'", + "version": "==7.2.0" + }, + "multiaddr": { + "hashes": [ + "sha256:2faec68b479945fe6b48dd2dc1f8bcccf939aa148836e3a1ab806d6c75db1238", + "sha256:cb7f4091a2d1fa361fe2fd237efcd963abf650efe3af1414c4e9360a34947573" + ], + "version": "==0.0.8" + }, + "mypy": { + "hashes": [ + "sha256:1d98fd818ad3128a5408148c9e4a5edce6ed6b58cc314283e631dd5d9216527b", + "sha256:22ee018e8fc212fe601aba65d3699689dd29a26410ef0d2cc1943de7bec7e3ac", + "sha256:3a24f80776edc706ec8d05329e854d5b9e464cd332e25cde10c8da2da0a0db6c", + "sha256:42a78944e80770f21609f504ca6c8173f7768043205b5ac51c9144e057dcf879", + "sha256:4b2b20106973548975f0c0b1112eceb4d77ed0cafe0a231a1318f3b3a22fc795", + "sha256:591a9625b4d285f3ba69f541c84c0ad9e7bffa7794da3fa0585ef13cf95cb021", + "sha256:5b4b70da3d8bae73b908a90bb2c387b977e59d484d22c604a2131f6f4397c1a3", + "sha256:84edda1ffeda0941b2ab38ecf49302326df79947fa33d98cdcfbf8ca9cf0bb23", + "sha256:b2b83d29babd61b876ae375786960a5374bba0e4aba3c293328ca6ca5dc448dd", + "sha256:cc4502f84c37223a1a5ab700649b5ab1b5e4d2bf2d426907161f20672a21930b", + "sha256:e29e24dd6e7f39f200a5bb55dcaa645d38a397dd5a6674f6042ef02df5795046" + ], + "version": "==0.730" + }, + "mypy-extensions": { + "hashes": [ + "sha256:a161e3b917053de87dbe469987e173e49fb454eca10ef28b48b384538cc11458" + ], + "version": "==0.4.2" + }, + "mypy-protobuf": { + "hashes": [ + "sha256:69f37e166ace422ef8c8266ff73be5384968152e1d7769f3d866d0e923c354ba", + "sha256:a10bb9f24cc2c1f5077a5e64fc5e22b7f7e230a1a399a34cebc57c80a8a532e6" + ], + "version": "==1.15" + }, + "netaddr": { + "hashes": [ + "sha256:38aeec7cdd035081d3a4c306394b19d677623bf76fa0913f6695127c7753aefd", + "sha256:56b3558bd71f3f6999e4c52e349f38660e54a7a8a9943335f73dfc96883e08ca" + ], + "version": "==0.7.19" + }, + "packaging": { + "hashes": [ + "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", + "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + ], + "version": "==19.2" + }, + "pluggy": { + "hashes": [ + "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", + "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" + ], + "version": "==0.13.0" + }, + "protobuf": { + "hashes": [ + "sha256:05c36022fef3c7d3562ac22402965c0c2b9fe8421f459bb377323598996e407f", + "sha256:139b7eadcca0a861d60b523cb37d9475505e0dfb07972436b15407c2b968d87e", + "sha256:15f683006cb77fb849b1f561e509b03dd2b7dcc749086b8dd1831090d0ba4740", + "sha256:2ad566b7b7cdd8717c7af1825e19f09e8fef2787b77fcb979588944657679604", + "sha256:35cfcf97642ef62108e10a9431c77733ec7eaab8e32fe4653de20403429907cb", + "sha256:387822859ecdd012fdc25ec879f7f487da6e1d5b1ae6115e227e6be208836f71", + "sha256:4df14cbe1e7134afcfdbb9f058949e31c466de27d9b2f7fb4da9e0b67231b538", + "sha256:586c4ca37a7146d4822c700059f150ac3445ce0aef6f3ea258640838bb892dc2", + "sha256:58b11e530e954d29ab3180c48dc558a409f705bf16739fd4e0d3e07924ad7add", + "sha256:63c8c98ccb8c95f41c18fb829aeeab21c6249adee4ed75354125bdc44488f30e", + "sha256:72edcbacd0c73eef507d2ff1af99a6c27df18e66a3ff4351e401182e4de62b03", + "sha256:83dc8a561b3b954fd7002c690bb83278b8d1742a1e28abba9aaef28b0c8b437d", + "sha256:913171ecc84c2726b86574e40549a0ea619d569657c5a5ff782a3be7d81401a5", + "sha256:aabb7c741d3416671c3e6fe7c52970a226e6a8274417a97d7d795f953fadef36", + "sha256:b3452bbda12b1cbe2187d416779de07b2ab4c497d83a050e43c344778763721d", + "sha256:c5d5b8d4a9212338297fa1fa44589f69b470c0ba1d38168b432d577176b386a8", + "sha256:d86ee389c2c4fc3cebabb8ce83a8e97b6b3b5dc727b7419c1ccdc7b6e545a233", + "sha256:f2db8c754de788ab8be5e108e1e967c774c0942342b4f8aaaf14063889a6cfdc" + ], + "version": "==3.9.0" + }, + "py": { + "hashes": [ + "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", + "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + ], + "version": "==1.8.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" + ], + "version": "==2.5.0" + }, + "pycparser": { + "hashes": [ + "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" + ], + "version": "==2.19" + }, + "pycryptodome": { + "hashes": [ + "sha256:023c294367d7189ae224fb61bc8d49a2347704087c1c78dbd5ab114dd5b97761", + "sha256:0f29e1238ad3b6b6e2acd7ea1d8e8b382978a56503f2c48b67d5dc144d143cb0", + "sha256:18f376698e3ddcb1d3b312512ca78c9eed132e68ac6d0bf2e72452dfe213e96f", + "sha256:1de815b847982f909dc2e5e2ca641b85cde80d95cc7e6a359c03d4b42cd21568", + "sha256:1ff619b8e4050799ca5ca0ffdf8eb0dbccba6997997866755f37e6aa7dde23fe", + "sha256:233a04bb7bdd4b07e14d61d5166150942d872802daa4f049d49a453fe0659e94", + "sha256:33c07e1e36ec84524b49f99f11804d5e4d2188c643e84d914cb1e0a277ed3c79", + "sha256:3701822a085dbebf678bfbdfbd6ebd92ffa80d5a544c9979984bf16a67c9790b", + "sha256:3f8e6851c0a45429f9b86c1597d3b831b0cff140b3e170a891fce55ef8dac2bb", + "sha256:4f6cdddf1fe72e7f173e9734aa19b94cbd046b61a8559d650ff222e36021d5c1", + "sha256:52d20b22c5b1fc952b4c686b99a6c55c3b0b0a673bec30570f156a72198f66ff", + "sha256:5452b534fecf8bf57cf9106d00877f5f4ab7264e7a5e1f5ea8d15b04517d1255", + "sha256:5a7a9a4a7f8f0990fa97fee71c7f7e0c412925c515cfc6d4996961e92c9be8e5", + "sha256:600bf9dd5fbed0feee83950e2a8baacaa1f38b56c237fff270d31e47f8da9e52", + "sha256:6840c9881e528224ebf72b3f73b3d11baf399e265106c9f4d9bae4f09615a93a", + "sha256:71b041d43fe13004abc36ca720ac64ea489ee8a3407a25116481d0faf9d62494", + "sha256:7252498b427c421e306473ed344e58235eedd95c15fec2e1b33d333aefa1ea10", + "sha256:8d2135c941d38f241e0e62dbdfc1ca5d9240527e61316126797f50b6f3e49825", + "sha256:a0962aea03933b99cf391c3e10dfef32f77915d5553464264cfbc6711f31d254", + "sha256:a117047a220b3911d425affcd1cbc97a1af7ea7eb5d985d9964d42b4f0558489", + "sha256:a35a5c588248ba00eb976a8554211e584a55de286783bc69b12bdd7954052b4a", + "sha256:c1a4f3f651471b9bf60b0d98fa8a994b8a73ff8ab4edc691e23243c853aaff9f", + "sha256:c419943306756ddd1a1997120bb073733bc223365909c68185106d5521cbc0ef", + "sha256:c453ad968b67d66448543420ec39770c30bd16d986058255f058ab87c4f6cc1f", + "sha256:d2d78644655629c7d1b9bf28e479d29facc0949d9ff095103ca9c2314b329ee0", + "sha256:d7be60dc2126ee350ac7191549f5ab05c2dd76a5d5a3022249f395a401c6ea37", + "sha256:dbeb08ad850056747aa7d5f33273b7ce0b9a77910604a1be7b7a6f2ef076213f", + "sha256:f02382dc1bf91fb7123f2a3851fb1b526c871fa9359f387f2bcc847efc74ae52" + ], + "version": "==3.9.0" + }, + "pyflakes": { + "hashes": [ + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" + ], + "version": "==2.1.1" + }, + "pymultihash": { + "hashes": [ + "sha256:49c75a1ae9ecc6d22d259064d4597b3685da3f0258f4ded632e03a3a79af215b", + "sha256:f7fa840b24bd6acbd6b073fcd330f10e15619387297babf1dd13ca4dae6e8209" + ], + "version": "==0.8.2" + }, + "pynacl": { + "hashes": [ + "sha256:05c26f93964373fc0abe332676cb6735f0ecad27711035b9472751faa8521255", + "sha256:0c6100edd16fefd1557da078c7a31e7b7d7a52ce39fdca2bec29d4f7b6e7600c", + "sha256:0d0a8171a68edf51add1e73d2159c4bc19fc0718e79dec51166e940856c2f28e", + "sha256:1c780712b206317a746ace34c209b8c29dbfd841dfbc02aa27f2084dd3db77ae", + "sha256:2424c8b9f41aa65bbdbd7a64e73a7450ebb4aa9ddedc6a081e7afcc4c97f7621", + "sha256:2d23c04e8d709444220557ae48ed01f3f1086439f12dbf11976e849a4926db56", + "sha256:30f36a9c70450c7878053fa1344aca0145fd47d845270b43a7ee9192a051bf39", + "sha256:37aa336a317209f1bb099ad177fef0da45be36a2aa664507c5d72015f956c310", + "sha256:4943decfc5b905748f0756fdd99d4f9498d7064815c4cf3643820c9028b711d1", + "sha256:57ef38a65056e7800859e5ba9e6091053cd06e1038983016effaffe0efcd594a", + "sha256:5bd61e9b44c543016ce1f6aef48606280e45f892a928ca7068fba30021e9b786", + "sha256:6482d3017a0c0327a49dddc8bd1074cc730d45db2ccb09c3bac1f8f32d1eb61b", + "sha256:7d3ce02c0784b7cbcc771a2da6ea51f87e8716004512493a2b69016326301c3b", + "sha256:a14e499c0f5955dcc3991f785f3f8e2130ed504fa3a7f44009ff458ad6bdd17f", + "sha256:a39f54ccbcd2757d1d63b0ec00a00980c0b382c62865b61a505163943624ab20", + "sha256:aabb0c5232910a20eec8563503c153a8e78bbf5459490c49ab31f6adf3f3a415", + "sha256:bd4ecb473a96ad0f90c20acba4f0bf0df91a4e03a1f4dd6a4bdc9ca75aa3a715", + "sha256:e2da3c13307eac601f3de04887624939aca8ee3c9488a0bb0eca4fb9401fc6b1", + "sha256:f67814c38162f4deb31f68d590771a29d5ae3b1bd64b75cf232308e5c74777e0" + ], + "version": "==1.3.0" + }, + "pyparsing": { + "hashes": [ + "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", + "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" + ], + "version": "==2.4.2" + }, + "pytest": { + "hashes": [ + "sha256:5d0d20a9a66e39b5845ab14f8989f3463a7aa973700e6cdf02db69da9821e738", + "sha256:692d9351353ef709c1126266579edd4fd469dcf6b5f4f583050f72161d6f3592" + ], + "version": "==4.6.6" + }, + "pytest-asyncio": { + "hashes": [ + "sha256:9fac5100fd716cbecf6ef89233e8590a4ad61d729d1732e0a96b84182df1daaf", + "sha256:d734718e25cfc32d2bf78d346e99d33724deeba774cc4afdf491530c6184b63b" + ], + "version": "==0.10.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", + "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + ], + "version": "==2.8.0" + }, + "rpcudp": { + "hashes": [ + "sha256:d4f83e27aa242eab142c4be377b5d4af15f2e68cd47be49e009093932313af81", + "sha256:e0100381cd2ee541abdb26001661c863094e25470234e994f080e347d6e68cb6" + ], + "version": "==3.0.0" + }, + "six": { + "hashes": [ + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + ], + "version": "==1.12.0" + }, + "text-unidecode": { + "hashes": [ + "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", + "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93" + ], + "version": "==1.3" + }, + "toml": { + "hashes": [ + "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", + "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" + ], + "version": "==0.10.0" + }, + "tox": { + "hashes": [ + "sha256:0bc216b6a2e6afe764476b4a07edf2c1dab99ed82bb146a1130b2e828f5bff5e", + "sha256:c4f6b319c20ba4913dbfe71ebfd14ff95d1853c4231493608182f66e566ecfe1" + ], + "version": "==3.14.0" + }, + "typed-ast": { + "hashes": [ + "sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", + "sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", + "sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", + "sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", + "sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", + "sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", + "sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", + "sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", + "sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", + "sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", + "sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", + "sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", + "sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", + "sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", + "sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12" + ], + "version": "==1.4.0" + }, + "typing-extensions": { + "hashes": [ + "sha256:2ed632b30bb54fc3941c382decfd0ee4148f5c591651c9272473fea2c6397d95", + "sha256:b1edbbf0652660e32ae780ac9433f4231e7339c7f9a8057d0f042fcbcea49b87", + "sha256:d8179012ec2c620d3791ca6fe2bf7979d979acdbef1fca0bc56b37411db682ed" + ], + "version": "==3.7.4" + }, + "u-msgpack-python": { + "hashes": [ + "sha256:09c85a8af77376034396681e76bf30c249a4fd8e5ebb239f8a468d3655f210d0", + "sha256:d9a5634753c433676baa08a1854896b43e94d50c42da9cbd505a0d1dbd367a5a" + ], + "version": "==2.5.2" + }, + "varint": { + "hashes": [ + "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5" + ], + "version": "==1.0.2" + }, + "virtualenv": { + "hashes": [ + "sha256:680af46846662bb38c5504b78bad9ed9e4f3ba2d54f54ba42494fdf94337fe30", + "sha256:f78d81b62d3147396ac33fc9d77579ddc42cc2a98dd9ea38886f616b33bc7fb2" + ], + "version": "==16.7.5" + }, + "wcwidth": { + "hashes": [ + "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + ], + "version": "==0.1.7" + }, + "zipp": { + "hashes": [ + "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", + "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" + ], + "version": "==0.6.0" + } + }, + "develop": {} +} diff --git a/libp2p/__init__.py b/libp2p/__init__.py index b0571881..9bea140a 100644 --- a/libp2p/__init__.py +++ b/libp2p/__init__.py @@ -4,6 +4,7 @@ from typing import Sequence from libp2p.crypto.keys import KeyPair from libp2p.crypto.rsa import create_new_key_pair from libp2p.host.basic_host import BasicHost +from libp2p.host.host_interface import IHost from libp2p.host.routed_host import RoutedHost from libp2p.kademlia.network import KademliaServer from libp2p.kademlia.storage import IStorage @@ -47,7 +48,7 @@ def generate_peer_id_from(key_pair: KeyPair) -> ID: def initialize_default_kademlia_router( - ksize: int = 20, alpha: int = 3, id_opt: ID = None, storage: IStorage = None + ksize: int = 20, alpha: int = 3, id_opt: ID = None, storage: IStorage = None ) -> KadmeliaPeerRouter: """ initialize kadmelia router when no kademlia router is passed in @@ -71,13 +72,13 @@ def initialize_default_kademlia_router( def initialize_default_swarm( - key_pair: KeyPair, - id_opt: ID = None, - transport_opt: Sequence[str] = None, - muxer_opt: TMuxerOptions = None, - sec_opt: TSecurityOptions = None, - peerstore_opt: IPeerStore = None, - disc_opt: IPeerRouting = None, + key_pair: KeyPair, + id_opt: ID = None, + transport_opt: Sequence[str] = None, + muxer_opt: TMuxerOptions = None, + sec_opt: TSecurityOptions = None, + peerstore_opt: IPeerStore = None, + disc_opt: IPeerRouting = None, ) -> Swarm: """ initialize swarm when no swarm is passed in @@ -111,14 +112,14 @@ def initialize_default_swarm( async def new_node( - key_pair: KeyPair = None, - swarm_opt: INetwork = None, - transport_opt: Sequence[str] = None, - muxer_opt: TMuxerOptions = None, - sec_opt: TSecurityOptions = None, - peerstore_opt: IPeerStore = None, - disc_opt: IPeerRouting = None, -) -> BasicHost: + key_pair: KeyPair = None, + swarm_opt: INetwork = None, + transport_opt: Sequence[str] = None, + muxer_opt: TMuxerOptions = None, + sec_opt: TSecurityOptions = None, + peerstore_opt: IPeerStore = None, + disc_opt: IPeerRouting = None, +) -> IHost: """ create new libp2p node :param key_pair: key pair for deriving an identity @@ -150,12 +151,12 @@ async def new_node( # TODO enable support for other host type # TODO routing unimplemented + host: IHost # If not explicitly typed, MyPy raises error if disc_opt: host = RoutedHost(swarm_opt, disc_opt) else: host = BasicHost(swarm_opt) - # Kick off cleanup job asyncio.ensure_future(cleanup_done_tasks()) diff --git a/libp2p/host/basic_host.py b/libp2p/host/basic_host.py index 95a21111..b26dd3c7 100644 --- a/libp2p/host/basic_host.py +++ b/libp2p/host/basic_host.py @@ -14,6 +14,7 @@ from libp2p.protocol_muxer.multiselect import Multiselect from libp2p.protocol_muxer.multiselect_client import MultiselectClient from libp2p.protocol_muxer.multiselect_communicator import MultiselectCommunicator from libp2p.typing import StreamHandlerFn, TProtocol + from .host_interface import IHost # Upon host creation, host takes in options, @@ -83,7 +84,7 @@ class BasicHost(IHost): return addrs def set_stream_handler( - self, protocol_id: TProtocol, stream_handler: StreamHandlerFn + self, protocol_id: TProtocol, stream_handler: StreamHandlerFn ) -> None: """ set stream handler for given `protocol_id` @@ -93,7 +94,7 @@ class BasicHost(IHost): self.multiselect.add_handler(protocol_id, stream_handler) async def new_stream( - self, peer_id: ID, protocol_ids: Sequence[TProtocol] + self, peer_id: ID, protocol_ids: Sequence[TProtocol] ) -> INetStream: """ :param peer_id: peer_id that host is connecting diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index 385d3684..0ffd04a5 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -1,5 +1,5 @@ import json -from typing import List, Sequence +from typing import Any, List, Sequence import multiaddr @@ -7,7 +7,6 @@ from .id import ID class PeerInfo: - peer_id: ID addrs: List[multiaddr.Multiaddr] @@ -16,15 +15,24 @@ class PeerInfo: self.addrs = list(addrs) def to_string(self) -> str: - return json.dumps([self.peer_id.to_string(), list(map(lambda a: str(a), self.addrs))]) + return json.dumps( + [self.peer_id.to_string(), list(map(lambda a: str(a), self.addrs))] + ) def __eq__(self, other: Any) -> bool: - return isinstance(other, PeerInfo) and self.peer_id == other.peer_id and self.addrs == other.addrs + return ( + isinstance(other, PeerInfo) + and self.peer_id == other.peer_id + and self.addrs == other.addrs + ) @classmethod def info_from_string(cls, info: str) -> "PeerInfo": peer_id, raw_addrs = json.loads(info) - return PeerInfo(ID.from_base58(peer_id), list(map(lambda a: multiaddr.Multiaddr(a), raw_addrs))) + return PeerInfo( + ID.from_base58(peer_id), + list(map(lambda a: multiaddr.Multiaddr(a), raw_addrs)), + ) def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: diff --git a/libp2p/routing/kademlia/kademlia_peer_router.py b/libp2p/routing/kademlia/kademlia_peer_router.py index 9710d704..79c66b49 100644 --- a/libp2p/routing/kademlia/kademlia_peer_router.py +++ b/libp2p/routing/kademlia/kademlia_peer_router.py @@ -20,4 +20,6 @@ class KadmeliaPeerRouter(IPeerRouting): xor_id = peer_id.xor_id # ignore type for kad value = await self.server.get(xor_id) # type: ignore - return PeerInfo.info_from_string(value) if value else None # TODO: should raise error if None? + return ( + PeerInfo.info_from_string(value) if value else None + ) # TODO: should raise error if None? diff --git a/tests/host/test_routed_host.py b/tests/host/test_routed_host.py index bcc53ca6..e19392f5 100644 --- a/tests/host/test_routed_host.py +++ b/tests/host/test_routed_host.py @@ -4,7 +4,11 @@ import pytest from libp2p.host.exceptions import ConnectionFailure from libp2p.peer.peerinfo import PeerInfo -from tests.utils import set_up_routers, set_up_nodes_by_transport_opt, set_up_nodes_by_transport_and_disc_opt +from tests.utils import ( + set_up_nodes_by_transport_and_disc_opt, + set_up_nodes_by_transport_opt, + set_up_routers, +) @pytest.mark.asyncio @@ -12,11 +16,19 @@ async def test_host_routing_success(): routers = await set_up_routers([5678, 5679]) transports = [["/ip4/127.0.0.1/tcp/0"], ["/ip4/127.0.0.1/tcp/0"]] transport_disc_opt_list = zip(transports, routers) - (host_a, host_b) = await set_up_nodes_by_transport_and_disc_opt(transport_disc_opt_list) + (host_a, host_b) = await set_up_nodes_by_transport_and_disc_opt( + transport_disc_opt_list + ) # Set routing info - await routers[0].server.set(host_a.get_id().xor_id, PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string()) - await routers[1].server.set(host_b.get_id().xor_id, PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string()) + await routers[0].server.set( + host_a.get_id().xor_id, + PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string(), + ) + await routers[1].server.set( + host_b.get_id().xor_id, + PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string(), + ) # forces to use routing as no addrs are provided await host_a.connect(PeerInfo(host_b.get_id(), [])) @@ -33,13 +45,21 @@ async def test_host_routing_fail(): routers = await set_up_routers([5678, 5679]) transports = [["/ip4/127.0.0.1/tcp/0"], ["/ip4/127.0.0.1/tcp/0"]] transport_disc_opt_list = zip(transports, routers) - (host_a, host_b) = await set_up_nodes_by_transport_and_disc_opt(transport_disc_opt_list) + (host_a, host_b) = await set_up_nodes_by_transport_and_disc_opt( + transport_disc_opt_list + ) host_c = (await set_up_nodes_by_transport_opt([["/ip4/127.0.0.1/tcp/0"]]))[0] # Set routing info - await routers[0].server.set(host_a.get_id().xor_id, PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string()) - await routers[1].server.set(host_b.get_id().xor_id, PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string()) + await routers[0].server.set( + host_a.get_id().xor_id, + PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string(), + ) + await routers[1].server.set( + host_b.get_id().xor_id, + PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string(), + ) # routing fails because host_c does not use routing with pytest.raises(ConnectionFailure): From 70ea4714915830f09f88482d7a3ca7282fe39ce6 Mon Sep 17 00:00:00 2001 From: "Aratz M. Lasa" Date: Tue, 15 Oct 2019 19:11:11 +0200 Subject: [PATCH 5/7] Blacked --- libp2p/__init__.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/libp2p/__init__.py b/libp2p/__init__.py index 9bea140a..24cff711 100644 --- a/libp2p/__init__.py +++ b/libp2p/__init__.py @@ -48,7 +48,7 @@ def generate_peer_id_from(key_pair: KeyPair) -> ID: def initialize_default_kademlia_router( - ksize: int = 20, alpha: int = 3, id_opt: ID = None, storage: IStorage = None + ksize: int = 20, alpha: int = 3, id_opt: ID = None, storage: IStorage = None ) -> KadmeliaPeerRouter: """ initialize kadmelia router when no kademlia router is passed in @@ -72,13 +72,13 @@ def initialize_default_kademlia_router( def initialize_default_swarm( - key_pair: KeyPair, - id_opt: ID = None, - transport_opt: Sequence[str] = None, - muxer_opt: TMuxerOptions = None, - sec_opt: TSecurityOptions = None, - peerstore_opt: IPeerStore = None, - disc_opt: IPeerRouting = None, + key_pair: KeyPair, + id_opt: ID = None, + transport_opt: Sequence[str] = None, + muxer_opt: TMuxerOptions = None, + sec_opt: TSecurityOptions = None, + peerstore_opt: IPeerStore = None, + disc_opt: IPeerRouting = None, ) -> Swarm: """ initialize swarm when no swarm is passed in @@ -112,13 +112,13 @@ def initialize_default_swarm( async def new_node( - key_pair: KeyPair = None, - swarm_opt: INetwork = None, - transport_opt: Sequence[str] = None, - muxer_opt: TMuxerOptions = None, - sec_opt: TSecurityOptions = None, - peerstore_opt: IPeerStore = None, - disc_opt: IPeerRouting = None, + key_pair: KeyPair = None, + swarm_opt: INetwork = None, + transport_opt: Sequence[str] = None, + muxer_opt: TMuxerOptions = None, + sec_opt: TSecurityOptions = None, + peerstore_opt: IPeerStore = None, + disc_opt: IPeerRouting = None, ) -> IHost: """ create new libp2p node From fa1637850e1134dbaa726ce9702400fb0d7446de Mon Sep 17 00:00:00 2001 From: "Aratz M. Lasa" Date: Tue, 15 Oct 2019 19:27:04 +0200 Subject: [PATCH 6/7] Removed pipenv Pipfiles --- Pipfile | 12 -- Pipfile.lock | 508 --------------------------------------------------- 2 files changed, 520 deletions(-) delete mode 100644 Pipfile delete mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile deleted file mode 100644 index d67db83f..00000000 --- a/Pipfile +++ /dev/null @@ -1,12 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple" -verify_ssl = true - -[dev-packages] - -[packages] -libp2p = {editable = true,extras = ["dev"],path = "."} - -[requires] -python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index 4e710971..00000000 --- a/Pipfile.lock +++ /dev/null @@ -1,508 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "cc8bcd521fb53a31146f2d86c74dd937263fbdc5d9a668883f9f98e98fb805ff" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.7" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "appdirs": { - "hashes": [ - "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", - "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" - ], - "version": "==1.4.3" - }, - "asn1crypto": { - "hashes": [ - "sha256:5abe83e773026162e4869f4ac16edf7554f661e8cc0bb6d2be3bc6915456731b", - "sha256:8f3f9470d4ba7aa53afb00278dc26aac22dc3a0d4ed1335fd772f034e094401e" - ], - "version": "==1.1.0" - }, - "atomicwrites": { - "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" - ], - "version": "==1.3.0" - }, - "attrs": { - "hashes": [ - "sha256:ec20e7a4825331c1b5ebf261d111e16fa9612c1f7a5e1f884f12bd53a664dfd2", - "sha256:f913492e1663d3c36f502e5e9ba6cd13cf19d7fab50aa13239e420fef95e1396" - ], - "version": "==19.2.0" - }, - "base58": { - "hashes": [ - "sha256:1e42993c0628ed4f898c03b522b26af78fb05115732549b21a028bc4633d19ab", - "sha256:6aa0553e477478993588303c54659d15e3c17ae062508c854a8b752d07c716bd", - "sha256:9a793c599979c497800eb414c852b80866f28daaed5494703fc129592cc83e60" - ], - "version": "==1.0.3" - }, - "black": { - "hashes": [ - "sha256:09a9dcb7c46ed496a9850b76e4e825d6049ecd38b611f1224857a79bd985a8cf", - "sha256:68950ffd4d9169716bcb8719a56c07a2f4485354fec061cdd5910aa07369731c" - ], - "version": "==19.3b0" - }, - "cffi": { - "hashes": [ - "sha256:041c81822e9f84b1d9c401182e174996f0bae9991f33725d059b771744290774", - "sha256:046ef9a22f5d3eed06334d01b1e836977eeef500d9b78e9ef693f9380ad0b83d", - "sha256:066bc4c7895c91812eff46f4b1c285220947d4aa46fa0a2651ff85f2afae9c90", - "sha256:066c7ff148ae33040c01058662d6752fd73fbc8e64787229ea8498c7d7f4041b", - "sha256:2444d0c61f03dcd26dbf7600cf64354376ee579acad77aef459e34efcb438c63", - "sha256:300832850b8f7967e278870c5d51e3819b9aad8f0a2c8dbe39ab11f119237f45", - "sha256:34c77afe85b6b9e967bd8154e3855e847b70ca42043db6ad17f26899a3df1b25", - "sha256:46de5fa00f7ac09f020729148ff632819649b3e05a007d286242c4882f7b1dc3", - "sha256:4aa8ee7ba27c472d429b980c51e714a24f47ca296d53f4d7868075b175866f4b", - "sha256:4d0004eb4351e35ed950c14c11e734182591465a33e960a4ab5e8d4f04d72647", - "sha256:4e3d3f31a1e202b0f5a35ba3bc4eb41e2fc2b11c1eff38b362de710bcffb5016", - "sha256:50bec6d35e6b1aaeb17f7c4e2b9374ebf95a8975d57863546fa83e8d31bdb8c4", - "sha256:55cad9a6df1e2a1d62063f79d0881a414a906a6962bc160ac968cc03ed3efcfb", - "sha256:5662ad4e4e84f1eaa8efce5da695c5d2e229c563f9d5ce5b0113f71321bcf753", - "sha256:59b4dc008f98fc6ee2bb4fd7fc786a8d70000d058c2bbe2698275bc53a8d3fa7", - "sha256:73e1ffefe05e4ccd7bcea61af76f36077b914f92b76f95ccf00b0c1b9186f3f9", - "sha256:a1f0fd46eba2d71ce1589f7e50a9e2ffaeb739fb2c11e8192aa2b45d5f6cc41f", - "sha256:a2e85dc204556657661051ff4bab75a84e968669765c8a2cd425918699c3d0e8", - "sha256:a5457d47dfff24882a21492e5815f891c0ca35fefae8aa742c6c263dac16ef1f", - "sha256:a8dccd61d52a8dae4a825cdbb7735da530179fea472903eb871a5513b5abbfdc", - "sha256:ae61af521ed676cf16ae94f30fe202781a38d7178b6b4ab622e4eec8cefaff42", - "sha256:b012a5edb48288f77a63dba0840c92d0504aa215612da4541b7b42d849bc83a3", - "sha256:d2c5cfa536227f57f97c92ac30c8109688ace8fa4ac086d19d0af47d134e2909", - "sha256:d42b5796e20aacc9d15e66befb7a345454eef794fdb0737d1af593447c6c8f45", - "sha256:dee54f5d30d775f525894d67b1495625dd9322945e7fee00731952e0368ff42d", - "sha256:e070535507bd6aa07124258171be2ee8dfc19119c28ca94c9dfb7efd23564512", - "sha256:e1ff2748c84d97b065cc95429814cdba39bcbd77c9c85c89344b317dc0d9cbff", - "sha256:ed851c75d1e0e043cbf5ca9a8e1b13c4c90f3fbd863dacb01c0808e2b5204201" - ], - "version": "==1.12.3" - }, - "click": { - "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" - ], - "version": "==7.0" - }, - "coincurve": { - "hashes": [ - "sha256:03c807bac341e60fc79171ca38476fb4e44c1b52d7c2682bc3b8021f278961c1", - "sha256:0fa46ea93be6b937e996ebc25b7be2a87f7309df7b6d3c2ba0b6227a9a545582", - "sha256:2066656ef6c872e50937450b253ea242e8d8f7f8c564e1a6c79fd849943d1d02", - "sha256:3819be894cd47b86aea47eba01f183db55ea6f0b3f6758bd30eeb51a13acb0d7", - "sha256:3a019085202d635875ca516d549c927de8483e035651370b0b3a60728aaed567", - "sha256:4e6eda6debad80d7bbc4c4453f9cab72de462987eb66b941a25af51e2fe2cbda", - "sha256:56821ea2affad77cea295bda3794f23cfdcc8824c7e7bf19fb2c752104f3d508", - "sha256:7366f624b4f4554a8d8bbb1bc2d94b62570f2558f133bc77e7c0ff7328d022b6", - "sha256:7c3b4ba9473f8cf8ede80f707b5cb2849a3e4cf1fbd36c7ff022c70cd50ed516", - "sha256:ca340d05e0618f27cb8e55c8d46835b912b1a3e19dc55377be53859f3d89393f", - "sha256:d7c85c173d5911c1813168ab7f68d49b68fa487cb79fd8b5c727867cbf4ae8c3", - "sha256:d90ad29dabd62cc38a040f34309a8aea106951360321e2eed8d4c5474269bdbd", - "sha256:df4a73ff310821d9cbf9ac761c836c3f29667842a86eec8d39265817ab263bf2", - "sha256:f0e89d422fa50c86a08e1fcef05a36d41806260c4a9b5e0a44b2aa8eadf353e5", - "sha256:f589a91eac6b239eaab49e2d58f60022e350c8d6172730a35f9332cf5ed081f5", - "sha256:fa1c3c6325b904e46349dc81d820124c556baf998c859ceb7bb9abd33da68fa1", - "sha256:fb156cff2235517bf213dde46c58eec5ebe84c5ad8414823d717590e7a7e8e90" - ], - "version": "==10.0.0" - }, - "entrypoints": { - "hashes": [ - "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", - "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" - ], - "version": "==0.3" - }, - "factory-boy": { - "hashes": [ - "sha256:728df59b372c9588b83153facf26d3d28947fc750e8e3c95cefa9bed0e6394ee", - "sha256:faf48d608a1735f0d0a3c9cbf536d64f9132b547dae7ba452c4d99a79e84a370" - ], - "version": "==2.12.0" - }, - "faker": { - "hashes": [ - "sha256:45cc9cca3de8beba5a2da3bd82a6e5544f53da1a702645c8485f682366c15026", - "sha256:a6459ff518d1fc6ee2238a7209e6c899517872c7e1115510279033ffe6fe8ef3" - ], - "version": "==2.0.2" - }, - "fastecdsa": { - "hashes": [ - "sha256:12e952e2a70e2a896083f4cf304b4653f108ead4aac9c63ac8333343182fceac", - "sha256:9d253175f74a96b7aa9c4ce266f96d1c663ca9f12a7e997c9cbe9dc58ea06f0e", - "sha256:b40816ebc663d88b312c503533432bfa6bf7dc50133682d02ecc4ac158d79d5c" - ], - "version": "==1.7.4" - }, - "filelock": { - "hashes": [ - "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", - "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" - ], - "version": "==3.0.12" - }, - "flake8": { - "hashes": [ - "sha256:19241c1cbc971b9962473e4438a2ca19749a7dd002dd1a946eaba171b4114548", - "sha256:8e9dfa3cecb2400b3738a42c54c3043e821682b9c840b0448c0503f781130696" - ], - "version": "==3.7.8" - }, - "importlib-metadata": { - "hashes": [ - "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", - "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" - ], - "markers": "python_version < '3.8'", - "version": "==0.23" - }, - "isort": { - "hashes": [ - "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1", - "sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd" - ], - "version": "==4.3.21" - }, - "libp2p": { - "editable": true, - "extras": [ - "dev" - ], - "path": "." - }, - "lru-dict": { - "hashes": [ - "sha256:365457660e3d05b76f1aba3e0f7fedbfcd6528e97c5115a351ddd0db488354cc" - ], - "version": "==1.1.6" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "more-itertools": { - "hashes": [ - "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", - "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" - ], - "markers": "python_version > '2.7'", - "version": "==7.2.0" - }, - "multiaddr": { - "hashes": [ - "sha256:2faec68b479945fe6b48dd2dc1f8bcccf939aa148836e3a1ab806d6c75db1238", - "sha256:cb7f4091a2d1fa361fe2fd237efcd963abf650efe3af1414c4e9360a34947573" - ], - "version": "==0.0.8" - }, - "mypy": { - "hashes": [ - "sha256:1d98fd818ad3128a5408148c9e4a5edce6ed6b58cc314283e631dd5d9216527b", - "sha256:22ee018e8fc212fe601aba65d3699689dd29a26410ef0d2cc1943de7bec7e3ac", - "sha256:3a24f80776edc706ec8d05329e854d5b9e464cd332e25cde10c8da2da0a0db6c", - "sha256:42a78944e80770f21609f504ca6c8173f7768043205b5ac51c9144e057dcf879", - "sha256:4b2b20106973548975f0c0b1112eceb4d77ed0cafe0a231a1318f3b3a22fc795", - "sha256:591a9625b4d285f3ba69f541c84c0ad9e7bffa7794da3fa0585ef13cf95cb021", - "sha256:5b4b70da3d8bae73b908a90bb2c387b977e59d484d22c604a2131f6f4397c1a3", - "sha256:84edda1ffeda0941b2ab38ecf49302326df79947fa33d98cdcfbf8ca9cf0bb23", - "sha256:b2b83d29babd61b876ae375786960a5374bba0e4aba3c293328ca6ca5dc448dd", - "sha256:cc4502f84c37223a1a5ab700649b5ab1b5e4d2bf2d426907161f20672a21930b", - "sha256:e29e24dd6e7f39f200a5bb55dcaa645d38a397dd5a6674f6042ef02df5795046" - ], - "version": "==0.730" - }, - "mypy-extensions": { - "hashes": [ - "sha256:a161e3b917053de87dbe469987e173e49fb454eca10ef28b48b384538cc11458" - ], - "version": "==0.4.2" - }, - "mypy-protobuf": { - "hashes": [ - "sha256:69f37e166ace422ef8c8266ff73be5384968152e1d7769f3d866d0e923c354ba", - "sha256:a10bb9f24cc2c1f5077a5e64fc5e22b7f7e230a1a399a34cebc57c80a8a532e6" - ], - "version": "==1.15" - }, - "netaddr": { - "hashes": [ - "sha256:38aeec7cdd035081d3a4c306394b19d677623bf76fa0913f6695127c7753aefd", - "sha256:56b3558bd71f3f6999e4c52e349f38660e54a7a8a9943335f73dfc96883e08ca" - ], - "version": "==0.7.19" - }, - "packaging": { - "hashes": [ - "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", - "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" - ], - "version": "==19.2" - }, - "pluggy": { - "hashes": [ - "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", - "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" - ], - "version": "==0.13.0" - }, - "protobuf": { - "hashes": [ - "sha256:05c36022fef3c7d3562ac22402965c0c2b9fe8421f459bb377323598996e407f", - "sha256:139b7eadcca0a861d60b523cb37d9475505e0dfb07972436b15407c2b968d87e", - "sha256:15f683006cb77fb849b1f561e509b03dd2b7dcc749086b8dd1831090d0ba4740", - "sha256:2ad566b7b7cdd8717c7af1825e19f09e8fef2787b77fcb979588944657679604", - "sha256:35cfcf97642ef62108e10a9431c77733ec7eaab8e32fe4653de20403429907cb", - "sha256:387822859ecdd012fdc25ec879f7f487da6e1d5b1ae6115e227e6be208836f71", - "sha256:4df14cbe1e7134afcfdbb9f058949e31c466de27d9b2f7fb4da9e0b67231b538", - "sha256:586c4ca37a7146d4822c700059f150ac3445ce0aef6f3ea258640838bb892dc2", - "sha256:58b11e530e954d29ab3180c48dc558a409f705bf16739fd4e0d3e07924ad7add", - "sha256:63c8c98ccb8c95f41c18fb829aeeab21c6249adee4ed75354125bdc44488f30e", - "sha256:72edcbacd0c73eef507d2ff1af99a6c27df18e66a3ff4351e401182e4de62b03", - "sha256:83dc8a561b3b954fd7002c690bb83278b8d1742a1e28abba9aaef28b0c8b437d", - "sha256:913171ecc84c2726b86574e40549a0ea619d569657c5a5ff782a3be7d81401a5", - "sha256:aabb7c741d3416671c3e6fe7c52970a226e6a8274417a97d7d795f953fadef36", - "sha256:b3452bbda12b1cbe2187d416779de07b2ab4c497d83a050e43c344778763721d", - "sha256:c5d5b8d4a9212338297fa1fa44589f69b470c0ba1d38168b432d577176b386a8", - "sha256:d86ee389c2c4fc3cebabb8ce83a8e97b6b3b5dc727b7419c1ccdc7b6e545a233", - "sha256:f2db8c754de788ab8be5e108e1e967c774c0942342b4f8aaaf14063889a6cfdc" - ], - "version": "==3.9.0" - }, - "py": { - "hashes": [ - "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", - "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" - ], - "version": "==1.8.0" - }, - "pycodestyle": { - "hashes": [ - "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", - "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" - ], - "version": "==2.5.0" - }, - "pycparser": { - "hashes": [ - "sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3" - ], - "version": "==2.19" - }, - "pycryptodome": { - "hashes": [ - "sha256:023c294367d7189ae224fb61bc8d49a2347704087c1c78dbd5ab114dd5b97761", - "sha256:0f29e1238ad3b6b6e2acd7ea1d8e8b382978a56503f2c48b67d5dc144d143cb0", - "sha256:18f376698e3ddcb1d3b312512ca78c9eed132e68ac6d0bf2e72452dfe213e96f", - "sha256:1de815b847982f909dc2e5e2ca641b85cde80d95cc7e6a359c03d4b42cd21568", - "sha256:1ff619b8e4050799ca5ca0ffdf8eb0dbccba6997997866755f37e6aa7dde23fe", - "sha256:233a04bb7bdd4b07e14d61d5166150942d872802daa4f049d49a453fe0659e94", - "sha256:33c07e1e36ec84524b49f99f11804d5e4d2188c643e84d914cb1e0a277ed3c79", - "sha256:3701822a085dbebf678bfbdfbd6ebd92ffa80d5a544c9979984bf16a67c9790b", - "sha256:3f8e6851c0a45429f9b86c1597d3b831b0cff140b3e170a891fce55ef8dac2bb", - "sha256:4f6cdddf1fe72e7f173e9734aa19b94cbd046b61a8559d650ff222e36021d5c1", - "sha256:52d20b22c5b1fc952b4c686b99a6c55c3b0b0a673bec30570f156a72198f66ff", - "sha256:5452b534fecf8bf57cf9106d00877f5f4ab7264e7a5e1f5ea8d15b04517d1255", - "sha256:5a7a9a4a7f8f0990fa97fee71c7f7e0c412925c515cfc6d4996961e92c9be8e5", - "sha256:600bf9dd5fbed0feee83950e2a8baacaa1f38b56c237fff270d31e47f8da9e52", - "sha256:6840c9881e528224ebf72b3f73b3d11baf399e265106c9f4d9bae4f09615a93a", - "sha256:71b041d43fe13004abc36ca720ac64ea489ee8a3407a25116481d0faf9d62494", - "sha256:7252498b427c421e306473ed344e58235eedd95c15fec2e1b33d333aefa1ea10", - "sha256:8d2135c941d38f241e0e62dbdfc1ca5d9240527e61316126797f50b6f3e49825", - "sha256:a0962aea03933b99cf391c3e10dfef32f77915d5553464264cfbc6711f31d254", - "sha256:a117047a220b3911d425affcd1cbc97a1af7ea7eb5d985d9964d42b4f0558489", - "sha256:a35a5c588248ba00eb976a8554211e584a55de286783bc69b12bdd7954052b4a", - "sha256:c1a4f3f651471b9bf60b0d98fa8a994b8a73ff8ab4edc691e23243c853aaff9f", - "sha256:c419943306756ddd1a1997120bb073733bc223365909c68185106d5521cbc0ef", - "sha256:c453ad968b67d66448543420ec39770c30bd16d986058255f058ab87c4f6cc1f", - "sha256:d2d78644655629c7d1b9bf28e479d29facc0949d9ff095103ca9c2314b329ee0", - "sha256:d7be60dc2126ee350ac7191549f5ab05c2dd76a5d5a3022249f395a401c6ea37", - "sha256:dbeb08ad850056747aa7d5f33273b7ce0b9a77910604a1be7b7a6f2ef076213f", - "sha256:f02382dc1bf91fb7123f2a3851fb1b526c871fa9359f387f2bcc847efc74ae52" - ], - "version": "==3.9.0" - }, - "pyflakes": { - "hashes": [ - "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", - "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" - ], - "version": "==2.1.1" - }, - "pymultihash": { - "hashes": [ - "sha256:49c75a1ae9ecc6d22d259064d4597b3685da3f0258f4ded632e03a3a79af215b", - "sha256:f7fa840b24bd6acbd6b073fcd330f10e15619387297babf1dd13ca4dae6e8209" - ], - "version": "==0.8.2" - }, - "pynacl": { - "hashes": [ - "sha256:05c26f93964373fc0abe332676cb6735f0ecad27711035b9472751faa8521255", - "sha256:0c6100edd16fefd1557da078c7a31e7b7d7a52ce39fdca2bec29d4f7b6e7600c", - "sha256:0d0a8171a68edf51add1e73d2159c4bc19fc0718e79dec51166e940856c2f28e", - "sha256:1c780712b206317a746ace34c209b8c29dbfd841dfbc02aa27f2084dd3db77ae", - "sha256:2424c8b9f41aa65bbdbd7a64e73a7450ebb4aa9ddedc6a081e7afcc4c97f7621", - "sha256:2d23c04e8d709444220557ae48ed01f3f1086439f12dbf11976e849a4926db56", - "sha256:30f36a9c70450c7878053fa1344aca0145fd47d845270b43a7ee9192a051bf39", - "sha256:37aa336a317209f1bb099ad177fef0da45be36a2aa664507c5d72015f956c310", - "sha256:4943decfc5b905748f0756fdd99d4f9498d7064815c4cf3643820c9028b711d1", - "sha256:57ef38a65056e7800859e5ba9e6091053cd06e1038983016effaffe0efcd594a", - "sha256:5bd61e9b44c543016ce1f6aef48606280e45f892a928ca7068fba30021e9b786", - "sha256:6482d3017a0c0327a49dddc8bd1074cc730d45db2ccb09c3bac1f8f32d1eb61b", - "sha256:7d3ce02c0784b7cbcc771a2da6ea51f87e8716004512493a2b69016326301c3b", - "sha256:a14e499c0f5955dcc3991f785f3f8e2130ed504fa3a7f44009ff458ad6bdd17f", - "sha256:a39f54ccbcd2757d1d63b0ec00a00980c0b382c62865b61a505163943624ab20", - "sha256:aabb0c5232910a20eec8563503c153a8e78bbf5459490c49ab31f6adf3f3a415", - "sha256:bd4ecb473a96ad0f90c20acba4f0bf0df91a4e03a1f4dd6a4bdc9ca75aa3a715", - "sha256:e2da3c13307eac601f3de04887624939aca8ee3c9488a0bb0eca4fb9401fc6b1", - "sha256:f67814c38162f4deb31f68d590771a29d5ae3b1bd64b75cf232308e5c74777e0" - ], - "version": "==1.3.0" - }, - "pyparsing": { - "hashes": [ - "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", - "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" - ], - "version": "==2.4.2" - }, - "pytest": { - "hashes": [ - "sha256:5d0d20a9a66e39b5845ab14f8989f3463a7aa973700e6cdf02db69da9821e738", - "sha256:692d9351353ef709c1126266579edd4fd469dcf6b5f4f583050f72161d6f3592" - ], - "version": "==4.6.6" - }, - "pytest-asyncio": { - "hashes": [ - "sha256:9fac5100fd716cbecf6ef89233e8590a4ad61d729d1732e0a96b84182df1daaf", - "sha256:d734718e25cfc32d2bf78d346e99d33724deeba774cc4afdf491530c6184b63b" - ], - "version": "==0.10.0" - }, - "python-dateutil": { - "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" - ], - "version": "==2.8.0" - }, - "rpcudp": { - "hashes": [ - "sha256:d4f83e27aa242eab142c4be377b5d4af15f2e68cd47be49e009093932313af81", - "sha256:e0100381cd2ee541abdb26001661c863094e25470234e994f080e347d6e68cb6" - ], - "version": "==3.0.0" - }, - "six": { - "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" - ], - "version": "==1.12.0" - }, - "text-unidecode": { - "hashes": [ - "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", - "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93" - ], - "version": "==1.3" - }, - "toml": { - "hashes": [ - "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", - "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" - ], - "version": "==0.10.0" - }, - "tox": { - "hashes": [ - "sha256:0bc216b6a2e6afe764476b4a07edf2c1dab99ed82bb146a1130b2e828f5bff5e", - "sha256:c4f6b319c20ba4913dbfe71ebfd14ff95d1853c4231493608182f66e566ecfe1" - ], - "version": "==3.14.0" - }, - "typed-ast": { - "hashes": [ - "sha256:18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", - "sha256:262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", - "sha256:2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", - "sha256:354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", - "sha256:4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", - "sha256:630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", - "sha256:66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", - "sha256:71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", - "sha256:95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", - "sha256:bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", - "sha256:cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", - "sha256:d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", - "sha256:d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", - "sha256:d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", - "sha256:ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12" - ], - "version": "==1.4.0" - }, - "typing-extensions": { - "hashes": [ - "sha256:2ed632b30bb54fc3941c382decfd0ee4148f5c591651c9272473fea2c6397d95", - "sha256:b1edbbf0652660e32ae780ac9433f4231e7339c7f9a8057d0f042fcbcea49b87", - "sha256:d8179012ec2c620d3791ca6fe2bf7979d979acdbef1fca0bc56b37411db682ed" - ], - "version": "==3.7.4" - }, - "u-msgpack-python": { - "hashes": [ - "sha256:09c85a8af77376034396681e76bf30c249a4fd8e5ebb239f8a468d3655f210d0", - "sha256:d9a5634753c433676baa08a1854896b43e94d50c42da9cbd505a0d1dbd367a5a" - ], - "version": "==2.5.2" - }, - "varint": { - "hashes": [ - "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5" - ], - "version": "==1.0.2" - }, - "virtualenv": { - "hashes": [ - "sha256:680af46846662bb38c5504b78bad9ed9e4f3ba2d54f54ba42494fdf94337fe30", - "sha256:f78d81b62d3147396ac33fc9d77579ddc42cc2a98dd9ea38886f616b33bc7fb2" - ], - "version": "==16.7.5" - }, - "wcwidth": { - "hashes": [ - "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" - ], - "version": "==0.1.7" - }, - "zipp": { - "hashes": [ - "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", - "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" - ], - "version": "==0.6.0" - } - }, - "develop": {} -} From ac9feef26c9e3d402098e900ff6cf8c90f8369ab Mon Sep 17 00:00:00 2001 From: "Aratz M. Lasa" Date: Tue, 15 Oct 2019 20:32:25 +0200 Subject: [PATCH 7/7] Pull request feedback --- libp2p/host/routed_host.py | 2 +- libp2p/peer/peerinfo.py | 14 -------------- .../routing/kademlia/kademlia_peer_router.py | 19 ++++++++++++++++++- tests/host/test_routed_host.py | 9 +++++---- tests/routing/test_kad_peer_router.py | 11 +++++++---- 5 files changed, 31 insertions(+), 24 deletions(-) diff --git a/libp2p/host/routed_host.py b/libp2p/host/routed_host.py index 1b63848b..4a9778de 100644 --- a/libp2p/host/routed_host.py +++ b/libp2p/host/routed_host.py @@ -30,7 +30,7 @@ class RoutedHost(BasicHost): found_peer_info = await self._router.find_peer(peer_info.peer_id) if not found_peer_info: raise ConnectionFailure("Unable to find Peer address") - peer_info.addrs = found_peer_info.addrs + self.peerstore.add_addrs(peer_info.peer_id, found_peer_info.addrs, 10) self.peerstore.add_addrs(peer_info.peer_id, peer_info.addrs, 10) # there is already a connection to this peer diff --git a/libp2p/peer/peerinfo.py b/libp2p/peer/peerinfo.py index 0ffd04a5..4015ef97 100644 --- a/libp2p/peer/peerinfo.py +++ b/libp2p/peer/peerinfo.py @@ -1,4 +1,3 @@ -import json from typing import Any, List, Sequence import multiaddr @@ -14,11 +13,6 @@ class PeerInfo: self.peer_id = peer_id self.addrs = list(addrs) - def to_string(self) -> str: - return json.dumps( - [self.peer_id.to_string(), list(map(lambda a: str(a), self.addrs))] - ) - def __eq__(self, other: Any) -> bool: return ( isinstance(other, PeerInfo) @@ -26,14 +20,6 @@ class PeerInfo: and self.addrs == other.addrs ) - @classmethod - def info_from_string(cls, info: str) -> "PeerInfo": - peer_id, raw_addrs = json.loads(info) - return PeerInfo( - ID.from_base58(peer_id), - list(map(lambda a: multiaddr.Multiaddr(a), raw_addrs)), - ) - def info_from_p2p_addr(addr: multiaddr.Multiaddr) -> PeerInfo: if not addr: diff --git a/libp2p/routing/kademlia/kademlia_peer_router.py b/libp2p/routing/kademlia/kademlia_peer_router.py index 79c66b49..352c7dff 100644 --- a/libp2p/routing/kademlia/kademlia_peer_router.py +++ b/libp2p/routing/kademlia/kademlia_peer_router.py @@ -1,3 +1,7 @@ +import json + +import multiaddr + from libp2p.kademlia.network import KademliaServer from libp2p.peer.id import ID from libp2p.peer.peerinfo import PeerInfo @@ -21,5 +25,18 @@ class KadmeliaPeerRouter(IPeerRouting): # ignore type for kad value = await self.server.get(xor_id) # type: ignore return ( - PeerInfo.info_from_string(value) if value else None + peer_info_from_str(value) if value else None ) # TODO: should raise error if None? + + +def peer_info_to_str(peer_info: PeerInfo) -> str: + return json.dumps( + [peer_info.peer_id.to_string(), list(map(lambda a: str(a), peer_info.addrs))] + ) + + +def peer_info_from_str(string: str) -> PeerInfo: + peer_id, raw_addrs = json.loads(string) + return PeerInfo( + ID.from_base58(peer_id), list(map(lambda a: multiaddr.Multiaddr(a), raw_addrs)) + ) diff --git a/tests/host/test_routed_host.py b/tests/host/test_routed_host.py index e19392f5..7791d62d 100644 --- a/tests/host/test_routed_host.py +++ b/tests/host/test_routed_host.py @@ -4,6 +4,7 @@ import pytest from libp2p.host.exceptions import ConnectionFailure from libp2p.peer.peerinfo import PeerInfo +from libp2p.routing.kademlia.kademlia_peer_router import peer_info_to_str from tests.utils import ( set_up_nodes_by_transport_and_disc_opt, set_up_nodes_by_transport_opt, @@ -23,11 +24,11 @@ async def test_host_routing_success(): # Set routing info await routers[0].server.set( host_a.get_id().xor_id, - PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string(), + peer_info_to_str(PeerInfo(host_a.get_id(), host_a.get_addrs())), ) await routers[1].server.set( host_b.get_id().xor_id, - PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string(), + peer_info_to_str(PeerInfo(host_b.get_id(), host_b.get_addrs())), ) # forces to use routing as no addrs are provided @@ -54,11 +55,11 @@ async def test_host_routing_fail(): # Set routing info await routers[0].server.set( host_a.get_id().xor_id, - PeerInfo(host_a.get_id(), host_a.get_addrs()).to_string(), + peer_info_to_str(PeerInfo(host_a.get_id(), host_a.get_addrs())), ) await routers[1].server.set( host_b.get_id().xor_id, - PeerInfo(host_b.get_id(), host_b.get_addrs()).to_string(), + peer_info_to_str(PeerInfo(host_b.get_id(), host_b.get_addrs())), ) # routing fails because host_c does not use routing diff --git a/tests/routing/test_kad_peer_router.py b/tests/routing/test_kad_peer_router.py index e2ff2607..d3f38364 100644 --- a/tests/routing/test_kad_peer_router.py +++ b/tests/routing/test_kad_peer_router.py @@ -2,7 +2,10 @@ import pytest from libp2p.kademlia.network import KademliaServer from libp2p.peer.id import ID -from libp2p.routing.kademlia.kademlia_peer_router import KadmeliaPeerRouter +from libp2p.routing.kademlia.kademlia_peer_router import ( + KadmeliaPeerRouter, + peer_info_to_str, +) @pytest.mark.asyncio @@ -15,7 +18,7 @@ async def test_simple_two_nodes(): node_a_value = await node_b.bootstrap([("127.0.0.1", 5678)]) node_a_kad_peerinfo = node_a_value[0] - await node_a.set(node_a_kad_peerinfo.xor_id, node_a_kad_peerinfo.to_string()) + await node_a.set(node_a_kad_peerinfo.xor_id, peer_info_to_str(node_a_kad_peerinfo)) router = KadmeliaPeerRouter(node_b) returned_info = await router.find_peer(ID(node_a_kad_peerinfo.peer_id_bytes)) @@ -37,7 +40,7 @@ async def test_simple_three_nodes(): node_a_kad_peerinfo = node_a_value[0] await node_c.bootstrap([("127.0.0.1", 5702)]) - await node_a.set(node_a_kad_peerinfo.xor_id, node_a_kad_peerinfo.to_string()) + await node_a.set(node_a_kad_peerinfo.xor_id, peer_info_to_str(node_a_kad_peerinfo)) router = KadmeliaPeerRouter(node_c) returned_info = await router.find_peer(ID(node_a_kad_peerinfo.peer_id_bytes)) @@ -65,7 +68,7 @@ async def test_simple_four_nodes(): await node_d.bootstrap([("127.0.0.1", 5803)]) - await node_b.set(node_a_kad_peerinfo.xor_id, node_a_kad_peerinfo.to_string()) + await node_b.set(node_a_kad_peerinfo.xor_id, peer_info_to_str(node_a_kad_peerinfo)) router = KadmeliaPeerRouter(node_d) returned_info = await router.find_peer(ID(node_a_kad_peerinfo.peer_id_bytes))