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:: {
@@ -39,26 +41,32 @@ use {
3941 sp_wasm_interface:: HostFunctions , HeapAllocStrategy , RuntimeVersionOf , WasmExecutor ,
4042 DEFAULT_HEAP_ALLOC_STRATEGY ,
4143 } ,
42- sc_network:: { config:: FullNetworkConfiguration , NetworkBlock } ,
44+ sc_network:: {
45+ config:: FullNetworkConfiguration , request_responses:: IncomingRequest ,
46+ service:: traits:: NetworkService , NetworkBlock ,
47+ } ,
4348 sc_network_sync:: SyncingService ,
4449 sc_network_transactions:: TransactionsHandlerController ,
4550 sc_service:: {
46- Configuration , KeystoreContainer , SpawnTaskHandle , TFullBackend , TFullClient , TaskManager ,
51+ config:: Multiaddr , Configuration , KeystoreContainer , SpawnTaskHandle , TFullBackend ,
52+ TFullClient , TaskManager ,
4753 } ,
4854 sc_telemetry:: { Telemetry , TelemetryWorker , TelemetryWorkerHandle } ,
49- sc_transaction_pool_api:: OffchainTransactionPoolFactory ,
55+ sc_transaction_pool_api:: { OffchainTransactionPoolFactory , TransactionPool } ,
5056 sc_utils:: mpsc:: TracingUnboundedSender ,
51- sp_api:: ConstructRuntimeApi ,
57+ sp_api:: { ConstructRuntimeApi , StorageProof } ,
5258 sp_block_builder:: BlockBuilder ,
5359 sp_consensus:: SelectChain ,
54- sp_core:: traits:: CodeExecutor ,
60+ sp_core:: {
61+ traits:: { CodeExecutor , SpawnNamed } ,
62+ H256 ,
63+ } ,
5564 sp_inherents:: CreateInherentDataProviders ,
5665 sp_offchain:: OffchainWorkerApi ,
5766 sp_runtime:: Percent ,
5867 sp_transaction_pool:: runtime_api:: TaggedTransactionQueue ,
5968 std:: { str:: FromStr , sync:: Arc } ,
6069} ;
61- use { sc_transaction_pool_api:: TransactionPool , sp_api:: StorageProof , sp_core:: traits:: SpawnNamed } ;
6270
6371tp_traits:: alias!(
6472 pub trait MinimalRuntimeApi <
@@ -299,6 +307,18 @@ where
299307 }
300308}
301309
310+ #[ derive( Clone ) ]
311+ pub struct StartBootnodeParams {
312+ pub relay_chain_fork_id : Option < String > ,
313+ pub parachain_fork_id : Option < String > ,
314+ pub advertise_non_global_ips : bool ,
315+ pub parachain_public_addresses : Vec < Multiaddr > ,
316+ pub relay_chain_network : Arc < dyn NetworkService > ,
317+ pub paranode_rx : Receiver < IncomingRequest > ,
318+ pub embedded_dht_bootnode : bool ,
319+ pub dht_bootnode_discovery : bool ,
320+ }
321+
302322impl < T : NodeBuilderConfig , SNetwork , STxHandler , SImportQueueService >
303323 NodeBuilder < T , SNetwork , STxHandler , SImportQueueService >
304324where
@@ -314,9 +334,20 @@ where
314334 ) -> sc_service:: error:: Result < (
315335 Arc < ( dyn RelayChainInterface + ' static ) > ,
316336 Option < CollatorPair > ,
337+ StartBootnodeParams ,
317338 ) > {
318- // FIXME(MD-1374): support DHT bootnodes
319- let ( relay_chain_interface, collator_key, _relay_chain_network, _paranode_rx) =
339+ let relay_chain_fork_id = polkadot_config
340+ . chain_spec
341+ . fork_id ( )
342+ . map ( ToString :: to_string) ;
343+ let parachain_fork_id = parachain_config
344+ . chain_spec
345+ . fork_id ( )
346+ . map ( ToString :: to_string) ;
347+ let advertise_non_global_ips = parachain_config. network . allow_non_globals_in_dht ;
348+ let parachain_public_addresses = parachain_config. network . public_addresses . clone ( ) ;
349+
350+ let ( relay_chain_interface, collator_key, relay_chain_network, paranode_rx) =
320351 build_relay_chain_interface (
321352 polkadot_config,
322353 parachain_config,
@@ -328,7 +359,18 @@ where
328359 . await
329360 . map_err ( |e| sc_service:: Error :: Application ( Box :: new ( e) as Box < _ > ) ) ?;
330361
331- Ok ( ( relay_chain_interface, collator_key) )
362+ let start_bootnode_params = StartBootnodeParams {
363+ relay_chain_fork_id,
364+ parachain_fork_id,
365+ advertise_non_global_ips,
366+ parachain_public_addresses,
367+ relay_chain_network,
368+ paranode_rx,
369+ embedded_dht_bootnode : collator_options. embedded_dht_bootnode ,
370+ dht_bootnode_discovery : collator_options. dht_bootnode_discovery ,
371+ } ;
372+
373+ Ok ( ( relay_chain_interface, collator_key, start_bootnode_params) )
332374 }
333375
334376 /// Given an import queue, calls [`cumulus_client_service::build_network`] and
@@ -716,11 +758,14 @@ where
716758 para_id : ParaId ,
717759 relay_chain_interface : RCInterface ,
718760 relay_chain_slot_duration : Duration ,
761+ start_bootnode_params : StartBootnodeParams ,
719762 ) -> sc_service:: error:: Result < NodeBuilder < T , SNetwork , STxHandler , ( ) > >
720763 where
721764 SNetwork : TypeIdentity < Type = Network < BlockOf < T > > > ,
722765 SImportQueueService : TypeIdentity < Type = ImportQueueServiceOf < T > > ,
723766 RCInterface : RelayChainInterface + Clone + ' static ,
767+ RCInterface : TypeIdentity < Type = Arc < dyn RelayChainInterface + ' static > > ,
768+ BlockHashOf < T > : TypeIdentity < Type = H256 > ,
724769 {
725770 let NodeBuilder {
726771 client,
@@ -754,7 +799,7 @@ where
754799 announce_block,
755800 task_manager : & mut task_manager,
756801 para_id,
757- relay_chain_interface,
802+ relay_chain_interface : relay_chain_interface . clone ( ) ,
758803 relay_chain_slot_duration,
759804 import_queue : import_queue_service,
760805 recovery_handle : Box :: new ( overseer_handle) ,
@@ -763,9 +808,39 @@ where
763808 } ;
764809
765810 // TODO: change for async backing
811+ // TODO: to fix deprecation warning, we only need to change
812+ // `start_full_node` to `start_relay_chain_tasks`
766813 #[ allow( deprecated) ]
767814 cumulus_client_service:: start_full_node ( params) ?;
768815
816+ let StartBootnodeParams {
817+ relay_chain_fork_id,
818+ parachain_fork_id,
819+ advertise_non_global_ips,
820+ parachain_public_addresses,
821+ relay_chain_network,
822+ paranode_rx,
823+ embedded_dht_bootnode,
824+ dht_bootnode_discovery,
825+ } = start_bootnode_params;
826+
827+ // Advertise parachain bootnode address in relay chain DHT
828+ start_bootnode_tasks ( StartBootnodeTasksParams {
829+ embedded_dht_bootnode,
830+ dht_bootnode_discovery,
831+ para_id,
832+ task_manager : & mut task_manager,
833+ relay_chain_interface : TypeIdentity :: into_type ( relay_chain_interface) ,
834+ relay_chain_fork_id,
835+ relay_chain_network,
836+ request_receiver : paranode_rx,
837+ parachain_network : network. network . clone ( ) ,
838+ advertise_non_global_ips,
839+ parachain_genesis_hash : TypeIdentity :: into_type ( client. chain_info ( ) . genesis_hash ) ,
840+ parachain_fork_id,
841+ parachain_public_addresses,
842+ } ) ;
843+
769844 Ok ( NodeBuilder {
770845 client,
771846 backend,
0 commit comments