cumulus_client_consensus_aura/collators/slot_based/
mod.rs1use self::{block_builder_task::run_block_builder, collation_task::run_collation_task};
72pub use block_import::{SlotBasedBlockImport, SlotBasedBlockImportHandle};
73use codec::Codec;
74use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface;
75use cumulus_client_consensus_common::{self as consensus_common, ParachainBlockImportMarker};
76use cumulus_client_proof_size_recording::register_proof_size_recording_cleanup;
77use cumulus_primitives_aura::AuraUnincludedSegmentApi;
78use cumulus_primitives_core::{
79 KeyToIncludeInRelayProof, RelayParentOffsetApi, SchedulingV3EnabledApi, TargetBlockRate,
80};
81use cumulus_relay_chain_interface::RelayChainInterface;
82use futures::FutureExt;
83use polkadot_primitives::{CollatorPair, Id as ParaId};
84use sc_client_api::{
85 backend::AuxStore, client::PreCommitActions, BlockBackend, BlockOf, BlockchainEvents,
86 UsageProvider,
87};
88use sc_consensus::BlockImport;
89use sc_network_types::PeerId;
90use sc_utils::mpsc::tracing_unbounded;
91use sp_api::ProvideRuntimeApi;
92use sp_application_crypto::AppPublic;
93use sp_block_builder::BlockBuilder;
94use sp_blockchain::HeaderBackend;
95use sp_consensus::Environment;
96use sp_consensus_aura::AuraApi;
97use sp_core::{crypto::Pair, traits::SpawnEssentialNamed};
98use sp_inherents::CreateInherentDataProviders;
99use sp_keystore::KeystorePtr;
100use sp_runtime::traits::{Block as BlockT, Member};
101use std::{path::PathBuf, sync::Arc, time::Duration};
102
103mod block_builder_task;
104mod block_import;
105mod collation_task;
106mod message;
107mod relay_chain_data_cache;
108mod resubmission;
109mod resubmittable_segment;
110mod scheduling;
111mod slot_timer;
112
113#[cfg(test)]
114mod tests;
115
116pub struct Params<Block, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner> {
118 pub create_inherent_data_providers: CIDP,
122 pub block_import: BI,
124 pub para_client: Arc<Client>,
126 pub para_backend: Arc<Backend>,
128 pub relay_client: RClient,
130 pub code_hash_provider: CHP,
132 pub keystore: KeystorePtr,
134 pub collator_key: CollatorPair,
136 pub collator_peer_id: PeerId,
138 pub para_id: ParaId,
140 pub proposer: Proposer,
142 pub collator_service: CS,
144 pub reinitialize: bool,
146 pub slot_offset: Duration,
149 pub block_import_handle: SlotBasedBlockImportHandle<Block>,
151 pub spawner: Spawner,
153 pub relay_chain_slot_duration: Duration,
155 pub export_pov: Option<PathBuf>,
157 pub max_pov_percentage: Option<u32>,
160}
161
162pub fn run<Block, P, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner>(
164 params: Params<Block, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner>,
165) where
166 Block: BlockT,
167 Client: ProvideRuntimeApi<Block>
168 + BlockOf
169 + AuxStore
170 + HeaderBackend<Block>
171 + BlockBackend<Block>
172 + UsageProvider<Block>
173 + PreCommitActions<Block>
174 + BlockchainEvents<Block>
175 + Send
176 + Sync
177 + 'static,
178 Client::Api: AuraApi<Block, P::Public>
179 + AuraUnincludedSegmentApi<Block>
180 + RelayParentOffsetApi<Block>
181 + TargetBlockRate<Block>
182 + BlockBuilder<Block>
183 + KeyToIncludeInRelayProof<Block>
184 + SchedulingV3EnabledApi<Block>,
185 Backend: sc_client_api::Backend<Block> + 'static,
186 RClient: RelayChainInterface + Clone + 'static,
187 CIDP: CreateInherentDataProviders<Block, ()> + 'static,
188 CIDP::InherentDataProviders: Send,
189 BI: BlockImport<Block> + ParachainBlockImportMarker + Send + Sync + 'static,
190 Proposer: Environment<Block> + Send + Sync + 'static,
191 CS: CollatorServiceInterface<Block> + Send + Sync + Clone + 'static,
192 CHP: consensus_common::ValidationCodeHashProvider<Block::Hash> + Send + Sync + 'static,
193 P: Pair + Send + Sync + 'static,
194 P::Public: AppPublic + Member + Codec,
195 P::Signature: TryFrom<Vec<u8>> + Member + Codec,
196 Spawner: SpawnEssentialNamed + Clone + 'static,
197{
198 let Params {
199 create_inherent_data_providers,
200 block_import,
201 para_client,
202 para_backend,
203 relay_client,
204 code_hash_provider,
205 keystore,
206 collator_key,
207 collator_peer_id,
208 para_id,
209 proposer,
210 collator_service,
211 reinitialize,
212 slot_offset,
213 block_import_handle,
214 spawner,
215 export_pov,
216 relay_chain_slot_duration,
217 max_pov_percentage,
218 } = params;
219
220 register_proof_size_recording_cleanup(para_client.clone());
222
223 let resubmission_backfill_fut = resubmission::run_resubmission_backfill(
224 block_import_handle,
225 relay_client.clone(),
226 para_client.clone(),
227 para_id,
228 );
229
230 let (tx, rx) = tracing_unbounded("mpsc_builder_to_collator", 100);
231 let collator_task_params = collation_task::Params {
232 relay_client: relay_client.clone(),
233 collator_key,
234 para_id,
235 reinitialize,
236 collator_service: collator_service.clone(),
237 collator_receiver: rx,
238 export_pov,
239 };
240
241 let collation_task_fut = run_collation_task::<Block, _, _>(collator_task_params);
242
243 let block_builder_params = block_builder_task::BuilderTaskParams {
244 create_inherent_data_providers,
245 block_import,
246 para_client,
247 para_backend,
248 relay_client,
249 code_hash_provider,
250 keystore,
251 collator_peer_id,
252 para_id,
253 proposer,
254 collator_service,
255 collator_sender: tx,
256 relay_chain_slot_duration,
257 slot_offset,
258 max_pov_percentage,
259 };
260
261 let block_builder_fut =
262 run_block_builder::<Block, P, _, _, _, _, _, _, _, _>(block_builder_params);
263
264 spawner.spawn_essential_blocking(
265 "slot-based-block-builder",
266 Some("slot-based-collator"),
267 block_builder_fut.boxed(),
268 );
269 spawner.spawn_essential_blocking(
270 "slot-based-collation",
271 Some("slot-based-collator"),
272 collation_task_fut.boxed(),
273 );
274 spawner.spawn_essential_blocking(
275 "slot-based-resubmission-backfill",
276 Some("slot-based-collator"),
277 resubmission_backfill_fut.boxed(),
278 );
279}