99from src .server .server import ChiaServer
1010from src .util .api_decorators import api_request
1111
12+ import asyncio
13+
14+ import logging
15+ log = logging .getLogger (__name__ )
1216
1317class Introducer :
1418 def __init__ (self ):
1519 config_filename = os .path .join (ROOT_DIR , "config" , "config.yaml" )
1620 self .config = yaml .safe_load (open (config_filename , "r" ))["introducer" ]
21+ self .vetted : Dict [bytes32 , bool ] = {}
1722
1823 def set_server (self , server : ChiaServer ):
1924 self .server = server
@@ -23,8 +28,41 @@ async def request_peers(
2328 self , request : RequestPeers
2429 ) -> AsyncGenerator [OutboundMessage , None ]:
2530 max_peers = self .config ["max_peers_to_send" ]
26- peers = self .server .global_connections .peers .get_peers (
27- max_peers , True , self .config ["recent_peer_threshold" ]
31+ rawpeers = self .server .global_connections .peers .get_peers (
32+ max_peers * 2 , True , self .config ["recent_peer_threshold" ]
2833 )
34+
35+ peers = []
36+
37+ for peer in rawpeers :
38+ if peer .get_hash () not in self .vetted :
39+ try :
40+ r , w = await asyncio .open_connection (
41+ peer .host , int (peer .port )
42+ )
43+ w .close ()
44+ except (
45+ ConnectionRefusedError ,
46+ TimeoutError ,
47+ OSError ,
48+ asyncio .TimeoutError ,
49+ ) as e :
50+ log .warning (
51+ f"Could not vet { peer } . { type (e )} { str (e )} "
52+ )
53+ self .vetted [peer .get_hash ()] = False
54+ continue
55+
56+ log .info (f"Have vetted { peer } successfully!" )
57+ self .vetted [peer .get_hash ()] = True
58+
59+ if self .vetted [peer .get_hash ()]:
60+ peers .append (peer )
61+
62+ if len (peers )>= max_peers :
63+ break
64+
65+ log .info (f"Sending vetted { peers } " )
66+
2967 msg = Message ("peers" , Peers (peers ))
3068 yield OutboundMessage (NodeType .FULL_NODE , msg , Delivery .RESPOND )
0 commit comments