cumulus_client_consensus_aura/collators/slot_based/
mod.rs1use self::{block_builder_task::run_block_builder, collation_task::run_collation_task};
70pub use block_import::{SlotBasedBlockImport, SlotBasedBlockImportHandle};
71use codec::Codec;
72use consensus_common::ParachainCandidate;
73use cumulus_client_collator::service::ServiceInterface as CollatorServiceInterface;
74use cumulus_client_consensus_common::{self as consensus_common, ParachainBlockImportMarker};
75use cumulus_client_consensus_proposer::ProposerInterface;
76use cumulus_primitives_aura::AuraUnincludedSegmentApi;
77use cumulus_primitives_core::RelayParentOffsetApi;
78use cumulus_relay_chain_interface::RelayChainInterface;
79use futures::FutureExt;
80use polkadot_primitives::{
81 CollatorPair, CoreIndex, Hash as RelayHash, Id as ParaId, ValidationCodeHash,
82};
83use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf, UsageProvider};
84use sc_consensus::BlockImport;
85use sc_utils::mpsc::tracing_unbounded;
86use sp_api::ProvideRuntimeApi;
87use sp_application_crypto::AppPublic;
88use sp_blockchain::HeaderBackend;
89use sp_consensus_aura::AuraApi;
90use sp_core::{crypto::Pair, traits::SpawnNamed};
91use sp_inherents::CreateInherentDataProviders;
92use sp_keystore::KeystorePtr;
93use sp_runtime::traits::{Block as BlockT, Member};
94use std::{path::PathBuf, sync::Arc, time::Duration};
95
96mod block_builder_task;
97mod block_import;
98mod collation_task;
99mod relay_chain_data_cache;
100mod slot_timer;
101
102#[cfg(test)]
103mod tests;
104
105pub struct Params<Block, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner> {
107 pub create_inherent_data_providers: CIDP,
111 pub block_import: BI,
113 pub para_client: Arc<Client>,
115 pub para_backend: Arc<Backend>,
117 pub relay_client: RClient,
119 pub code_hash_provider: CHP,
121 pub keystore: KeystorePtr,
123 pub collator_key: CollatorPair,
125 pub para_id: ParaId,
127 pub proposer: Proposer,
129 pub collator_service: CS,
131 pub authoring_duration: Duration,
133 pub reinitialize: bool,
135 pub slot_offset: Duration,
138 pub block_import_handle: SlotBasedBlockImportHandle<Block>,
140 pub spawner: Spawner,
142 pub relay_chain_slot_duration: Duration,
144 pub export_pov: Option<PathBuf>,
146 pub max_pov_percentage: Option<u32>,
149}
150
151pub fn run<Block, P, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner>(
153 params: Params<Block, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner>,
154) where
155 Block: BlockT,
156 Client: ProvideRuntimeApi<Block>
157 + BlockOf
158 + AuxStore
159 + HeaderBackend<Block>
160 + BlockBackend<Block>
161 + UsageProvider<Block>
162 + Send
163 + Sync
164 + 'static,
165 Client::Api:
166 AuraApi<Block, P::Public> + AuraUnincludedSegmentApi<Block> + RelayParentOffsetApi<Block>,
167 Backend: sc_client_api::Backend<Block> + 'static,
168 RClient: RelayChainInterface + Clone + 'static,
169 CIDP: CreateInherentDataProviders<Block, ()> + 'static,
170 CIDP::InherentDataProviders: Send,
171 BI: BlockImport<Block> + ParachainBlockImportMarker + Send + Sync + 'static,
172 Proposer: ProposerInterface<Block> + Send + Sync + 'static,
173 CS: CollatorServiceInterface<Block> + Send + Sync + Clone + 'static,
174 CHP: consensus_common::ValidationCodeHashProvider<Block::Hash> + Send + 'static,
175 P: Pair + 'static,
176 P::Public: AppPublic + Member + Codec,
177 P::Signature: TryFrom<Vec<u8>> + Member + Codec,
178 Spawner: SpawnNamed,
179{
180 let Params {
181 create_inherent_data_providers,
182 block_import,
183 para_client,
184 para_backend,
185 relay_client,
186 code_hash_provider,
187 keystore,
188 collator_key,
189 para_id,
190 proposer,
191 collator_service,
192 authoring_duration,
193 reinitialize,
194 slot_offset,
195 block_import_handle,
196 spawner,
197 export_pov,
198 relay_chain_slot_duration,
199 max_pov_percentage,
200 } = params;
201
202 let (tx, rx) = tracing_unbounded("mpsc_builder_to_collator", 100);
203 let collator_task_params = collation_task::Params {
204 relay_client: relay_client.clone(),
205 collator_key,
206 para_id,
207 reinitialize,
208 collator_service: collator_service.clone(),
209 collator_receiver: rx,
210 block_import_handle,
211 export_pov,
212 };
213
214 let collation_task_fut = run_collation_task::<Block, _, _>(collator_task_params);
215
216 let block_builder_params = block_builder_task::BuilderTaskParams {
217 create_inherent_data_providers,
218 block_import,
219 para_client,
220 para_backend,
221 relay_client,
222 code_hash_provider,
223 keystore,
224 para_id,
225 proposer,
226 collator_service,
227 authoring_duration,
228 collator_sender: tx,
229 relay_chain_slot_duration,
230 slot_offset,
231 max_pov_percentage,
232 };
233
234 let block_builder_fut =
235 run_block_builder::<Block, P, _, _, _, _, _, _, _, _>(block_builder_params);
236
237 spawner.spawn_blocking(
238 "slot-based-block-builder",
239 Some("slot-based-collator"),
240 block_builder_fut.boxed(),
241 );
242 spawner.spawn_blocking(
243 "slot-based-collation",
244 Some("slot-based-collator"),
245 collation_task_fut.boxed(),
246 );
247}
248
249struct CollatorMessage<Block: BlockT> {
253 pub relay_parent: RelayHash,
255 pub parent_header: Block::Header,
257 pub parachain_candidate: ParachainCandidate<Block>,
259 pub validation_code_hash: ValidationCodeHash,
261 pub core_index: CoreIndex,
263 pub max_pov_size: u32,
265}