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_primitives_aura::AuraUnincludedSegmentApi;
76use cumulus_primitives_core::RelayParentOffsetApi;
77use cumulus_relay_chain_interface::RelayChainInterface;
78use futures::FutureExt;
79use polkadot_primitives::{
80 CollatorPair, CoreIndex, Hash as RelayHash, Id as ParaId, ValidationCodeHash,
81};
82use sc_client_api::{backend::AuxStore, BlockBackend, BlockOf, UsageProvider};
83use sc_consensus::BlockImport;
84use sc_network_types::PeerId;
85use sc_utils::mpsc::tracing_unbounded;
86use sp_api::ProvideRuntimeApi;
87use sp_application_crypto::AppPublic;
88use sp_blockchain::HeaderBackend;
89use sp_consensus::Environment;
90use sp_consensus_aura::AuraApi;
91use sp_core::{crypto::Pair, traits::SpawnEssentialNamed};
92use sp_inherents::CreateInherentDataProviders;
93use sp_keystore::KeystorePtr;
94use sp_runtime::traits::{Block as BlockT, Member};
95use std::{path::PathBuf, sync::Arc, time::Duration};
96
97mod block_builder_task;
98mod block_import;
99mod collation_task;
100mod relay_chain_data_cache;
101mod slot_timer;
102
103#[cfg(test)]
104mod tests;
105
106pub struct Params<Block, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner> {
108 pub create_inherent_data_providers: CIDP,
112 pub block_import: BI,
114 pub para_client: Arc<Client>,
116 pub para_backend: Arc<Backend>,
118 pub relay_client: RClient,
120 pub code_hash_provider: CHP,
122 pub keystore: KeystorePtr,
124 pub collator_key: CollatorPair,
126 pub collator_peer_id: PeerId,
128 pub para_id: ParaId,
130 pub proposer: Proposer,
132 pub collator_service: CS,
134 pub authoring_duration: Duration,
136 pub reinitialize: bool,
138 pub slot_offset: Duration,
141 pub block_import_handle: SlotBasedBlockImportHandle<Block>,
143 pub spawner: Spawner,
145 pub relay_chain_slot_duration: Duration,
147 pub export_pov: Option<PathBuf>,
149 pub max_pov_percentage: Option<u32>,
152}
153
154pub fn run<Block, P, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner>(
156 params: Params<Block, BI, CIDP, Client, Backend, RClient, CHP, Proposer, CS, Spawner>,
157) where
158 Block: BlockT,
159 Client: ProvideRuntimeApi<Block>
160 + BlockOf
161 + AuxStore
162 + HeaderBackend<Block>
163 + BlockBackend<Block>
164 + UsageProvider<Block>
165 + Send
166 + Sync
167 + 'static,
168 Client::Api:
169 AuraApi<Block, P::Public> + AuraUnincludedSegmentApi<Block> + RelayParentOffsetApi<Block>,
170 Backend: sc_client_api::Backend<Block> + 'static,
171 RClient: RelayChainInterface + Clone + 'static,
172 CIDP: CreateInherentDataProviders<Block, ()> + 'static,
173 CIDP::InherentDataProviders: Send,
174 BI: BlockImport<Block> + ParachainBlockImportMarker + Send + Sync + 'static,
175 Proposer: Environment<Block> + Send + Sync + 'static,
176 CS: CollatorServiceInterface<Block> + Send + Sync + Clone + 'static,
177 CHP: consensus_common::ValidationCodeHashProvider<Block::Hash> + Send + 'static,
178 P: Pair + Send + Sync + 'static,
179 P::Public: AppPublic + Member + Codec,
180 P::Signature: TryFrom<Vec<u8>> + Member + Codec,
181 Spawner: SpawnEssentialNamed + Clone + 'static,
182{
183 let Params {
184 create_inherent_data_providers,
185 block_import,
186 para_client,
187 para_backend,
188 relay_client,
189 code_hash_provider,
190 keystore,
191 collator_key,
192 collator_peer_id,
193 para_id,
194 proposer,
195 collator_service,
196 authoring_duration,
197 reinitialize,
198 slot_offset,
199 block_import_handle,
200 spawner,
201 export_pov,
202 relay_chain_slot_duration,
203 max_pov_percentage,
204 } = params;
205
206 let (tx, rx) = tracing_unbounded("mpsc_builder_to_collator", 100);
207 let collator_task_params = collation_task::Params {
208 relay_client: relay_client.clone(),
209 collator_key,
210 para_id,
211 reinitialize,
212 collator_service: collator_service.clone(),
213 collator_receiver: rx,
214 block_import_handle,
215 export_pov,
216 };
217
218 let collation_task_fut = run_collation_task::<Block, _, _>(collator_task_params);
219
220 let block_builder_params = block_builder_task::BuilderTaskParams {
221 create_inherent_data_providers,
222 block_import,
223 para_client,
224 para_backend,
225 relay_client,
226 code_hash_provider,
227 keystore,
228 collator_peer_id,
229 para_id,
230 proposer,
231 collator_service,
232 authoring_duration,
233 collator_sender: tx,
234 relay_chain_slot_duration,
235 slot_offset,
236 max_pov_percentage,
237 };
238
239 let block_builder_fut =
240 run_block_builder::<Block, P, _, _, _, _, _, _, _, _>(block_builder_params);
241
242 spawner.spawn_essential_blocking(
243 "slot-based-block-builder",
244 Some("slot-based-collator"),
245 block_builder_fut.boxed(),
246 );
247 spawner.spawn_essential_blocking(
248 "slot-based-collation",
249 Some("slot-based-collator"),
250 collation_task_fut.boxed(),
251 );
252}
253
254struct CollatorMessage<Block: BlockT> {
258 pub relay_parent: RelayHash,
260 pub parent_header: Block::Header,
262 pub parachain_candidate: ParachainCandidate<Block>,
264 pub validation_code_hash: ValidationCodeHash,
266 pub core_index: CoreIndex,
268 pub max_pov_size: u32,
270}