|
1 | 1 | import logging
|
2 | 2 |
|
3 | 3 | from multiaddr import Multiaddr
|
| 4 | +from multiaddr.resolvers import DNSResolver |
4 | 5 |
|
5 |
| -from libp2p.abc import INetworkService |
| 6 | +from libp2p.abc import ID, INetworkService, PeerInfo |
6 | 7 | from libp2p.discovery.bootstrap.utils import validate_bootstrap_addresses
|
7 | 8 | from libp2p.discovery.events.peerDiscovery import peerDiscovery
|
8 | 9 | from libp2p.peer.peerinfo import info_from_p2p_addr
|
9 | 10 |
|
10 | 11 | logger = logging.getLogger("libp2p.discovery.bootstrap")
|
| 12 | +resolver = DNSResolver() |
11 | 13 |
|
12 | 14 |
|
13 | 15 | class BootstrapDiscovery:
|
@@ -51,27 +53,24 @@ async def _process_bootstrap_addr(self, addr_str: str) -> None:
|
51 | 53 | logger.debug(f"Invalid multiaddr format '{addr_str}': {e}")
|
52 | 54 | return
|
53 | 55 | if self.is_dns_addr(multiaddr):
|
54 |
| - resolved_addrs = await multiaddr.resolve() |
55 |
| - for resolved_addr in resolved_addrs: |
56 |
| - if resolved_addr == multiaddr: |
57 |
| - return |
58 |
| - self.add_addr(Multiaddr(resolved_addr)) |
59 |
| - |
60 |
| - self.add_addr(multiaddr) |
| 56 | + resolved_addrs = await resolver.resolve(multiaddr) |
| 57 | + peer_id_str = multiaddr.get_peer_id() |
| 58 | + if peer_id_str is None: |
| 59 | + logger.warning(f"Missing peer ID in DNS address: {addr_str}") |
| 60 | + return |
| 61 | + peer_id = ID.from_base58(peer_id_str) |
| 62 | + addrs = [addr for addr in resolved_addrs] |
| 63 | + peer_info = PeerInfo(peer_id, addrs) |
| 64 | + self.add_addr(peer_info) |
| 65 | + else: |
| 66 | + self.add_addr(info_from_p2p_addr(multiaddr)) |
61 | 67 |
|
62 | 68 | def is_dns_addr(self, addr: Multiaddr) -> bool:
|
63 | 69 | """Check if the address is a DNS address."""
|
64 | 70 | return any(protocol.name == "dnsaddr" for protocol in addr.protocols())
|
65 | 71 |
|
66 |
| - def add_addr(self, addr: Multiaddr) -> None: |
| 72 | + def add_addr(self, peer_info: PeerInfo) -> None: |
67 | 73 | """Add a peer to the peerstore and emit discovery event."""
|
68 |
| - # Extract peer info from multiaddr |
69 |
| - try: |
70 |
| - peer_info = info_from_p2p_addr(addr) |
71 |
| - except Exception as e: |
72 |
| - logger.debug(f"Failed to extract peer info from '{addr}': {e}") |
73 |
| - return |
74 |
| - |
75 | 74 | # Skip if it's our own peer
|
76 | 75 | if peer_info.peer_id == self.swarm.get_peer_id():
|
77 | 76 | logger.debug(f"Skipping own peer ID: {peer_info.peer_id}")
|
|
0 commit comments