diff --git a/substrate/client/consensus/aura/src/lib.rs b/substrate/client/consensus/aura/src/lib.rs index d3a6b10589408192dc1627618bbfc51d8834aa2f..4d91eaaae92ab756e28a1397f7193d3bf6f59a61 100644 --- a/substrate/client/consensus/aura/src/lib.rs +++ b/substrate/client/consensus/aura/src/lib.rs @@ -279,7 +279,7 @@ where L: sc_consensus::JustificationSyncLink<B>, BS: BackoffAuthoringBlocksStrategy<NumberFor<B>> + Send + Sync + 'static, { - AuraWorker { + sc_consensus_slots::SimpleSlotWorkerToSlotWorker(AuraWorker { client, block_import, env: proposer_factory, @@ -292,7 +292,7 @@ where block_proposal_slot_portion, max_block_proposal_slot_portion, _key_type: PhantomData::<P>, - } + }) } struct AuraWorker<C, E, I, P, SO, L, BS> { diff --git a/substrate/client/consensus/babe/src/lib.rs b/substrate/client/consensus/babe/src/lib.rs index 0e9f943eca307a102647ad4cae82c054fab32865..442dbab77e12053d78f1ba8367e859b71ae0114c 100644 --- a/substrate/client/consensus/babe/src/lib.rs +++ b/substrate/client/consensus/babe/src/lib.rs @@ -518,7 +518,7 @@ where let slot_worker = sc_consensus_slots::start_slot_worker( babe_link.config.slot_duration(), select_chain, - worker, + sc_consensus_slots::SimpleSlotWorkerToSlotWorker(worker), sync_oracle, create_inherent_data_providers, can_author_with, diff --git a/substrate/client/consensus/slots/src/lib.rs b/substrate/client/consensus/slots/src/lib.rs index f6129943b241192156c1b8c28e86bd9025db95d1..a97469fbcc30021ad53c40b7d9f56f47c4f77c2d 100644 --- a/substrate/client/consensus/slots/src/lib.rs +++ b/substrate/client/consensus/slots/src/lib.rs @@ -401,15 +401,22 @@ pub trait SimpleSlotWorker<B: BlockT> { } } +/// A type that implements [`SlotWorker`] for a type that implements [`SimpleSlotWorker`]. +/// +/// This is basically a workaround for Rust not supporting specialization. Otherwise we could +/// implement [`SlotWorker`] for any `T` that implements [`SimpleSlotWorker`], but currently +/// that would prevent downstream users to implement [`SlotWorker`] for their own types. +pub struct SimpleSlotWorkerToSlotWorker<T>(pub T); + #[async_trait::async_trait] -impl<B: BlockT, T: SimpleSlotWorker<B> + Send + Sync> - SlotWorker<B, <T::Proposer as Proposer<B>>::Proof> for T +impl<T: SimpleSlotWorker<B> + Send + Sync, B: BlockT> + SlotWorker<B, <T::Proposer as Proposer<B>>::Proof> for SimpleSlotWorkerToSlotWorker<T> { async fn on_slot( &mut self, slot_info: SlotInfo<B>, ) -> Option<SlotResult<B, <T::Proposer as Proposer<B>>::Proof>> { - SimpleSlotWorker::on_slot(self, slot_info).await + self.0.on_slot(slot_info).await } }