Skip to content

Commit

Permalink
Merge pull request #360 from NIC619/store_our_keypair_in_peerstore
Browse files Browse the repository at this point in the history
Store our keypair in peerstore
  • Loading branch information
NIC619 authored Nov 27, 2019
2 parents a6864e3 + 9f3f2c5 commit da10fc8
Show file tree
Hide file tree
Showing 14 changed files with 370 additions and 85 deletions.
7 changes: 5 additions & 2 deletions libp2p/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ def initialize_default_swarm(
)

peerstore = peerstore_opt or PeerStore()
# Store our key pair in peerstore
peerstore.add_key_pair(id_opt, key_pair)

# TODO: Initialize discovery if not presented
return Swarm(id_opt, peerstore, upgrader, transport)

Expand Down Expand Up @@ -151,9 +154,9 @@ async def new_node(
# TODO routing unimplemented
host: IHost # If not explicitly typed, MyPy raises error
if disc_opt:
host = RoutedHost(key_pair.public_key, swarm_opt, disc_opt)
host = RoutedHost(swarm_opt, disc_opt)
else:
host = BasicHost(key_pair.public_key, swarm_opt)
host = BasicHost(swarm_opt)

# Kick off cleanup job
asyncio.ensure_future(cleanup_done_tasks())
Expand Down
10 changes: 5 additions & 5 deletions libp2p/host/basic_host.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import multiaddr

from libp2p.crypto.keys import PublicKey
from libp2p.crypto.keys import PrivateKey, PublicKey
from libp2p.host.defaults import get_default_protocols
from libp2p.host.exceptions import StreamFailure
from libp2p.network.network_interface import INetwork
Expand Down Expand Up @@ -39,7 +39,6 @@ class BasicHost(IHost):
right after a stream is initialized.
"""

_public_key: PublicKey
_network: INetwork
peerstore: IPeerStore

Expand All @@ -48,11 +47,9 @@ class BasicHost(IHost):

def __init__(
self,
public_key: PublicKey,
network: INetwork,
default_protocols: "OrderedDict[TProtocol, StreamHandlerFn]" = None,
) -> None:
self._public_key = public_key
self._network = network
self._network.set_stream_handler(self._swarm_stream_handler)
self.peerstore = self._network.peerstore
Expand All @@ -68,7 +65,10 @@ def get_id(self) -> ID:
return self._network.get_peer_id()

def get_public_key(self) -> PublicKey:
return self._public_key
return self.peerstore.pubkey(self.get_id())

def get_private_key(self) -> PrivateKey:
return self.peerstore.privkey(self.get_id())

def get_network(self) -> INetwork:
"""
Expand Down
8 changes: 7 additions & 1 deletion libp2p/host/host_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import multiaddr

from libp2p.crypto.keys import PublicKey
from libp2p.crypto.keys import PrivateKey, PublicKey
from libp2p.network.network_interface import INetwork
from libp2p.network.stream.net_stream_interface import INetStream
from libp2p.peer.id import ID
Expand All @@ -24,6 +24,12 @@ def get_public_key(self) -> PublicKey:
:return: the public key belonging to the peer
"""

@abstractmethod
def get_private_key(self) -> PrivateKey:
"""
:return: the private key belonging to the peer
"""

@abstractmethod
def get_network(self) -> INetwork:
"""
Expand Down
5 changes: 2 additions & 3 deletions libp2p/host/routed_host.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from libp2p.crypto.keys import PublicKey
from libp2p.host.basic_host import BasicHost
from libp2p.host.exceptions import ConnectionFailure
from libp2p.network.network_interface import INetwork
Expand All @@ -11,8 +10,8 @@
class RoutedHost(BasicHost):
_router: IPeerRouting

def __init__(self, public_key: PublicKey, network: INetwork, router: IPeerRouting):
super().__init__(public_key, network)
def __init__(self, network: INetwork, router: IPeerRouting):
super().__init__(network)
self._router = router

async def connect(self, peer_info: PeerInfo) -> None:
Expand Down
3 changes: 0 additions & 3 deletions libp2p/peer/addrbook_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@


class IAddrBook(ABC):
def __init__(self) -> None:
pass

@abstractmethod
def add_addr(self, peer_id: ID, addr: Multiaddr, ttl: int) -> None:
"""
Expand Down
61 changes: 61 additions & 0 deletions libp2p/peer/peerdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,46 +2,107 @@

from multiaddr import Multiaddr

from libp2p.crypto.keys import PrivateKey, PublicKey

from .peerdata_interface import IPeerData


class PeerData(IPeerData):

pubkey: PublicKey
privkey: PrivateKey
metadata: Dict[Any, Any]
protocols: List[str]
addrs: List[Multiaddr]

def __init__(self) -> None:
self.pubkey = None
self.privkey = None
self.metadata = {}
self.protocols = []
self.addrs = []

def get_protocols(self) -> List[str]:
"""
:return: all protocols associated with given peer
"""
return self.protocols

def add_protocols(self, protocols: Sequence[str]) -> None:
"""
:param protocols: protocols to add
"""
self.protocols.extend(list(protocols))

def set_protocols(self, protocols: Sequence[str]) -> None:
"""
:param protocols: protocols to set
"""
self.protocols = list(protocols)

def add_addrs(self, addrs: Sequence[Multiaddr]) -> None:
"""
:param addrs: multiaddresses to add
"""
self.addrs.extend(addrs)

def get_addrs(self) -> List[Multiaddr]:
"""
:return: all multiaddresses
"""
return self.addrs

def clear_addrs(self) -> None:
"""Clear all addresses."""
self.addrs = []

def put_metadata(self, key: str, val: Any) -> None:
"""
:param key: key in KV pair
:param val: val to associate with key
"""
self.metadata[key] = val

def get_metadata(self, key: str) -> Any:
"""
:param key: key in KV pair
:return: val for key
:raise PeerDataError: key not found
"""
if key in self.metadata:
return self.metadata[key]
raise PeerDataError("key not found")

def add_pubkey(self, pubkey: PublicKey) -> None:
"""
:param pubkey:
"""
self.pubkey = pubkey

def get_pubkey(self) -> PublicKey:
"""
:return: public key of the peer
:raise PeerDataError: if public key not found
"""
if self.pubkey is None:
raise PeerDataError("public key not found")
return self.pubkey

def add_privkey(self, privkey: PrivateKey) -> None:
"""
:param privkey:
"""
self.privkey = privkey

def get_privkey(self) -> PrivateKey:
"""
:return: private key of the peer
:raise PeerDataError: if private key not found
"""
if self.privkey is None:
raise PeerDataError("private key not found")
return self.privkey


class PeerDataError(KeyError):
"""Raised when a key is not found in peer metadata."""
33 changes: 30 additions & 3 deletions libp2p/peer/peerdata_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

from multiaddr import Multiaddr

from libp2p.crypto.keys import PrivateKey, PublicKey

from .peermetadata_interface import IPeerMetadata


Expand All @@ -22,7 +24,7 @@ def add_protocols(self, protocols: Sequence[str]) -> None:
@abstractmethod
def set_protocols(self, protocols: Sequence[str]) -> None:
"""
:param protocols: protocols to add
:param protocols: protocols to set
"""

@abstractmethod
Expand All @@ -46,13 +48,38 @@ def put_metadata(self, key: str, val: Any) -> None:
"""
:param key: key in KV pair
:param val: val to associate with key
:raise Exception: unsuccesful put
"""

@abstractmethod
def get_metadata(self, key: str) -> IPeerMetadata:
"""
:param key: key in KV pair
:return: val for key
:raise Exception: key not found
:raise PeerDataError: key not found
"""

@abstractmethod
def add_pubkey(self, pubkey: PublicKey) -> None:
"""
:param pubkey:
"""

@abstractmethod
def get_pubkey(self) -> PublicKey:
"""
:return: public key of the peer
:raise PeerDataError: if public key not found
"""

@abstractmethod
def add_privkey(self, privkey: PrivateKey) -> None:
"""
:param privkey:
"""

@abstractmethod
def get_privkey(self) -> PrivateKey:
"""
:return: private key of the peer
:raise PeerDataError: if private key not found
"""
3 changes: 0 additions & 3 deletions libp2p/peer/peermetadata_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,6 @@


class IPeerMetadata(ABC):
def __init__(self) -> None:
pass

@abstractmethod
def get(self, peer_id: ID, key: str) -> Any:
"""
Expand Down
Loading

0 comments on commit da10fc8

Please sign in to comment.