From 2c03ac46ea25ec69adf14accab7f51423143b2a8 Mon Sep 17 00:00:00 2001 From: Abhinav Agarwalla <120122716+lla-dane@users.noreply.github.com> Date: Sun, 17 Aug 2025 19:49:19 +0530 Subject: [PATCH] fix: Peer ID verification during dial (#7) --- libp2p/network/swarm.py | 1 + libp2p/transport/quic/transport.py | 3 +-- libp2p/transport/quic/utils.py | 6 +++--- tests/core/transport/quic/test_integration.py | 9 +++++++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/libp2p/network/swarm.py b/libp2p/network/swarm.py index a8680a83..4bc88d5a 100644 --- a/libp2p/network/swarm.py +++ b/libp2p/network/swarm.py @@ -193,6 +193,7 @@ class Swarm(Service, INetworkService): # Dial peer (connection to peer does not yet exist) # Transport dials peer (gets back a raw conn) try: + addr = Multiaddr(f"{addr}/p2p/{peer_id}") raw_conn = await self.transport.dial(addr) except OpenConnectionError as error: logger.debug("fail to dial peer %s over base transport", peer_id) diff --git a/libp2p/transport/quic/transport.py b/libp2p/transport/quic/transport.py index 210b0a7f..fe13e07b 100644 --- a/libp2p/transport/quic/transport.py +++ b/libp2p/transport/quic/transport.py @@ -263,9 +263,8 @@ class QUICTransport(ITransport): remote_peer_id = ID.from_base58(remote_peer_id) if remote_peer_id is None: - # TODO: Peer ID verification during dial logger.error("Unable to derive peer id from multiaddr") - # raise QUICDialError("Unable to derive peer id from multiaddr") + raise QUICDialError("Unable to derive peer id from multiaddr") quic_version = multiaddr_to_quic_version(maddr) # Get appropriate QUIC client configuration diff --git a/libp2p/transport/quic/utils.py b/libp2p/transport/quic/utils.py index 9c5816aa..1aa812bf 100644 --- a/libp2p/transport/quic/utils.py +++ b/libp2p/transport/quic/utils.py @@ -72,9 +72,9 @@ def is_quic_multiaddr(maddr: multiaddr.Multiaddr) -> bool: has_ip = f"/{IP4_PROTOCOL}/" in addr_str or f"/{IP6_PROTOCOL}/" in addr_str has_udp = f"/{UDP_PROTOCOL}/" in addr_str has_quic = ( - addr_str.endswith(f"/{QUIC_V1_PROTOCOL}") - or addr_str.endswith(f"/{QUIC_DRAFT29_PROTOCOL}") - or addr_str.endswith("/quic") + f"/{QUIC_V1_PROTOCOL}" in addr_str + or f"/{QUIC_DRAFT29_PROTOCOL}" in addr_str + or "/quic" in addr_str ) return has_ip and has_udp and has_quic diff --git a/tests/core/transport/quic/test_integration.py b/tests/core/transport/quic/test_integration.py index de859859..5016c996 100644 --- a/tests/core/transport/quic/test_integration.py +++ b/tests/core/transport/quic/test_integration.py @@ -20,6 +20,7 @@ from examples.ping.ping import PING_LENGTH, PING_PROTOCOL_ID from libp2p import new_host from libp2p.abc import INetStream from libp2p.crypto.secp256k1 import create_new_key_pair +from libp2p.peer.id import ID from libp2p.peer.peerinfo import info_from_p2p_addr from libp2p.transport.quic.config import QUICTransportConfig from libp2p.transport.quic.connection import QUICConnection @@ -146,7 +147,9 @@ class TestBasicQUICFlow: # Get server address server_addrs = listener.get_addrs() - server_addr = server_addrs[0] + server_addr = multiaddr.Multiaddr( + f"{server_addrs[0]}/p2p/{ID.from_pubkey(server_key.public_key)}" + ) print(f"🔧 SERVER: Listening on {server_addr}") # Give server a moment to be ready @@ -282,7 +285,9 @@ class TestBasicQUICFlow: success = await listener.listen(listen_addr, nursery) assert success - server_addr = listener.get_addrs()[0] + server_addr = multiaddr.Multiaddr( + f"{listener.get_addrs()[0]}/p2p/{ID.from_pubkey(server_key.public_key)}" + ) print(f"🔧 SERVER: Listening on {server_addr}") # Create client but DON'T open a stream