32
32
33
33
import cytoolz
34
34
35
+ from lahja import (
36
+ Endpoint ,
37
+ )
38
+
35
39
import rlp
36
40
37
41
from eth_typing import Hash32
56
60
57
61
from cancel_token import CancelToken , OperationCancelled
58
62
63
+ from p2p .events import PeerCandidatesRequest , RandomBootnodeRequest
59
64
from p2p .exceptions import AlreadyWaitingDiscoveryResponse , NoEligibleNodes , UnableToGetDiscV5Ticket
65
+ from p2p .kademlia import to_uris
60
66
from p2p import kademlia
61
67
from p2p import protocol
62
- from p2p .peer import BasePeerPool
63
68
from p2p .service import BaseService
64
69
65
70
if TYPE_CHECKING :
@@ -951,21 +956,48 @@ class DiscoveryService(BaseService):
951
956
_last_lookup : float = 0
952
957
_lookup_interval : int = 30
953
958
954
- def __init__ (self , proto : DiscoveryProtocol , peer_pool : BasePeerPool ,
955
- port : int , token : CancelToken = None ) -> None :
959
+ def __init__ (self ,
960
+ proto : DiscoveryProtocol ,
961
+ port : int ,
962
+ event_bus : Endpoint ,
963
+ token : CancelToken = None ) -> None :
956
964
super ().__init__ (token )
957
965
self .proto = proto
958
- self .peer_pool = peer_pool
959
966
self .port = port
967
+ self ._event_bus = event_bus
960
968
self ._lookup_running = asyncio .Lock ()
961
969
970
+ self .run_daemon_task (self .handle_get_peer_candidates_requests ())
971
+ self .run_daemon_task (self .handle_get_random_bootnode_requests ())
972
+
973
+ async def handle_get_peer_candidates_requests (self ) -> None :
974
+ async for event in self ._event_bus .stream (PeerCandidatesRequest ):
975
+
976
+ self .run_task (self .maybe_lookup_random_node ())
977
+
978
+ nodes = tuple (to_uris (self .proto .get_nodes_to_connect (event .max_candidates )))
979
+
980
+ self .logger .debug2 ("Broadcasting peer candidates (%s)" , nodes )
981
+ self ._event_bus .broadcast (
982
+ event .expected_response_type ()(nodes ),
983
+ event .broadcast_config ()
984
+ )
985
+
986
+ async def handle_get_random_bootnode_requests (self ) -> None :
987
+ async for event in self ._event_bus .stream (RandomBootnodeRequest ):
988
+
989
+ nodes = tuple (to_uris (self .proto .get_random_bootnode ()))
990
+
991
+ self .logger .debug2 ("Broadcasting random boot nodes (%s)" , nodes )
992
+ self ._event_bus .broadcast (
993
+ event .expected_response_type ()(nodes ),
994
+ event .broadcast_config ()
995
+ )
996
+
962
997
async def _run (self ) -> None :
963
998
await self ._start_udp_listener ()
964
- connect_loop_sleep = 2
965
999
self .run_task (self .proto .bootstrap ())
966
- while self .is_operational :
967
- await self .maybe_connect_to_more_peers ()
968
- await self .sleep (connect_loop_sleep )
1000
+ await self .cancel_token .wait ()
969
1001
970
1002
async def _start_udp_listener (self ) -> None :
971
1003
loop = asyncio .get_event_loop ()
@@ -975,22 +1007,6 @@ async def _start_udp_listener(self) -> None:
975
1007
local_addr = ('0.0.0.0' , self .port ),
976
1008
family = socket .AF_INET )
977
1009
978
- async def maybe_connect_to_more_peers (self ) -> None :
979
- """Connect to more peers if we're not yet maxed out to max_peers"""
980
- if self .peer_pool .is_full :
981
- self .logger .debug ("Already connected to %s peers; sleeping" , len (self .peer_pool ))
982
- return
983
-
984
- self .run_task (self .maybe_lookup_random_node ())
985
-
986
- await self .peer_pool .connect_to_nodes (
987
- self .proto .get_nodes_to_connect (self .peer_pool .max_peers ))
988
-
989
- # In some cases (e.g ROPSTEN or private testnets), the discovery table might be full of
990
- # bad peers so if we can't connect to any peers we try a random bootstrap node as well.
991
- if not len (self .peer_pool ):
992
- await self .peer_pool .connect_to_nodes (self .proto .get_random_bootnode ())
993
-
994
1010
async def maybe_lookup_random_node (self ) -> None :
995
1011
if self ._last_lookup + self ._lookup_interval > time .time ():
996
1012
return
0 commit comments