From c58271468ab2a6bafa906461d78cc190fd817516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= <bkchr@users.noreply.github.com> Date: Wed, 2 Mar 2022 10:03:10 +0100 Subject: [PATCH] SimpleSlotWorker: Do not implement `SlotWorker` for all types implementing `SimpleSlotWorker` (#10934) Because Rust currently doesn't support specialization, it prevents users from implementing `SlotWorker` for their own types. This pr solves this by removing the generic implementation of `SlotWorker` for `SimpleSlotWorker` and providing some wrapper type for that. --- substrate/client/consensus/aura/src/lib.rs | 4 ++-- substrate/client/consensus/babe/src/lib.rs | 2 +- substrate/client/consensus/slots/src/lib.rs | 13 ++++++++++--- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/substrate/client/consensus/aura/src/lib.rs b/substrate/client/consensus/aura/src/lib.rs index d3a6b105894..4d91eaaae92 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 0e9f943eca3..442dbab77e1 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 f6129943b24..a97469fbcc3 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 } } -- GitLab