From 91ba40380a150fe61cead6ea0f7753668b5ddac2 Mon Sep 17 00:00:00 2001 From: Davide Galassi <davxy@datawok.net> Date: Thu, 27 Jul 2023 12:28:56 +0200 Subject: [PATCH] Relax Send/Sync/Clone requirements for Pair (#14647) * Relax Send/Sync requirements for not instanced generic Pair * Remove leftover * Apply review suggestion Co-authored-by: Sebastian Kunert <skunert49@gmail.com> * Further cleanup * Trigger CI --------- Co-authored-by: Sebastian Kunert <skunert49@gmail.com> --- .../client/consensus/aura/src/import_queue.rs | 23 +++++++------ substrate/client/consensus/aura/src/lib.rs | 33 +++++++++---------- .../consensus/common/src/import_queue.rs | 2 +- substrate/primitives/core/src/crypto.rs | 4 +-- 4 files changed, 30 insertions(+), 32 deletions(-) diff --git a/substrate/client/consensus/aura/src/import_queue.rs b/substrate/client/consensus/aura/src/import_queue.rs index 0b9ceb4fe77..ad9599d4b02 100644 --- a/substrate/client/consensus/aura/src/import_queue.rs +++ b/substrate/client/consensus/aura/src/import_queue.rs @@ -22,7 +22,7 @@ use crate::{ authorities, standalone::SealVerificationError, AuthorityId, CompatibilityMode, Error, LOG_TARGET, }; -use codec::{Codec, Decode, Encode}; +use codec::Codec; use log::{debug, info, trace}; use prometheus_endpoint::Registry; use sc_client_api::{backend::AuxStore, BlockOf, UsageProvider}; @@ -44,7 +44,7 @@ use sp_runtime::{ traits::{Block as BlockT, Header, NumberFor}, DigestItem, }; -use std::{fmt::Debug, hash::Hash, marker::PhantomData, sync::Arc}; +use std::{fmt::Debug, marker::PhantomData, sync::Arc}; /// check a header has been signed by the right key. If the slot is too far in the future, an error /// will be returned. If it's successful, returns the pre-header and the digest item @@ -60,9 +60,9 @@ fn check_header<C, B: BlockT, P: Pair>( check_for_equivocation: CheckForEquivocation, ) -> Result<CheckedHeader<B::Header, (Slot, DigestItem)>, Error<B>> where + P::Public: Codec, P::Signature: Codec, C: sc_client_api::backend::AuxStore, - P::Public: Encode + Decode + PartialEq + Clone, { let check_result = crate::standalone::check_header_slot_and_seal::<B, P>(slot_now, header, authorities); @@ -101,11 +101,11 @@ where /// A verifier for Aura blocks. pub struct AuraVerifier<C, P, CIDP, N> { client: Arc<C>, - phantom: PhantomData<P>, create_inherent_data_providers: CIDP, check_for_equivocation: CheckForEquivocation, telemetry: Option<TelemetryHandle>, compatibility_mode: CompatibilityMode<N>, + _phantom: PhantomData<fn() -> P>, } impl<C, P, CIDP, N> AuraVerifier<C, P, CIDP, N> { @@ -122,14 +122,13 @@ impl<C, P, CIDP, N> AuraVerifier<C, P, CIDP, N> { check_for_equivocation, telemetry, compatibility_mode, - phantom: PhantomData, + _phantom: PhantomData, } } } impl<C, P, CIDP, N> AuraVerifier<C, P, CIDP, N> where - P: Send + Sync + 'static, CIDP: Send, { async fn check_inherents<B: BlockT>( @@ -168,9 +167,9 @@ impl<B: BlockT, C, P, CIDP> Verifier<B> for AuraVerifier<C, P, CIDP, NumberFor<B where C: ProvideRuntimeApi<B> + Send + Sync + sc_client_api::backend::AuxStore, C::Api: BlockBuilderApi<B> + AuraApi<B, AuthorityId<P>> + ApiExt<B>, - P: Pair + Send + Sync + 'static, - P::Public: Send + Sync + Hash + Eq + Clone + Decode + Encode + Debug + 'static, - P::Signature: Encode + Decode, + P: Pair, + P::Public: Codec + Debug, + P::Signature: Codec, CIDP: CreateInherentDataProviders<B, ()> + Send + Sync, CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { @@ -365,9 +364,9 @@ where + Send + Sync + 'static, - P: Pair + Send + Sync + 'static, - P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, - P::Signature: Encode + Decode, + P: Pair + 'static, + P::Public: Codec + Debug, + P::Signature: Codec, S: sp_core::traits::SpawnEssentialNamed, CIDP: CreateInherentDataProviders<Block, ()> + Sync + Send + 'static, CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, diff --git a/substrate/client/consensus/aura/src/lib.rs b/substrate/client/consensus/aura/src/lib.rs index 1dc364283d5..a611006716c 100644 --- a/substrate/client/consensus/aura/src/lib.rs +++ b/substrate/client/consensus/aura/src/lib.rs @@ -30,12 +30,11 @@ //! //! NOTE: Aura itself is designed to be generic over the crypto used. #![forbid(missing_docs, unsafe_code)] -use std::{fmt::Debug, hash::Hash, marker::PhantomData, pin::Pin, sync::Arc}; +use std::{fmt::Debug, marker::PhantomData, pin::Pin, sync::Arc}; +use codec::Codec; use futures::prelude::*; -use codec::{Codec, Decode, Encode}; - use sc_client_api::{backend::AuxStore, BlockOf}; use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy, StateAction}; use sc_consensus_slots::{ @@ -48,7 +47,7 @@ use sp_application_crypto::AppPublic; use sp_blockchain::HeaderBackend; use sp_consensus::{BlockOrigin, Environment, Error as ConsensusError, Proposer, SelectChain}; use sp_consensus_slots::Slot; -use sp_core::crypto::{Pair, Public}; +use sp_core::crypto::Pair; use sp_inherents::CreateInherentDataProviders; use sp_keystore::KeystorePtr; use sp_runtime::traits::{Block as BlockT, Header, Member, NumberFor}; @@ -172,9 +171,9 @@ pub fn start_aura<P, B, C, SC, I, PF, SO, L, CIDP, BS, Error>( }: StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS, NumberFor<B>>, ) -> Result<impl Future<Output = ()>, ConsensusError> where - P: Pair + Send + Sync, - P::Public: AppPublic + Hash + Member + Encode + Decode, - P::Signature: TryFrom<Vec<u8>> + Hash + Member + Encode + Decode, + P: Pair, + P::Public: AppPublic + Member, + P::Signature: TryFrom<Vec<u8>> + Member + Codec, B: BlockT, C: ProvideRuntimeApi<B> + BlockOf + AuxStore + HeaderBackend<B> + Send + Sync, C::Api: AuraApi<B, AuthorityId<P>>, @@ -281,9 +280,9 @@ where C::Api: AuraApi<B, AuthorityId<P>>, PF: Environment<B, Error = Error> + Send + Sync + 'static, PF::Proposer: Proposer<B, Error = Error, Transaction = sp_api::TransactionFor<C, B>>, - P: Pair + Send + Sync, - P::Public: AppPublic + Hash + Member + Encode + Decode, - P::Signature: TryFrom<Vec<u8>> + Hash + Member + Encode + Decode, + P: Pair, + P::Public: AppPublic + Member, + P::Signature: TryFrom<Vec<u8>> + Member + Codec, I: BlockImport<B, Transaction = sp_api::TransactionFor<C, B>> + Send + Sync + 'static, Error: std::error::Error + Send + From<ConsensusError> + 'static, SO: SyncOracle + Send + Sync + Clone, @@ -303,7 +302,7 @@ where block_proposal_slot_portion, max_block_proposal_slot_portion, compatibility_mode, - _key_type: PhantomData::<P>, + _phantom: PhantomData::<fn() -> P>, } } @@ -320,7 +319,7 @@ struct AuraWorker<C, E, I, P, SO, L, BS, N> { max_block_proposal_slot_portion: Option<SlotProportion>, telemetry: Option<TelemetryHandle>, compatibility_mode: CompatibilityMode<N>, - _key_type: PhantomData<P>, + _phantom: PhantomData<fn() -> P>, } #[async_trait::async_trait] @@ -333,9 +332,9 @@ where E: Environment<B, Error = Error> + Send + Sync, E::Proposer: Proposer<B, Error = Error, Transaction = sp_api::TransactionFor<C, B>>, I: BlockImport<B, Transaction = sp_api::TransactionFor<C, B>> + Send + Sync + 'static, - P: Pair + Send + Sync, - P::Public: AppPublic + Public + Member + Encode + Decode + Hash, - P::Signature: TryFrom<Vec<u8>> + Member + Encode + Decode + Hash + Debug, + P: Pair, + P::Public: AppPublic + Member, + P::Signature: TryFrom<Vec<u8>> + Member + Codec, SO: SyncOracle + Send + Clone + Sync, L: sc_consensus::JustificationSyncLink<B>, BS: BackoffAuthoringBlocksStrategy<NumberFor<B>> + Send + Sync + 'static, @@ -806,10 +805,10 @@ mod tests { force_authoring: false, backoff_authoring_blocks: Some(BackoffAuthoringOnFinalizedHeadLagging::default()), telemetry: None, - _key_type: PhantomData::<AuthorityPair>, block_proposal_slot_portion: SlotProportion::new(0.5), max_block_proposal_slot_portion: None, compatibility_mode: Default::default(), + _phantom: PhantomData::<fn() -> AuthorityPair>, }; let head = Header::new( @@ -856,10 +855,10 @@ mod tests { force_authoring: false, backoff_authoring_blocks: Option::<()>::None, telemetry: None, - _key_type: PhantomData::<AuthorityPair>, block_proposal_slot_portion: SlotProportion::new(0.5), max_block_proposal_slot_portion: None, compatibility_mode: Default::default(), + _phantom: PhantomData::<fn() -> AuthorityPair>, }; let head = client.expect_header(client.info().genesis_hash).unwrap(); diff --git a/substrate/client/consensus/common/src/import_queue.rs b/substrate/client/consensus/common/src/import_queue.rs index 11ebbd4036a..bffc06df070 100644 --- a/substrate/client/consensus/common/src/import_queue.rs +++ b/substrate/client/consensus/common/src/import_queue.rs @@ -95,7 +95,7 @@ pub struct IncomingBlock<B: BlockT> { /// Verify a justification of a block #[async_trait::async_trait] -pub trait Verifier<B: BlockT>: Send + Sync { +pub trait Verifier<B: BlockT>: Send { /// Verify the given block data and return the `BlockImportParams` to /// continue the block import process. async fn verify( diff --git a/substrate/primitives/core/src/crypto.rs b/substrate/primitives/core/src/crypto.rs index 72f996b3368..061d60d94f1 100644 --- a/substrate/primitives/core/src/crypto.rs +++ b/substrate/primitives/core/src/crypto.rs @@ -486,7 +486,7 @@ pub trait ByteArray: AsRef<[u8]> + AsMut<[u8]> + for<'a> TryFrom<&'a [u8], Error } /// Trait suitable for typical cryptographic key public type. -pub trait Public: ByteArray + Derive + CryptoType + PartialEq + Eq + Clone + Send + Sync {} +pub trait Public: CryptoType + ByteArray + Derive + PartialEq + Eq + Clone + Send {} /// An opaque 32-byte cryptographic identifier. #[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Encode, Decode, MaxEncodedLen, TypeInfo)] @@ -834,7 +834,7 @@ impl sp_std::str::FromStr for SecretUri { /// /// For now it just specifies how to create a key from a phrase and derivation path. #[cfg(feature = "full_crypto")] -pub trait Pair: CryptoType + Sized + Clone + Send + Sync + 'static { +pub trait Pair: CryptoType + Sized { /// The type which is used to encode a public key. type Public: Public + Hash; -- GitLab