cumulus_client_bootnodes/
task.rs1use crate::{
21 advertisement::{BootnodeAdvertisement, BootnodeAdvertisementParams},
22 config::paranode_protocol_name,
23 discovery::{BootnodeDiscovery, BootnodeDiscoveryParams},
24};
25use cumulus_primitives_core::{relay_chain::BlockId, ParaId};
26use cumulus_relay_chain_interface::RelayChainInterface;
27use log::{debug, error};
28use num_traits::Zero;
29use parachains_common::Hash as ParaHash;
30use sc_network::{request_responses::IncomingRequest, service::traits::NetworkService, Multiaddr};
31use sc_service::TaskManager;
32use std::sync::Arc;
33
34const LOG_TARGET: &str = "bootnodes";
36
37pub struct StartBootnodeTasksParams<'a> {
39 pub embedded_dht_bootnode: bool,
41 pub dht_bootnode_discovery: bool,
43 pub para_id: ParaId,
45 pub task_manager: &'a mut TaskManager,
47 pub relay_chain_interface: Arc<dyn RelayChainInterface>,
49 pub relay_chain_fork_id: Option<String>,
51 pub relay_chain_network: Arc<dyn NetworkService>,
53 pub request_receiver: async_channel::Receiver<IncomingRequest>,
55 pub parachain_network: Arc<dyn NetworkService>,
57 pub advertise_non_global_ips: bool,
59 pub parachain_genesis_hash: ParaHash,
61 pub parachain_fork_id: Option<String>,
63 pub parachain_public_addresses: Vec<Multiaddr>,
65}
66
67async fn bootnode_advertisement(
68 para_id: ParaId,
69 relay_chain_interface: Arc<dyn RelayChainInterface>,
70 relay_chain_network: Arc<dyn NetworkService>,
71 request_receiver: async_channel::Receiver<IncomingRequest>,
72 parachain_network: Arc<dyn NetworkService>,
73 advertise_non_global_ips: bool,
74 parachain_genesis_hash: ParaHash,
75 parachain_fork_id: Option<String>,
76 public_addresses: Vec<Multiaddr>,
77) {
78 let bootnode_advertisement = BootnodeAdvertisement::new(BootnodeAdvertisementParams {
79 para_id,
80 relay_chain_interface,
81 relay_chain_network,
82 request_receiver,
83 parachain_network,
84 advertise_non_global_ips,
85 parachain_genesis_hash,
86 parachain_fork_id,
87 public_addresses,
88 });
89
90 if let Err(e) = bootnode_advertisement.run().await {
91 error!(target: LOG_TARGET, "Bootnode advertisement terminated with error: {e}");
92 }
93}
94
95async fn bootnode_discovery(
96 para_id: ParaId,
97 parachain_network: Arc<dyn NetworkService>,
98 parachain_genesis_hash: ParaHash,
99 parachain_fork_id: Option<String>,
100 relay_chain_interface: Arc<dyn RelayChainInterface>,
101 relay_chain_fork_id: Option<String>,
102 relay_chain_network: Arc<dyn NetworkService>,
103) {
104 let relay_chain_genesis_hash =
105 match relay_chain_interface.header(BlockId::Number(Zero::zero())).await {
106 Ok(Some(header)) => header.hash().as_bytes().to_vec(),
107 Ok(None) => {
108 error!(
109 target: LOG_TARGET,
110 "Bootnode discovery: relay chain genesis hash does not exist",
111 );
112 return;
114 },
115 Err(e) => {
116 error!(
117 target: LOG_TARGET,
118 "Bootnode discovery: failed to obtain relay chain genesis hash: {e}",
119 );
120 return;
122 },
123 };
124
125 let paranode_protocol_name =
126 paranode_protocol_name(relay_chain_genesis_hash, relay_chain_fork_id.as_deref());
127
128 let bootnode_discovery = BootnodeDiscovery::new(BootnodeDiscoveryParams {
129 para_id,
130 parachain_network,
131 parachain_genesis_hash,
132 parachain_fork_id,
133 relay_chain_interface,
134 relay_chain_network,
135 paranode_protocol_name,
136 });
137
138 match bootnode_discovery.run().await {
139 Ok(()) => std::future::pending().await,
141 Err(e) => error!(target: LOG_TARGET, "Bootnode discovery terminated with error: {e}"),
142 }
143}
144
145pub fn start_bootnode_tasks(
147 StartBootnodeTasksParams {
148 embedded_dht_bootnode,
149 dht_bootnode_discovery,
150 para_id,
151 task_manager,
152 relay_chain_interface,
153 relay_chain_fork_id,
154 relay_chain_network,
155 request_receiver,
156 parachain_network,
157 advertise_non_global_ips,
158 parachain_genesis_hash,
159 parachain_fork_id,
160 parachain_public_addresses,
161 }: StartBootnodeTasksParams,
162) {
163 debug!(
164 target: LOG_TARGET,
165 "Embedded DHT bootnode enabled: {embedded_dht_bootnode}; \
166 DHT bootnode discovery enabled: {dht_bootnode_discovery}",
167 );
168
169 if embedded_dht_bootnode {
170 task_manager.spawn_essential_handle().spawn(
171 "cumulus-dht-bootnode-advertisement",
172 None,
173 bootnode_advertisement(
174 para_id,
175 relay_chain_interface.clone(),
176 relay_chain_network.clone(),
177 request_receiver,
178 parachain_network.clone(),
179 advertise_non_global_ips,
180 parachain_genesis_hash,
181 parachain_fork_id.clone(),
182 parachain_public_addresses,
183 ),
184 );
185 }
186
187 if dht_bootnode_discovery {
188 task_manager.spawn_essential_handle().spawn(
189 "cumulus-dht-bootnode-discovery",
190 None,
191 bootnode_discovery(
192 para_id,
193 parachain_network,
194 parachain_genesis_hash,
195 parachain_fork_id,
196 relay_chain_interface,
197 relay_chain_fork_id,
198 relay_chain_network,
199 ),
200 );
201 }
202}