Skip to content

Commit e8f397f

Browse files
committed
Impl DHT bootnodes support for templates and tanssi-node
But not for collators nor data preservers
1 parent c4099c1 commit e8f397f

File tree

4 files changed

+113
-7
lines changed

4 files changed

+113
-7
lines changed

chains/container-chains/nodes/frontier/src/service.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ where
204204
let (_, import_queue) = import_queue(&parachain_config, &node_builder);
205205

206206
// Relay chain interface
207-
let (relay_chain_interface, _collator_key) = node_builder
207+
let (relay_chain_interface, _collator_key, start_bootnode_params) = node_builder
208208
.build_relay_chain_interface(&parachain_config, polkadot_config, collator_options.clone())
209209
.await?;
210210

@@ -295,6 +295,7 @@ where
295295
para_id,
296296
relay_chain_interface.clone(),
297297
relay_chain_slot_duration,
298+
start_bootnode_params,
298299
)?;
299300

300301
Ok((node_builder.task_manager, node_builder.client))

chains/container-chains/nodes/simple/src/service.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ where
133133
let (_, import_queue) = import_queue(&parachain_config, &node_builder);
134134

135135
// Relay chain interface
136-
let (relay_chain_interface, _collator_key) = node_builder
136+
let (relay_chain_interface, _collator_key, start_bootnode_params) = node_builder
137137
.build_relay_chain_interface(&parachain_config, polkadot_config, collator_options.clone())
138138
.await?;
139139

@@ -170,6 +170,7 @@ where
170170
para_id,
171171
relay_chain_interface.clone(),
172172
relay_chain_slot_duration,
173+
start_bootnode_params,
173174
)?;
174175

175176
Ok((node_builder.task_manager, node_builder.client))

client/node-common/src/service/node_builder.rs

Lines changed: 76 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@
1515
// along with Tanssi. If not, see <http://www.gnu.org/licenses/>.
1616

1717
use {
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::{
@@ -62,6 +64,10 @@ use {
6264

6365
#[allow(deprecated)]
6466
use 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;
6571
use {sc_transaction_pool_api::TransactionPool, sp_api::StorageProof, sp_core::traits::SpawnNamed};
6672

6773
tp_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+
319336
impl<T: NodeBuilderConfig, SNetwork, STxHandler, SImportQueueService>
320337
NodeBuilder<T, SNetwork, STxHandler, SImportQueueService>
321338
where
@@ -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,

client/service-orchestrator-chain/src/parachain/mod.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
pub mod rpc;
1818

19+
use cumulus_client_bootnodes::{start_bootnode_tasks, StartBootnodeTasksParams};
20+
use node_common::service::node_builder::StartBootnodeParams;
1921
use sc_client_api::TrieCacheContext;
2022
use {
2123
cumulus_client_cli::CollatorOptions,
@@ -326,7 +328,7 @@ where
326328

327329
let (block_import, import_queue) = import_queue(&parachain_config, &node_builder);
328330

329-
let (relay_chain_interface, collator_key) = node_builder
331+
let (relay_chain_interface, collator_key, start_bootnode_params) = node_builder
330332
.build_relay_chain_interface(&parachain_config, polkadot_config, collator_options.clone())
331333
.await?;
332334

@@ -402,6 +404,36 @@ where
402404
prometheus_registry: node_builder.prometheus_registry.as_ref(),
403405
})?;
404406

407+
{
408+
let StartBootnodeParams {
409+
relay_chain_fork_id,
410+
parachain_fork_id,
411+
advertise_non_global_ips,
412+
parachain_public_addresses,
413+
relay_chain_network,
414+
paranode_rx,
415+
embedded_dht_bootnode,
416+
dht_bootnode_discovery,
417+
} = start_bootnode_params;
418+
419+
// Advertise parachain bootnode address in relay chain DHT
420+
start_bootnode_tasks(StartBootnodeTasksParams {
421+
embedded_dht_bootnode,
422+
dht_bootnode_discovery,
423+
para_id,
424+
task_manager: &mut node_builder.task_manager,
425+
relay_chain_interface: relay_chain_interface.clone(),
426+
relay_chain_fork_id,
427+
relay_chain_network,
428+
request_receiver: paranode_rx,
429+
parachain_network: node_builder.network.network.clone(),
430+
advertise_non_global_ips,
431+
parachain_genesis_hash: node_builder.client.chain_info().genesis_hash,
432+
parachain_fork_id,
433+
parachain_public_addresses,
434+
});
435+
}
436+
405437
let orchestrator_chain_interface_builder = OrchestratorChainInProcessInterfaceBuilder {
406438
client: node_builder.client.clone(),
407439
backend: node_builder.backend.clone(),

0 commit comments

Comments
 (0)