Skip to content

Commit 2dfee68

Browse files
committed
Refactor bootstrap discovery to use async methods and update bootstrap peers list
1 parent 198208a commit 2dfee68

File tree

4 files changed

+29
-10
lines changed

4 files changed

+29
-10
lines changed

examples/bootstrap/bootstrap.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ def on_peer_discovery(peer_info: PeerInfo) -> None:
2929
logger.info(f" Addresses: {[str(addr) for addr in peer_info.addrs]}")
3030

3131

32-
# Example bootstrap peers ( valid IPFS bootstrap nodes)
32+
# Example bootstrap peers
3333
BOOTSTRAP_PEERS = [
34+
"/dnsaddr/github.com/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
35+
"/dnsaddr/cloudflare.com/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
36+
"/dnsaddr/google.com/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
37+
"/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",
38+
"/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",
3439
"/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
3540
"/ip6/2604:a880:1:20::203:d001/tcp/4001/p2p/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
3641
"/ip4/128.199.219.111/tcp/4001/p2p/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",

libp2p/discovery/bootstrap/bootstrap.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def __init__(self, swarm: INetworkService, bootstrap_addrs: list[str]):
2222
self.bootstrap_addrs = bootstrap_addrs or []
2323
self.discovered_peers: set[str] = set()
2424

25-
def start(self) -> None:
25+
async def start(self) -> None:
2626
"""Process bootstrap addresses and emit peer discovery events."""
2727
logger.debug(
2828
f"Starting bootstrap discovery with "
@@ -34,7 +34,7 @@ def start(self) -> None:
3434

3535
for addr_str in self.bootstrap_addrs:
3636
try:
37-
self._process_bootstrap_addr(addr_str)
37+
await self._process_bootstrap_addr(addr_str)
3838
except Exception as e:
3939
logger.debug(f"Failed to process bootstrap address {addr_str}: {e}")
4040

@@ -43,19 +43,33 @@ def stop(self) -> None:
4343
logger.debug("Stopping bootstrap discovery")
4444
self.discovered_peers.clear()
4545

46-
def _process_bootstrap_addr(self, addr_str: str) -> None:
46+
async def _process_bootstrap_addr(self, addr_str: str) -> None:
4747
"""Convert string address to PeerInfo and add to peerstore."""
4848
try:
4949
multiaddr = Multiaddr(addr_str)
5050
except Exception as e:
5151
logger.debug(f"Invalid multiaddr format '{addr_str}': {e}")
5252
return
53-
53+
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)
61+
62+
def is_dns_addr(self, addr: Multiaddr) -> bool:
63+
"""Check if the address is a DNS address."""
64+
return any(protocol.name == "dnsaddr" for protocol in addr.protocols())
65+
66+
def add_addr(self, addr: Multiaddr) -> None:
67+
"""Add a peer to the peerstore and emit discovery event."""
5468
# Extract peer info from multiaddr
5569
try:
56-
peer_info = info_from_p2p_addr(multiaddr)
70+
peer_info = info_from_p2p_addr(addr)
5771
except Exception as e:
58-
logger.debug(f"Failed to extract peer info from '{addr_str}': {e}")
72+
logger.debug(f"Failed to extract peer info from '{addr}': {e}")
5973
return
6074

6175
# Skip if it's our own peer
@@ -75,4 +89,4 @@ def _process_bootstrap_addr(self, addr_str: str) -> None:
7589
self.discovered_peers.add(str(peer_info.peer_id))
7690

7791
# Emit peer discovery event
78-
peerDiscovery.emit_peer_discovered(peer_info)
92+
peerDiscovery.emit_peer_discovered(peer_info)

libp2p/host/basic_host.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ async def _run() -> AsyncIterator[None]:
178178
self.mDNS.start()
179179
if hasattr(self, "bootstrap") and self.bootstrap is not None:
180180
logger.debug("Starting Bootstrap Discovery")
181-
self.bootstrap.start()
181+
await self.bootstrap.start()
182182
try:
183183
yield
184184
finally:

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ dependencies = [
1919
"exceptiongroup>=1.2.0; python_version < '3.11'",
2020
"grpcio>=1.41.0",
2121
"lru-dict>=1.1.6",
22-
"multiaddr>=0.0.9",
22+
"multiaddr @ git+https://github.com/multiformats/py-multiaddr.git",
2323
"mypy-protobuf>=3.0.0",
2424
"noiseprotocol>=0.3.0",
2525
"protobuf>=4.21.0,<5.0.0",

0 commit comments

Comments
 (0)