1515// along with Tanssi. If not, see <http://www.gnu.org/licenses/>.
1616
1717use {
18+ async_channel:: Receiver ,
1819 async_io:: Timer ,
1920 core:: time:: Duration ,
2021 core_extensions:: TypeIdentity ,
22+ cumulus_client_bootnodes:: { start_bootnode_tasks, StartBootnodeTasksParams } ,
2123 cumulus_client_cli:: CollatorOptions ,
2224 cumulus_client_consensus_common:: ParachainConsensus ,
2325 cumulus_client_service:: {
6264
6365#[ allow( deprecated) ]
6466use sc_executor:: NativeElseWasmExecutor ;
67+ use sc_network:: request_responses:: IncomingRequest ;
68+ use sc_network:: service:: traits:: NetworkService ;
69+ use sc_service:: config:: Multiaddr ;
70+ use sp_core:: H256 ;
6571use { sc_transaction_pool_api:: TransactionPool , sp_api:: StorageProof , sp_core:: traits:: SpawnNamed } ;
6672
6773tp_traits:: alias!(
@@ -316,6 +322,17 @@ where
316322 }
317323}
318324
325+ pub struct StartBootnodeParams {
326+ pub relay_chain_fork_id : Option < String > ,
327+ pub parachain_fork_id : Option < String > ,
328+ pub advertise_non_global_ips : bool ,
329+ pub parachain_public_addresses : Vec < Multiaddr > ,
330+ pub relay_chain_network : Arc < dyn NetworkService > ,
331+ pub paranode_rx : Receiver < IncomingRequest > ,
332+ pub embedded_dht_bootnode : bool ,
333+ pub dht_bootnode_discovery : bool ,
334+ }
335+
319336impl < T : NodeBuilderConfig , SNetwork , STxHandler , SImportQueueService >
320337 NodeBuilder < T , SNetwork , STxHandler , SImportQueueService >
321338where
@@ -331,9 +348,20 @@ where
331348 ) -> sc_service:: error:: Result < (
332349 Arc < ( dyn RelayChainInterface + ' static ) > ,
333350 Option < CollatorPair > ,
351+ StartBootnodeParams ,
334352 ) > {
335- // FIXME(MD-1374): support DHT bootnodes
336- let ( relay_chain_interface, collator_key, _relay_chain_network, _paranode_rx) =
353+ let relay_chain_fork_id = polkadot_config
354+ . chain_spec
355+ . fork_id ( )
356+ . map ( ToString :: to_string) ;
357+ let parachain_fork_id = parachain_config
358+ . chain_spec
359+ . fork_id ( )
360+ . map ( ToString :: to_string) ;
361+ let advertise_non_global_ips = parachain_config. network . allow_non_globals_in_dht ;
362+ let parachain_public_addresses = parachain_config. network . public_addresses . clone ( ) ;
363+
364+ let ( relay_chain_interface, collator_key, relay_chain_network, paranode_rx) =
337365 build_relay_chain_interface (
338366 polkadot_config,
339367 parachain_config,
@@ -345,7 +373,18 @@ where
345373 . await
346374 . map_err ( |e| sc_service:: Error :: Application ( Box :: new ( e) as Box < _ > ) ) ?;
347375
348- Ok ( ( relay_chain_interface, collator_key) )
376+ let start_bootnode_params = StartBootnodeParams {
377+ relay_chain_fork_id,
378+ parachain_fork_id,
379+ advertise_non_global_ips,
380+ parachain_public_addresses,
381+ relay_chain_network,
382+ paranode_rx,
383+ embedded_dht_bootnode : collator_options. embedded_dht_bootnode ,
384+ dht_bootnode_discovery : collator_options. dht_bootnode_discovery ,
385+ } ;
386+
387+ Ok ( ( relay_chain_interface, collator_key, start_bootnode_params) )
349388 }
350389
351390 /// Given an import queue, calls [`cumulus_client_service::build_network`] and
@@ -733,11 +772,14 @@ where
733772 para_id : ParaId ,
734773 relay_chain_interface : RCInterface ,
735774 relay_chain_slot_duration : Duration ,
775+ start_bootnode_params : StartBootnodeParams ,
736776 ) -> sc_service:: error:: Result < NodeBuilder < T , SNetwork , STxHandler , ( ) > >
737777 where
738778 SNetwork : TypeIdentity < Type = Network < BlockOf < T > > > ,
739779 SImportQueueService : TypeIdentity < Type = ImportQueueServiceOf < T > > ,
740780 RCInterface : RelayChainInterface + Clone + ' static ,
781+ RCInterface : TypeIdentity < Type = Arc < dyn RelayChainInterface + ' static > > ,
782+ BlockHashOf < T > : TypeIdentity < Type = H256 > ,
741783 {
742784 let NodeBuilder {
743785 client,
@@ -771,7 +813,7 @@ where
771813 announce_block,
772814 task_manager : & mut task_manager,
773815 para_id,
774- relay_chain_interface,
816+ relay_chain_interface : relay_chain_interface . clone ( ) ,
775817 relay_chain_slot_duration,
776818 import_queue : import_queue_service,
777819 recovery_handle : Box :: new ( overseer_handle) ,
@@ -780,9 +822,39 @@ where
780822 } ;
781823
782824 // TODO: change for async backing
825+ // TODO: to fix deprecation warning, we only need to change
826+ // `start_full_node` to `start_relay_chain_tasks`
783827 #[ allow( deprecated) ]
784828 cumulus_client_service:: start_full_node ( params) ?;
785829
830+ let StartBootnodeParams {
831+ relay_chain_fork_id,
832+ parachain_fork_id,
833+ advertise_non_global_ips,
834+ parachain_public_addresses,
835+ relay_chain_network,
836+ paranode_rx,
837+ embedded_dht_bootnode,
838+ dht_bootnode_discovery,
839+ } = start_bootnode_params;
840+
841+ // Advertise parachain bootnode address in relay chain DHT
842+ start_bootnode_tasks ( StartBootnodeTasksParams {
843+ embedded_dht_bootnode,
844+ dht_bootnode_discovery,
845+ para_id,
846+ task_manager : & mut task_manager,
847+ relay_chain_interface : TypeIdentity :: into_type ( relay_chain_interface) ,
848+ relay_chain_fork_id,
849+ relay_chain_network,
850+ request_receiver : paranode_rx,
851+ parachain_network : network. network . clone ( ) ,
852+ advertise_non_global_ips,
853+ parachain_genesis_hash : TypeIdentity :: into_type ( client. chain_info ( ) . genesis_hash ) ,
854+ parachain_fork_id,
855+ parachain_public_addresses,
856+ } ) ;
857+
786858 Ok ( NodeBuilder {
787859 client,
788860 backend,
0 commit comments