mirror of
https://github.com/varun-r-mallya/py-libp2p.git
synced 2026-02-12 16:10:57 +00:00
fix typos
This commit is contained in:
@ -15,8 +15,7 @@ from libp2p.custom_types import (
|
|||||||
from libp2p.network.stream.exceptions import (
|
from libp2p.network.stream.exceptions import (
|
||||||
StreamClosed,
|
StreamClosed,
|
||||||
)
|
)
|
||||||
from libp2p.peer.envelope import seal_record
|
from libp2p.peer.peerstore import create_signed_peer_record
|
||||||
from libp2p.peer.peer_record import PeerRecord
|
|
||||||
from libp2p.utils import (
|
from libp2p.utils import (
|
||||||
decode_varint_with_size,
|
decode_varint_with_size,
|
||||||
get_agent_version,
|
get_agent_version,
|
||||||
@ -66,9 +65,11 @@ def _mk_identify_protobuf(
|
|||||||
protocols = tuple(str(p) for p in host.get_mux().get_protocols() if p is not None)
|
protocols = tuple(str(p) for p in host.get_mux().get_protocols() if p is not None)
|
||||||
|
|
||||||
# Create a signed peer-record for the remote peer
|
# Create a signed peer-record for the remote peer
|
||||||
record = PeerRecord(host.get_id(), host.get_addrs())
|
envelope = create_signed_peer_record(
|
||||||
envelope = seal_record(record, host.get_private_key())
|
host.get_id(),
|
||||||
protobuf = envelope.marshal_envelope()
|
host.get_addrs(),
|
||||||
|
host.get_private_key(),
|
||||||
|
)
|
||||||
|
|
||||||
observed_addr = observed_multiaddr.to_bytes() if observed_multiaddr else b""
|
observed_addr = observed_multiaddr.to_bytes() if observed_multiaddr else b""
|
||||||
return Identify(
|
return Identify(
|
||||||
@ -78,7 +79,7 @@ def _mk_identify_protobuf(
|
|||||||
listen_addrs=map(_multiaddr_to_bytes, laddrs),
|
listen_addrs=map(_multiaddr_to_bytes, laddrs),
|
||||||
observed_addr=observed_addr,
|
observed_addr=observed_addr,
|
||||||
protocols=protocols,
|
protocols=protocols,
|
||||||
signedPeerRecord=protobuf,
|
signedPeerRecord=envelope.marshal_envelope(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -25,12 +25,14 @@ from libp2p.discovery.random_walk.rt_refresh_manager import RTRefreshManager
|
|||||||
from libp2p.network.stream.net_stream import (
|
from libp2p.network.stream.net_stream import (
|
||||||
INetStream,
|
INetStream,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.envelope import Envelope, consume_envelope
|
||||||
from libp2p.peer.id import (
|
from libp2p.peer.id import (
|
||||||
ID,
|
ID,
|
||||||
)
|
)
|
||||||
from libp2p.peer.peerinfo import (
|
from libp2p.peer.peerinfo import (
|
||||||
PeerInfo,
|
PeerInfo,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.peerstore import create_signed_peer_record
|
||||||
from libp2p.tools.async_service import (
|
from libp2p.tools.async_service import (
|
||||||
Service,
|
Service,
|
||||||
)
|
)
|
||||||
@ -234,6 +236,9 @@ class KadDHT(Service):
|
|||||||
await self.add_peer(peer_id)
|
await self.add_peer(peer_id)
|
||||||
logger.debug(f"Added peer {peer_id} to routing table")
|
logger.debug(f"Added peer {peer_id} to routing table")
|
||||||
|
|
||||||
|
closer_peer_envelope: Envelope | None = None
|
||||||
|
provider_peer_envelope: Envelope | None = None
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Read varint-prefixed length for the message
|
# Read varint-prefixed length for the message
|
||||||
length_prefix = b""
|
length_prefix = b""
|
||||||
@ -266,6 +271,7 @@ class KadDHT(Service):
|
|||||||
# Handle FIND_NODE message
|
# Handle FIND_NODE message
|
||||||
if message.type == Message.MessageType.FIND_NODE:
|
if message.type == Message.MessageType.FIND_NODE:
|
||||||
# Get target key directly from protobuf
|
# Get target key directly from protobuf
|
||||||
|
print("FIND NODE RECEIVED")
|
||||||
target_key = message.key
|
target_key = message.key
|
||||||
|
|
||||||
# Find closest peers to the target key
|
# Find closest peers to the target key
|
||||||
@ -274,6 +280,26 @@ class KadDHT(Service):
|
|||||||
)
|
)
|
||||||
logger.debug(f"Found {len(closest_peers)} peers close to target")
|
logger.debug(f"Found {len(closest_peers)} peers close to target")
|
||||||
|
|
||||||
|
# Consume the source signed_peer_record if sent
|
||||||
|
if message.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
message.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the defualt TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
# Build response message with protobuf
|
# Build response message with protobuf
|
||||||
response = Message()
|
response = Message()
|
||||||
response.type = Message.MessageType.FIND_NODE
|
response.type = Message.MessageType.FIND_NODE
|
||||||
@ -298,6 +324,25 @@ class KadDHT(Service):
|
|||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Add the signed-peer-record for each peer in the peer-proto
|
||||||
|
# if cached in the peerstore
|
||||||
|
closer_peer_envelope = (
|
||||||
|
self.host.get_peerstore().get_peer_record(peer)
|
||||||
|
)
|
||||||
|
|
||||||
|
if closer_peer_envelope is not None:
|
||||||
|
peer_proto.signedRecord = (
|
||||||
|
closer_peer_envelope.marshal_envelope()
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Serialize and send response
|
# Serialize and send response
|
||||||
response_bytes = response.SerializeToString()
|
response_bytes = response.SerializeToString()
|
||||||
await stream.write(varint.encode(len(response_bytes)))
|
await stream.write(varint.encode(len(response_bytes)))
|
||||||
@ -312,6 +357,26 @@ class KadDHT(Service):
|
|||||||
key = message.key
|
key = message.key
|
||||||
logger.debug(f"Received ADD_PROVIDER for key {key.hex()}")
|
logger.debug(f"Received ADD_PROVIDER for key {key.hex()}")
|
||||||
|
|
||||||
|
# Consume the source signed-peer-record if sent
|
||||||
|
if message.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
message.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (72000 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
# Extract provider information
|
# Extract provider information
|
||||||
for provider_proto in message.providerPeers:
|
for provider_proto in message.providerPeers:
|
||||||
try:
|
try:
|
||||||
@ -341,11 +406,42 @@ class KadDHT(Service):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"Failed to process provider info: {e}")
|
logger.warning(f"Failed to process provider info: {e}")
|
||||||
|
|
||||||
|
# Process the signed-records of provider if sent
|
||||||
|
if provider_proto.HasField("signedRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
provider_proto.signedRecord,
|
||||||
|
"libp2p-peer-record",
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record( # noqa
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Failed to update the Certified-Addr-Book"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified-addr-book for peer %s: %s", # noqa
|
||||||
|
provider_id,
|
||||||
|
e,
|
||||||
|
)
|
||||||
|
|
||||||
# Send acknowledgement
|
# Send acknowledgement
|
||||||
response = Message()
|
response = Message()
|
||||||
response.type = Message.MessageType.ADD_PROVIDER
|
response.type = Message.MessageType.ADD_PROVIDER
|
||||||
response.key = key
|
response.key = key
|
||||||
|
|
||||||
|
# Add sender's signed-peer-record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
response_bytes = response.SerializeToString()
|
response_bytes = response.SerializeToString()
|
||||||
await stream.write(varint.encode(len(response_bytes)))
|
await stream.write(varint.encode(len(response_bytes)))
|
||||||
await stream.write(response_bytes)
|
await stream.write(response_bytes)
|
||||||
@ -357,6 +453,26 @@ class KadDHT(Service):
|
|||||||
key = message.key
|
key = message.key
|
||||||
logger.debug(f"Received GET_PROVIDERS request for key {key.hex()}")
|
logger.debug(f"Received GET_PROVIDERS request for key {key.hex()}")
|
||||||
|
|
||||||
|
# Consume the source signed_peer_record if sent
|
||||||
|
if message.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
message.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the defualt TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
# Find providers for the key
|
# Find providers for the key
|
||||||
providers = self.provider_store.get_providers(key)
|
providers = self.provider_store.get_providers(key)
|
||||||
logger.debug(
|
logger.debug(
|
||||||
@ -368,12 +484,32 @@ class KadDHT(Service):
|
|||||||
response.type = Message.MessageType.GET_PROVIDERS
|
response.type = Message.MessageType.GET_PROVIDERS
|
||||||
response.key = key
|
response.key = key
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record for the response
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Add provider information to response
|
# Add provider information to response
|
||||||
for provider_info in providers:
|
for provider_info in providers:
|
||||||
provider_proto = response.providerPeers.add()
|
provider_proto = response.providerPeers.add()
|
||||||
provider_proto.id = provider_info.peer_id.to_bytes()
|
provider_proto.id = provider_info.peer_id.to_bytes()
|
||||||
provider_proto.connection = Message.ConnectionType.CAN_CONNECT
|
provider_proto.connection = Message.ConnectionType.CAN_CONNECT
|
||||||
|
|
||||||
|
# Add provider signed-records if cached
|
||||||
|
provider_peer_envelope = (
|
||||||
|
self.host.get_peerstore().get_peer_record(
|
||||||
|
provider_info.peer_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if provider_peer_envelope is not None:
|
||||||
|
provider_proto.signedRecord = (
|
||||||
|
provider_peer_envelope.marshal_envelope()
|
||||||
|
)
|
||||||
|
|
||||||
# Add addresses if available
|
# Add addresses if available
|
||||||
for addr in provider_info.addrs:
|
for addr in provider_info.addrs:
|
||||||
provider_proto.addrs.append(addr.to_bytes())
|
provider_proto.addrs.append(addr.to_bytes())
|
||||||
@ -397,6 +533,16 @@ class KadDHT(Service):
|
|||||||
peer_proto.id = peer.to_bytes()
|
peer_proto.id = peer.to_bytes()
|
||||||
peer_proto.connection = Message.ConnectionType.CAN_CONNECT
|
peer_proto.connection = Message.ConnectionType.CAN_CONNECT
|
||||||
|
|
||||||
|
# Add the signed-records of closest_peers if cached
|
||||||
|
closer_peer_envelope = (
|
||||||
|
self.host.get_peerstore().get_peer_record(peer)
|
||||||
|
)
|
||||||
|
|
||||||
|
if closer_peer_envelope is not None:
|
||||||
|
peer_proto.signedRecord = (
|
||||||
|
closer_peer_envelope.marshal_envelope()
|
||||||
|
)
|
||||||
|
|
||||||
# Add addresses if available
|
# Add addresses if available
|
||||||
try:
|
try:
|
||||||
addrs = self.host.get_peerstore().addrs(peer)
|
addrs = self.host.get_peerstore().addrs(peer)
|
||||||
@ -417,6 +563,26 @@ class KadDHT(Service):
|
|||||||
key = message.key
|
key = message.key
|
||||||
logger.debug(f"Received GET_VALUE request for key {key.hex()}")
|
logger.debug(f"Received GET_VALUE request for key {key.hex()}")
|
||||||
|
|
||||||
|
# Consume the sender_signed_peer_record
|
||||||
|
if message.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
message.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating teh Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
value = self.value_store.get(key)
|
value = self.value_store.get(key)
|
||||||
if value:
|
if value:
|
||||||
logger.debug(f"Found value for key {key.hex()}")
|
logger.debug(f"Found value for key {key.hex()}")
|
||||||
@ -431,6 +597,14 @@ class KadDHT(Service):
|
|||||||
response.record.value = value
|
response.record.value = value
|
||||||
response.record.timeReceived = str(time.time())
|
response.record.timeReceived = str(time.time())
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Serialize and send response
|
# Serialize and send response
|
||||||
response_bytes = response.SerializeToString()
|
response_bytes = response.SerializeToString()
|
||||||
await stream.write(varint.encode(len(response_bytes)))
|
await stream.write(varint.encode(len(response_bytes)))
|
||||||
@ -444,6 +618,14 @@ class KadDHT(Service):
|
|||||||
response.type = Message.MessageType.GET_VALUE
|
response.type = Message.MessageType.GET_VALUE
|
||||||
response.key = key
|
response.key = key
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record for the response
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Add closest peers to key
|
# Add closest peers to key
|
||||||
closest_peers = self.routing_table.find_local_closest_peers(
|
closest_peers = self.routing_table.find_local_closest_peers(
|
||||||
key, 20
|
key, 20
|
||||||
@ -462,6 +644,16 @@ class KadDHT(Service):
|
|||||||
peer_proto.id = peer.to_bytes()
|
peer_proto.id = peer.to_bytes()
|
||||||
peer_proto.connection = Message.ConnectionType.CAN_CONNECT
|
peer_proto.connection = Message.ConnectionType.CAN_CONNECT
|
||||||
|
|
||||||
|
# Add signed-records of closer-peers if cached
|
||||||
|
closer_peer_envelope = (
|
||||||
|
self.host.get_peerstore().get_peer_record(peer)
|
||||||
|
)
|
||||||
|
|
||||||
|
if closer_peer_envelope is not None:
|
||||||
|
peer_proto.signedRecord = (
|
||||||
|
closer_peer_envelope.marshal_envelope()
|
||||||
|
)
|
||||||
|
|
||||||
# Add addresses if available
|
# Add addresses if available
|
||||||
try:
|
try:
|
||||||
addrs = self.host.get_peerstore().addrs(peer)
|
addrs = self.host.get_peerstore().addrs(peer)
|
||||||
@ -484,6 +676,27 @@ class KadDHT(Service):
|
|||||||
key = message.record.key
|
key = message.record.key
|
||||||
value = message.record.value
|
value = message.record.value
|
||||||
success = False
|
success = False
|
||||||
|
|
||||||
|
# Consume the source signed_peer_record if sent
|
||||||
|
if message.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
message.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the certified-addr-book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if not (key and value):
|
if not (key and value):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
@ -504,6 +717,16 @@ class KadDHT(Service):
|
|||||||
response.type = Message.MessageType.PUT_VALUE
|
response.type = Message.MessageType.PUT_VALUE
|
||||||
if success:
|
if success:
|
||||||
response.key = key
|
response.key = key
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record for the response
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
|
# Serialize and send response
|
||||||
response_bytes = response.SerializeToString()
|
response_bytes = response.SerializeToString()
|
||||||
await stream.write(varint.encode(len(response_bytes)))
|
await stream.write(varint.encode(len(response_bytes)))
|
||||||
await stream.write(response_bytes)
|
await stream.write(response_bytes)
|
||||||
|
|||||||
@ -27,6 +27,7 @@ message Message {
|
|||||||
bytes id = 1;
|
bytes id = 1;
|
||||||
repeated bytes addrs = 2;
|
repeated bytes addrs = 2;
|
||||||
ConnectionType connection = 3;
|
ConnectionType connection = 3;
|
||||||
|
optional bytes signedRecord = 4; // Envelope(PeerRecord) encoded
|
||||||
}
|
}
|
||||||
|
|
||||||
MessageType type = 1;
|
MessageType type = 1;
|
||||||
@ -35,4 +36,6 @@ message Message {
|
|||||||
Record record = 3;
|
Record record = 3;
|
||||||
repeated Peer closerPeers = 8;
|
repeated Peer closerPeers = 8;
|
||||||
repeated Peer providerPeers = 9;
|
repeated Peer providerPeers = 9;
|
||||||
|
|
||||||
|
optional bytes senderRecord = 11; // Envelope(PeerRecord) encoded
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,11 +1,12 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||||
# source: libp2p/kad_dht/pb/kademlia.proto
|
# source: libp2p/kad_dht/pb/kademlia.proto
|
||||||
|
# Protobuf Python Version: 4.25.3
|
||||||
"""Generated protocol buffer code."""
|
"""Generated protocol buffer code."""
|
||||||
from google.protobuf.internal import builder as _builder
|
|
||||||
from google.protobuf import descriptor as _descriptor
|
from google.protobuf import descriptor as _descriptor
|
||||||
from google.protobuf import descriptor_pool as _descriptor_pool
|
from google.protobuf import descriptor_pool as _descriptor_pool
|
||||||
from google.protobuf import symbol_database as _symbol_database
|
from google.protobuf import symbol_database as _symbol_database
|
||||||
|
from google.protobuf.internal import builder as _builder
|
||||||
# @@protoc_insertion_point(imports)
|
# @@protoc_insertion_point(imports)
|
||||||
|
|
||||||
_sym_db = _symbol_database.Default()
|
_sym_db = _symbol_database.Default()
|
||||||
@ -13,21 +14,21 @@ _sym_db = _symbol_database.Default()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n libp2p/kad_dht/pb/kademlia.proto\":\n\x06Record\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12\r\n\x05value\x18\x02 \x01(\x0c\x12\x14\n\x0ctimeReceived\x18\x05 \x01(\t\"\xca\x03\n\x07Message\x12\"\n\x04type\x18\x01 \x01(\x0e\x32\x14.Message.MessageType\x12\x17\n\x0f\x63lusterLevelRaw\x18\n \x01(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x17\n\x06record\x18\x03 \x01(\x0b\x32\x07.Record\x12\"\n\x0b\x63loserPeers\x18\x08 \x03(\x0b\x32\r.Message.Peer\x12$\n\rproviderPeers\x18\t \x03(\x0b\x32\r.Message.Peer\x1aN\n\x04Peer\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05\x61\x64\x64rs\x18\x02 \x03(\x0c\x12+\n\nconnection\x18\x03 \x01(\x0e\x32\x17.Message.ConnectionType\"i\n\x0bMessageType\x12\r\n\tPUT_VALUE\x10\x00\x12\r\n\tGET_VALUE\x10\x01\x12\x10\n\x0c\x41\x44\x44_PROVIDER\x10\x02\x12\x11\n\rGET_PROVIDERS\x10\x03\x12\r\n\tFIND_NODE\x10\x04\x12\x08\n\x04PING\x10\x05\"W\n\x0e\x43onnectionType\x12\x11\n\rNOT_CONNECTED\x10\x00\x12\r\n\tCONNECTED\x10\x01\x12\x0f\n\x0b\x43\x41N_CONNECT\x10\x02\x12\x12\n\x0e\x43\x41NNOT_CONNECT\x10\x03\x62\x06proto3')
|
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n libp2p/kad_dht/pb/kademlia.proto\":\n\x06Record\x12\x0b\n\x03key\x18\x01 \x01(\x0c\x12\r\n\x05value\x18\x02 \x01(\x0c\x12\x14\n\x0ctimeReceived\x18\x05 \x01(\t\"\xa2\x04\n\x07Message\x12\"\n\x04type\x18\x01 \x01(\x0e\x32\x14.Message.MessageType\x12\x17\n\x0f\x63lusterLevelRaw\x18\n \x01(\x05\x12\x0b\n\x03key\x18\x02 \x01(\x0c\x12\x17\n\x06record\x18\x03 \x01(\x0b\x32\x07.Record\x12\"\n\x0b\x63loserPeers\x18\x08 \x03(\x0b\x32\r.Message.Peer\x12$\n\rproviderPeers\x18\t \x03(\x0b\x32\r.Message.Peer\x12\x19\n\x0csenderRecord\x18\x0b \x01(\x0cH\x00\x88\x01\x01\x1az\n\x04Peer\x12\n\n\x02id\x18\x01 \x01(\x0c\x12\r\n\x05\x61\x64\x64rs\x18\x02 \x03(\x0c\x12+\n\nconnection\x18\x03 \x01(\x0e\x32\x17.Message.ConnectionType\x12\x19\n\x0csignedRecord\x18\x04 \x01(\x0cH\x00\x88\x01\x01\x42\x0f\n\r_signedRecord\"i\n\x0bMessageType\x12\r\n\tPUT_VALUE\x10\x00\x12\r\n\tGET_VALUE\x10\x01\x12\x10\n\x0c\x41\x44\x44_PROVIDER\x10\x02\x12\x11\n\rGET_PROVIDERS\x10\x03\x12\r\n\tFIND_NODE\x10\x04\x12\x08\n\x04PING\x10\x05\"W\n\x0e\x43onnectionType\x12\x11\n\rNOT_CONNECTED\x10\x00\x12\r\n\tCONNECTED\x10\x01\x12\x0f\n\x0b\x43\x41N_CONNECT\x10\x02\x12\x12\n\x0e\x43\x41NNOT_CONNECT\x10\x03\x42\x0f\n\r_senderRecordb\x06proto3')
|
||||||
|
|
||||||
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
|
_globals = globals()
|
||||||
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'libp2p.kad_dht.pb.kademlia_pb2', globals())
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
||||||
|
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'libp2p.kad_dht.pb.kademlia_pb2', _globals)
|
||||||
if _descriptor._USE_C_DESCRIPTORS == False:
|
if _descriptor._USE_C_DESCRIPTORS == False:
|
||||||
|
|
||||||
DESCRIPTOR._options = None
|
DESCRIPTOR._options = None
|
||||||
_RECORD._serialized_start=36
|
_globals['_RECORD']._serialized_start=36
|
||||||
_RECORD._serialized_end=94
|
_globals['_RECORD']._serialized_end=94
|
||||||
_MESSAGE._serialized_start=97
|
_globals['_MESSAGE']._serialized_start=97
|
||||||
_MESSAGE._serialized_end=555
|
_globals['_MESSAGE']._serialized_end=643
|
||||||
_MESSAGE_PEER._serialized_start=281
|
_globals['_MESSAGE_PEER']._serialized_start=308
|
||||||
_MESSAGE_PEER._serialized_end=359
|
_globals['_MESSAGE_PEER']._serialized_end=430
|
||||||
_MESSAGE_MESSAGETYPE._serialized_start=361
|
_globals['_MESSAGE_MESSAGETYPE']._serialized_start=432
|
||||||
_MESSAGE_MESSAGETYPE._serialized_end=466
|
_globals['_MESSAGE_MESSAGETYPE']._serialized_end=537
|
||||||
_MESSAGE_CONNECTIONTYPE._serialized_start=468
|
_globals['_MESSAGE_CONNECTIONTYPE']._serialized_start=539
|
||||||
_MESSAGE_CONNECTIONTYPE._serialized_end=555
|
_globals['_MESSAGE_CONNECTIONTYPE']._serialized_end=626
|
||||||
# @@protoc_insertion_point(module_scope)
|
# @@protoc_insertion_point(module_scope)
|
||||||
|
|||||||
@ -1,133 +1,70 @@
|
|||||||
"""
|
from google.protobuf.internal import containers as _containers
|
||||||
@generated by mypy-protobuf. Do not edit manually!
|
from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
|
||||||
isort:skip_file
|
from google.protobuf import descriptor as _descriptor
|
||||||
"""
|
from google.protobuf import message as _message
|
||||||
|
from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as _Mapping, Optional as _Optional, Union as _Union
|
||||||
|
|
||||||
import builtins
|
DESCRIPTOR: _descriptor.FileDescriptor
|
||||||
import collections.abc
|
|
||||||
import google.protobuf.descriptor
|
|
||||||
import google.protobuf.internal.containers
|
|
||||||
import google.protobuf.internal.enum_type_wrapper
|
|
||||||
import google.protobuf.message
|
|
||||||
import sys
|
|
||||||
import typing
|
|
||||||
|
|
||||||
if sys.version_info >= (3, 10):
|
class Record(_message.Message):
|
||||||
import typing as typing_extensions
|
__slots__ = ("key", "value", "timeReceived")
|
||||||
else:
|
KEY_FIELD_NUMBER: _ClassVar[int]
|
||||||
import typing_extensions
|
VALUE_FIELD_NUMBER: _ClassVar[int]
|
||||||
|
TIMERECEIVED_FIELD_NUMBER: _ClassVar[int]
|
||||||
|
key: bytes
|
||||||
|
value: bytes
|
||||||
|
timeReceived: str
|
||||||
|
def __init__(self, key: _Optional[bytes] = ..., value: _Optional[bytes] = ..., timeReceived: _Optional[str] = ...) -> None: ...
|
||||||
|
|
||||||
DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
|
class Message(_message.Message):
|
||||||
|
__slots__ = ("type", "clusterLevelRaw", "key", "record", "closerPeers", "providerPeers", "senderRecord")
|
||||||
@typing.final
|
class MessageType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||||
class Record(google.protobuf.message.Message):
|
__slots__ = ()
|
||||||
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
PUT_VALUE: _ClassVar[Message.MessageType]
|
||||||
|
GET_VALUE: _ClassVar[Message.MessageType]
|
||||||
KEY_FIELD_NUMBER: builtins.int
|
ADD_PROVIDER: _ClassVar[Message.MessageType]
|
||||||
VALUE_FIELD_NUMBER: builtins.int
|
GET_PROVIDERS: _ClassVar[Message.MessageType]
|
||||||
TIMERECEIVED_FIELD_NUMBER: builtins.int
|
FIND_NODE: _ClassVar[Message.MessageType]
|
||||||
key: builtins.bytes
|
PING: _ClassVar[Message.MessageType]
|
||||||
value: builtins.bytes
|
PUT_VALUE: Message.MessageType
|
||||||
timeReceived: builtins.str
|
GET_VALUE: Message.MessageType
|
||||||
def __init__(
|
ADD_PROVIDER: Message.MessageType
|
||||||
self,
|
GET_PROVIDERS: Message.MessageType
|
||||||
*,
|
FIND_NODE: Message.MessageType
|
||||||
key: builtins.bytes = ...,
|
PING: Message.MessageType
|
||||||
value: builtins.bytes = ...,
|
class ConnectionType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
|
||||||
timeReceived: builtins.str = ...,
|
__slots__ = ()
|
||||||
) -> None: ...
|
NOT_CONNECTED: _ClassVar[Message.ConnectionType]
|
||||||
def ClearField(self, field_name: typing.Literal["key", b"key", "timeReceived", b"timeReceived", "value", b"value"]) -> None: ...
|
CONNECTED: _ClassVar[Message.ConnectionType]
|
||||||
|
CAN_CONNECT: _ClassVar[Message.ConnectionType]
|
||||||
global___Record = Record
|
CANNOT_CONNECT: _ClassVar[Message.ConnectionType]
|
||||||
|
NOT_CONNECTED: Message.ConnectionType
|
||||||
@typing.final
|
CONNECTED: Message.ConnectionType
|
||||||
class Message(google.protobuf.message.Message):
|
CAN_CONNECT: Message.ConnectionType
|
||||||
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
CANNOT_CONNECT: Message.ConnectionType
|
||||||
|
class Peer(_message.Message):
|
||||||
class _MessageType:
|
__slots__ = ("id", "addrs", "connection", "signedRecord")
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
ID_FIELD_NUMBER: _ClassVar[int]
|
||||||
V: typing_extensions.TypeAlias = ValueType
|
ADDRS_FIELD_NUMBER: _ClassVar[int]
|
||||||
|
CONNECTION_FIELD_NUMBER: _ClassVar[int]
|
||||||
class _MessageTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Message._MessageType.ValueType], builtins.type):
|
SIGNEDRECORD_FIELD_NUMBER: _ClassVar[int]
|
||||||
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
|
id: bytes
|
||||||
PUT_VALUE: Message._MessageType.ValueType # 0
|
addrs: _containers.RepeatedScalarFieldContainer[bytes]
|
||||||
GET_VALUE: Message._MessageType.ValueType # 1
|
connection: Message.ConnectionType
|
||||||
ADD_PROVIDER: Message._MessageType.ValueType # 2
|
signedRecord: bytes
|
||||||
GET_PROVIDERS: Message._MessageType.ValueType # 3
|
def __init__(self, id: _Optional[bytes] = ..., addrs: _Optional[_Iterable[bytes]] = ..., connection: _Optional[_Union[Message.ConnectionType, str]] = ..., signedRecord: _Optional[bytes] = ...) -> None: ...
|
||||||
FIND_NODE: Message._MessageType.ValueType # 4
|
TYPE_FIELD_NUMBER: _ClassVar[int]
|
||||||
PING: Message._MessageType.ValueType # 5
|
CLUSTERLEVELRAW_FIELD_NUMBER: _ClassVar[int]
|
||||||
|
KEY_FIELD_NUMBER: _ClassVar[int]
|
||||||
class MessageType(_MessageType, metaclass=_MessageTypeEnumTypeWrapper): ...
|
RECORD_FIELD_NUMBER: _ClassVar[int]
|
||||||
PUT_VALUE: Message.MessageType.ValueType # 0
|
CLOSERPEERS_FIELD_NUMBER: _ClassVar[int]
|
||||||
GET_VALUE: Message.MessageType.ValueType # 1
|
PROVIDERPEERS_FIELD_NUMBER: _ClassVar[int]
|
||||||
ADD_PROVIDER: Message.MessageType.ValueType # 2
|
SENDERRECORD_FIELD_NUMBER: _ClassVar[int]
|
||||||
GET_PROVIDERS: Message.MessageType.ValueType # 3
|
type: Message.MessageType
|
||||||
FIND_NODE: Message.MessageType.ValueType # 4
|
clusterLevelRaw: int
|
||||||
PING: Message.MessageType.ValueType # 5
|
key: bytes
|
||||||
|
record: Record
|
||||||
class _ConnectionType:
|
closerPeers: _containers.RepeatedCompositeFieldContainer[Message.Peer]
|
||||||
ValueType = typing.NewType("ValueType", builtins.int)
|
providerPeers: _containers.RepeatedCompositeFieldContainer[Message.Peer]
|
||||||
V: typing_extensions.TypeAlias = ValueType
|
senderRecord: bytes
|
||||||
|
def __init__(self, type: _Optional[_Union[Message.MessageType, str]] = ..., clusterLevelRaw: _Optional[int] = ..., key: _Optional[bytes] = ..., record: _Optional[_Union[Record, _Mapping]] = ..., closerPeers: _Optional[_Iterable[_Union[Message.Peer, _Mapping]]] = ..., providerPeers: _Optional[_Iterable[_Union[Message.Peer, _Mapping]]] = ..., senderRecord: _Optional[bytes] = ...) -> None: ... # type: ignore
|
||||||
class _ConnectionTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[Message._ConnectionType.ValueType], builtins.type):
|
|
||||||
DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor
|
|
||||||
NOT_CONNECTED: Message._ConnectionType.ValueType # 0
|
|
||||||
CONNECTED: Message._ConnectionType.ValueType # 1
|
|
||||||
CAN_CONNECT: Message._ConnectionType.ValueType # 2
|
|
||||||
CANNOT_CONNECT: Message._ConnectionType.ValueType # 3
|
|
||||||
|
|
||||||
class ConnectionType(_ConnectionType, metaclass=_ConnectionTypeEnumTypeWrapper): ...
|
|
||||||
NOT_CONNECTED: Message.ConnectionType.ValueType # 0
|
|
||||||
CONNECTED: Message.ConnectionType.ValueType # 1
|
|
||||||
CAN_CONNECT: Message.ConnectionType.ValueType # 2
|
|
||||||
CANNOT_CONNECT: Message.ConnectionType.ValueType # 3
|
|
||||||
|
|
||||||
@typing.final
|
|
||||||
class Peer(google.protobuf.message.Message):
|
|
||||||
DESCRIPTOR: google.protobuf.descriptor.Descriptor
|
|
||||||
|
|
||||||
ID_FIELD_NUMBER: builtins.int
|
|
||||||
ADDRS_FIELD_NUMBER: builtins.int
|
|
||||||
CONNECTION_FIELD_NUMBER: builtins.int
|
|
||||||
id: builtins.bytes
|
|
||||||
connection: global___Message.ConnectionType.ValueType
|
|
||||||
@property
|
|
||||||
def addrs(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.bytes]: ...
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
*,
|
|
||||||
id: builtins.bytes = ...,
|
|
||||||
addrs: collections.abc.Iterable[builtins.bytes] | None = ...,
|
|
||||||
connection: global___Message.ConnectionType.ValueType = ...,
|
|
||||||
) -> None: ...
|
|
||||||
def ClearField(self, field_name: typing.Literal["addrs", b"addrs", "connection", b"connection", "id", b"id"]) -> None: ...
|
|
||||||
|
|
||||||
TYPE_FIELD_NUMBER: builtins.int
|
|
||||||
CLUSTERLEVELRAW_FIELD_NUMBER: builtins.int
|
|
||||||
KEY_FIELD_NUMBER: builtins.int
|
|
||||||
RECORD_FIELD_NUMBER: builtins.int
|
|
||||||
CLOSERPEERS_FIELD_NUMBER: builtins.int
|
|
||||||
PROVIDERPEERS_FIELD_NUMBER: builtins.int
|
|
||||||
type: global___Message.MessageType.ValueType
|
|
||||||
clusterLevelRaw: builtins.int
|
|
||||||
key: builtins.bytes
|
|
||||||
@property
|
|
||||||
def record(self) -> global___Record: ...
|
|
||||||
@property
|
|
||||||
def closerPeers(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Message.Peer]: ...
|
|
||||||
@property
|
|
||||||
def providerPeers(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Message.Peer]: ...
|
|
||||||
def __init__(
|
|
||||||
self,
|
|
||||||
*,
|
|
||||||
type: global___Message.MessageType.ValueType = ...,
|
|
||||||
clusterLevelRaw: builtins.int = ...,
|
|
||||||
key: builtins.bytes = ...,
|
|
||||||
record: global___Record | None = ...,
|
|
||||||
closerPeers: collections.abc.Iterable[global___Message.Peer] | None = ...,
|
|
||||||
providerPeers: collections.abc.Iterable[global___Message.Peer] | None = ...,
|
|
||||||
) -> None: ...
|
|
||||||
def HasField(self, field_name: typing.Literal["record", b"record"]) -> builtins.bool: ...
|
|
||||||
def ClearField(self, field_name: typing.Literal["closerPeers", b"closerPeers", "clusterLevelRaw", b"clusterLevelRaw", "key", b"key", "providerPeers", b"providerPeers", "record", b"record", "type", b"type"]) -> None: ...
|
|
||||||
|
|
||||||
global___Message = Message
|
|
||||||
|
|||||||
@ -15,12 +15,14 @@ from libp2p.abc import (
|
|||||||
INetStream,
|
INetStream,
|
||||||
IPeerRouting,
|
IPeerRouting,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.envelope import Envelope, consume_envelope
|
||||||
from libp2p.peer.id import (
|
from libp2p.peer.id import (
|
||||||
ID,
|
ID,
|
||||||
)
|
)
|
||||||
from libp2p.peer.peerinfo import (
|
from libp2p.peer.peerinfo import (
|
||||||
PeerInfo,
|
PeerInfo,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.peerstore import create_signed_peer_record
|
||||||
|
|
||||||
from .common import (
|
from .common import (
|
||||||
ALPHA,
|
ALPHA,
|
||||||
@ -255,6 +257,14 @@ class PeerRouting(IPeerRouting):
|
|||||||
find_node_msg.type = Message.MessageType.FIND_NODE
|
find_node_msg.type = Message.MessageType.FIND_NODE
|
||||||
find_node_msg.key = target_key # Set target key directly as bytes
|
find_node_msg.key = target_key # Set target key directly as bytes
|
||||||
|
|
||||||
|
print("MESSAGE GOING TO BE CREATED")
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(), self.host.get_addrs(), self.host.get_private_key()
|
||||||
|
)
|
||||||
|
find_node_msg.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Serialize and send the protobuf message with varint length prefix
|
# Serialize and send the protobuf message with varint length prefix
|
||||||
proto_bytes = find_node_msg.SerializeToString()
|
proto_bytes = find_node_msg.SerializeToString()
|
||||||
logger.debug(
|
logger.debug(
|
||||||
@ -299,6 +309,26 @@ class PeerRouting(IPeerRouting):
|
|||||||
|
|
||||||
# Process closest peers from response
|
# Process closest peers from response
|
||||||
if response_msg.type == Message.MessageType.FIND_NODE:
|
if response_msg.type == Message.MessageType.FIND_NODE:
|
||||||
|
# Consume the sender_signed_peer_record
|
||||||
|
if response_msg.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
response_msg.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating teh Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
for peer_data in response_msg.closerPeers:
|
for peer_data in response_msg.closerPeers:
|
||||||
new_peer_id = ID(peer_data.id)
|
new_peer_id = ID(peer_data.id)
|
||||||
if new_peer_id not in results:
|
if new_peer_id not in results:
|
||||||
@ -311,7 +341,29 @@ class PeerRouting(IPeerRouting):
|
|||||||
addrs = [Multiaddr(addr) for addr in peer_data.addrs]
|
addrs = [Multiaddr(addr) for addr in peer_data.addrs]
|
||||||
self.host.get_peerstore().add_addrs(new_peer_id, addrs, 3600)
|
self.host.get_peerstore().add_addrs(new_peer_id, addrs, 3600)
|
||||||
|
|
||||||
|
# Consume the received closer_peers signed-records
|
||||||
|
if peer_data.HasField("signedRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
peer_data.signedRecord,
|
||||||
|
"libp2p-peer-record",
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error("Failed to update certified-addr-book")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified-addr-book for peer %s: %s", # noqa
|
||||||
|
new_peer_id,
|
||||||
|
e,
|
||||||
|
)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
print("EXCEPTION CAME")
|
||||||
logger.debug(f"Error querying peer {peer} for closest: {e}")
|
logger.debug(f"Error querying peer {peer} for closest: {e}")
|
||||||
|
|
||||||
finally:
|
finally:
|
||||||
@ -345,10 +397,31 @@ class PeerRouting(IPeerRouting):
|
|||||||
|
|
||||||
# Parse protobuf message
|
# Parse protobuf message
|
||||||
kad_message = Message()
|
kad_message = Message()
|
||||||
|
closer_peer_envelope: Envelope | None = None
|
||||||
try:
|
try:
|
||||||
kad_message.ParseFromString(message_bytes)
|
kad_message.ParseFromString(message_bytes)
|
||||||
|
|
||||||
if kad_message.type == Message.MessageType.FIND_NODE:
|
if kad_message.type == Message.MessageType.FIND_NODE:
|
||||||
|
# Consume the sender's signed-peer-record if sent
|
||||||
|
if kad_message.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
kad_message.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
# Get target key directly from protobuf message
|
# Get target key directly from protobuf message
|
||||||
target_key = kad_message.key
|
target_key = kad_message.key
|
||||||
|
|
||||||
@ -361,12 +434,30 @@ class PeerRouting(IPeerRouting):
|
|||||||
response = Message()
|
response = Message()
|
||||||
response.type = Message.MessageType.FIND_NODE
|
response.type = Message.MessageType.FIND_NODE
|
||||||
|
|
||||||
|
# Create sender_signed_peer_record for the response
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
response.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Add peer information to response
|
# Add peer information to response
|
||||||
for peer_id in closest_peers:
|
for peer_id in closest_peers:
|
||||||
peer_proto = response.closerPeers.add()
|
peer_proto = response.closerPeers.add()
|
||||||
peer_proto.id = peer_id.to_bytes()
|
peer_proto.id = peer_id.to_bytes()
|
||||||
peer_proto.connection = Message.ConnectionType.CAN_CONNECT
|
peer_proto.connection = Message.ConnectionType.CAN_CONNECT
|
||||||
|
|
||||||
|
# Add the signed-records of closest_peers if cached
|
||||||
|
closer_peer_envelope = (
|
||||||
|
self.host.get_peerstore().get_peer_record(peer_id)
|
||||||
|
)
|
||||||
|
|
||||||
|
if isinstance(closer_peer_envelope, Envelope):
|
||||||
|
peer_proto.signedRecord = (
|
||||||
|
closer_peer_envelope.marshal_envelope()
|
||||||
|
)
|
||||||
|
|
||||||
# Add addresses if available
|
# Add addresses if available
|
||||||
try:
|
try:
|
||||||
addrs = self.host.get_peerstore().addrs(peer_id)
|
addrs = self.host.get_peerstore().addrs(peer_id)
|
||||||
|
|||||||
@ -22,12 +22,14 @@ from libp2p.abc import (
|
|||||||
from libp2p.custom_types import (
|
from libp2p.custom_types import (
|
||||||
TProtocol,
|
TProtocol,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.envelope import consume_envelope
|
||||||
from libp2p.peer.id import (
|
from libp2p.peer.id import (
|
||||||
ID,
|
ID,
|
||||||
)
|
)
|
||||||
from libp2p.peer.peerinfo import (
|
from libp2p.peer.peerinfo import (
|
||||||
PeerInfo,
|
PeerInfo,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.peerstore import create_signed_peer_record
|
||||||
|
|
||||||
from .common import (
|
from .common import (
|
||||||
ALPHA,
|
ALPHA,
|
||||||
@ -240,11 +242,22 @@ class ProviderStore:
|
|||||||
message.type = Message.MessageType.ADD_PROVIDER
|
message.type = Message.MessageType.ADD_PROVIDER
|
||||||
message.key = key
|
message.key = key
|
||||||
|
|
||||||
|
# Create sender's signed-peer-record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
message.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Add our provider info
|
# Add our provider info
|
||||||
provider = message.providerPeers.add()
|
provider = message.providerPeers.add()
|
||||||
provider.id = self.local_peer_id.to_bytes()
|
provider.id = self.local_peer_id.to_bytes()
|
||||||
provider.addrs.extend(addrs)
|
provider.addrs.extend(addrs)
|
||||||
|
|
||||||
|
# Add the provider's signed-peer-record
|
||||||
|
provider.signedRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Serialize and send the message
|
# Serialize and send the message
|
||||||
proto_bytes = message.SerializeToString()
|
proto_bytes = message.SerializeToString()
|
||||||
await stream.write(varint.encode(len(proto_bytes)))
|
await stream.write(varint.encode(len(proto_bytes)))
|
||||||
@ -276,9 +289,27 @@ class ProviderStore:
|
|||||||
response = Message()
|
response = Message()
|
||||||
response.ParseFromString(response_bytes)
|
response.ParseFromString(response_bytes)
|
||||||
|
|
||||||
# Check response type
|
if response.type == Message.MessageType.ADD_PROVIDER:
|
||||||
response.type == Message.MessageType.ADD_PROVIDER
|
# Consume the sender's signed-peer-record if sent
|
||||||
if response.type:
|
if response.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
response.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the defualt TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
result = True
|
result = True
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@ -380,6 +411,14 @@ class ProviderStore:
|
|||||||
message.type = Message.MessageType.GET_PROVIDERS
|
message.type = Message.MessageType.GET_PROVIDERS
|
||||||
message.key = key
|
message.key = key
|
||||||
|
|
||||||
|
# Create sender's signed-peer-record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
message.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Serialize and send the message
|
# Serialize and send the message
|
||||||
proto_bytes = message.SerializeToString()
|
proto_bytes = message.SerializeToString()
|
||||||
await stream.write(varint.encode(len(proto_bytes)))
|
await stream.write(varint.encode(len(proto_bytes)))
|
||||||
@ -414,6 +453,26 @@ class ProviderStore:
|
|||||||
if response.type != Message.MessageType.GET_PROVIDERS:
|
if response.type != Message.MessageType.GET_PROVIDERS:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
# Consume the sender's signed-peer-record if sent
|
||||||
|
if response.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
response.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the defualt TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the Certified-Addr-Book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
# Extract provider information
|
# Extract provider information
|
||||||
providers = []
|
providers = []
|
||||||
for provider_proto in response.providerPeers:
|
for provider_proto in response.providerPeers:
|
||||||
@ -431,6 +490,30 @@ class ProviderStore:
|
|||||||
|
|
||||||
# Create PeerInfo and add to result
|
# Create PeerInfo and add to result
|
||||||
providers.append(PeerInfo(provider_id, addrs))
|
providers.append(PeerInfo(provider_id, addrs))
|
||||||
|
|
||||||
|
# Consume the provider's signed-peer-record if sent
|
||||||
|
if provider_proto.HasField("signedRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
provider_proto.signedRecord,
|
||||||
|
"libp2p-peer-record",
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record( # noqa
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Failed to update the Certified-Addr-Book"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified-addr-book for peer %s: %s", # noqa
|
||||||
|
provider_id,
|
||||||
|
e,
|
||||||
|
)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"Failed to parse provider info: {e}")
|
logger.warning(f"Failed to parse provider info: {e}")
|
||||||
|
|
||||||
|
|||||||
@ -15,9 +15,11 @@ from libp2p.abc import (
|
|||||||
from libp2p.custom_types import (
|
from libp2p.custom_types import (
|
||||||
TProtocol,
|
TProtocol,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.envelope import consume_envelope
|
||||||
from libp2p.peer.id import (
|
from libp2p.peer.id import (
|
||||||
ID,
|
ID,
|
||||||
)
|
)
|
||||||
|
from libp2p.peer.peerstore import create_signed_peer_record
|
||||||
|
|
||||||
from .common import (
|
from .common import (
|
||||||
DEFAULT_TTL,
|
DEFAULT_TTL,
|
||||||
@ -110,6 +112,14 @@ class ValueStore:
|
|||||||
message = Message()
|
message = Message()
|
||||||
message.type = Message.MessageType.PUT_VALUE
|
message.type = Message.MessageType.PUT_VALUE
|
||||||
|
|
||||||
|
# Create sender's signed-peer-record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
message.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Set message fields
|
# Set message fields
|
||||||
message.key = key
|
message.key = key
|
||||||
message.record.key = key
|
message.record.key = key
|
||||||
@ -155,7 +165,27 @@ class ValueStore:
|
|||||||
|
|
||||||
# Check if response is valid
|
# Check if response is valid
|
||||||
if response.type == Message.MessageType.PUT_VALUE:
|
if response.type == Message.MessageType.PUT_VALUE:
|
||||||
if response.key:
|
# Consume the sender's signed-peer-record if sent
|
||||||
|
if response.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
response.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the certified-addr-book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
|
if response.key == key:
|
||||||
result = True
|
result = True
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@ -231,6 +261,14 @@ class ValueStore:
|
|||||||
message.type = Message.MessageType.GET_VALUE
|
message.type = Message.MessageType.GET_VALUE
|
||||||
message.key = key
|
message.key = key
|
||||||
|
|
||||||
|
# Create sender's signed-peer-record
|
||||||
|
envelope = create_signed_peer_record(
|
||||||
|
self.host.get_id(),
|
||||||
|
self.host.get_addrs(),
|
||||||
|
self.host.get_private_key(),
|
||||||
|
)
|
||||||
|
message.senderRecord = envelope.marshal_envelope()
|
||||||
|
|
||||||
# Serialize and send the protobuf message
|
# Serialize and send the protobuf message
|
||||||
proto_bytes = message.SerializeToString()
|
proto_bytes = message.SerializeToString()
|
||||||
await stream.write(varint.encode(len(proto_bytes)))
|
await stream.write(varint.encode(len(proto_bytes)))
|
||||||
@ -275,6 +313,26 @@ class ValueStore:
|
|||||||
and response.HasField("record")
|
and response.HasField("record")
|
||||||
and response.record.value
|
and response.record.value
|
||||||
):
|
):
|
||||||
|
# Consume the sender's signed-peer-record
|
||||||
|
if response.HasField("senderRecord"):
|
||||||
|
try:
|
||||||
|
# Convert the signed-peer-record(Envelope) from
|
||||||
|
# protobuf bytes
|
||||||
|
envelope, _ = consume_envelope(
|
||||||
|
response.senderRecord, "libp2p-peer-record"
|
||||||
|
)
|
||||||
|
# Use the default TTL of 2 hours (7200 seconds)
|
||||||
|
if not self.host.get_peerstore().consume_peer_record(
|
||||||
|
envelope, 7200
|
||||||
|
):
|
||||||
|
logger.error(
|
||||||
|
"Updating the certified-addr-book was unsuccessful"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
"Error updating the certified addr book for peer: %s", e
|
||||||
|
)
|
||||||
|
|
||||||
logger.debug(
|
logger.debug(
|
||||||
f"Received value for key {key.hex()} from peer {peer_id}"
|
f"Received value for key {key.hex()} from peer {peer_id}"
|
||||||
)
|
)
|
||||||
|
|||||||
@ -23,7 +23,8 @@ from libp2p.crypto.keys import (
|
|||||||
PrivateKey,
|
PrivateKey,
|
||||||
PublicKey,
|
PublicKey,
|
||||||
)
|
)
|
||||||
from libp2p.peer.envelope import Envelope
|
from libp2p.peer.envelope import Envelope, seal_record
|
||||||
|
from libp2p.peer.peer_record import PeerRecord
|
||||||
|
|
||||||
from .id import (
|
from .id import (
|
||||||
ID,
|
ID,
|
||||||
@ -39,6 +40,17 @@ from .peerinfo import (
|
|||||||
PERMANENT_ADDR_TTL = 0
|
PERMANENT_ADDR_TTL = 0
|
||||||
|
|
||||||
|
|
||||||
|
def create_signed_peer_record(
|
||||||
|
peer_id: ID, addrs: list[Multiaddr], pvt_key: PrivateKey
|
||||||
|
) -> Envelope:
|
||||||
|
"""Creates a signed_peer_record wrapped in an Envelope"""
|
||||||
|
record = PeerRecord(peer_id, addrs)
|
||||||
|
envelope = seal_record(record, pvt_key)
|
||||||
|
|
||||||
|
print(envelope)
|
||||||
|
return envelope
|
||||||
|
|
||||||
|
|
||||||
class PeerRecordState:
|
class PeerRecordState:
|
||||||
envelope: Envelope
|
envelope: Envelope
|
||||||
seq: int
|
seq: int
|
||||||
|
|||||||
@ -57,7 +57,10 @@ class TestPeerRouting:
|
|||||||
def mock_host(self):
|
def mock_host(self):
|
||||||
"""Create a mock host for testing."""
|
"""Create a mock host for testing."""
|
||||||
host = Mock()
|
host = Mock()
|
||||||
host.get_id.return_value = create_valid_peer_id("local")
|
key_pair = create_new_key_pair()
|
||||||
|
host.get_id.return_value = ID.from_pubkey(key_pair.public_key)
|
||||||
|
host.get_public_key.return_value = key_pair.public_key
|
||||||
|
host.get_private_key.return_value = key_pair.private_key
|
||||||
host.get_addrs.return_value = [Multiaddr("/ip4/127.0.0.1/tcp/8000")]
|
host.get_addrs.return_value = [Multiaddr("/ip4/127.0.0.1/tcp/8000")]
|
||||||
host.get_peerstore.return_value = Mock()
|
host.get_peerstore.return_value = Mock()
|
||||||
host.new_stream = AsyncMock()
|
host.new_stream = AsyncMock()
|
||||||
|
|||||||
Reference in New Issue
Block a user