33import asyncio
44import contextlib
55import logging
6+ import random
67import time
78from collections .abc import AsyncIterator
89from typing import TYPE_CHECKING , Any , ClassVar , Optional , cast
910
10- from chia_rs .sized_ints import uint64
11+ import dns .asyncresolver
12+ from chia_rs .sized_ints import uint16 , uint64
1113
1214from chia .rpc .rpc_server import StateChangedProtocol , default_get_connections
1315from chia .server .introducer_peers import VettedPeer
1416from chia .server .outbound_message import NodeType
1517from chia .server .server import ChiaServer
1618from chia .server .ws_connection import WSChiaConnection
19+ from chia .types .peer_info import TimestampedPeerInfo
1720from chia .util .task_referencer import create_referenced_task
1821
1922
@@ -32,9 +35,12 @@ def server(self) -> ChiaServer:
3235
3336 return self ._server
3437
35- def __init__ (self , max_peers_to_send : int , recent_peer_threshold : int ):
38+ def __init__ (self , max_peers_to_send : int , recent_peer_threshold : int , default_port : int , dns_servers : list [ str ] ):
3639 self .max_peers_to_send = max_peers_to_send
3740 self .recent_peer_threshold = recent_peer_threshold
41+ self .default_port = uint16 (default_port )
42+ self .dns_servers = dns_servers
43+ self .resolver = dns .asyncresolver .Resolver ()
3844 self ._shut_down = False
3945 self ._server : Optional [ChiaServer ] = None
4046 self .log = logging .getLogger (__name__ )
@@ -121,3 +127,24 @@ async def _vetting_loop(self):
121127 peer .vetted = max (peer .vetted + 1 , 1 )
122128 except Exception as e :
123129 self .log .error (e )
130+
131+ async def get_peers_from_dns (self , num_peers : int ) -> list [TimestampedPeerInfo ]:
132+ if len (self .dns_servers ) == 0 :
133+ return []
134+
135+ peers : list [TimestampedPeerInfo ] = []
136+ dns_address = random .choice (self .dns_servers )
137+ for rdtype in ("A" , "AAAA" ):
138+ result = await self .resolver .resolve (qname = dns_address , rdtype = rdtype , lifetime = 30 )
139+ for ip in result :
140+ peers .append (
141+ TimestampedPeerInfo (
142+ ip .to_text (),
143+ self .default_port ,
144+ uint64 (0 ),
145+ )
146+ )
147+ if len (peers ) > num_peers :
148+ break
149+
150+ return peers
0 commit comments