diff --git a/substrate/bin/node-template/node/src/service.rs b/substrate/bin/node-template/node/src/service.rs index ffb2440caa0ed82db4d1a92ec6ef52639b09c8ff..caa01761636dfbeb9e829c8cedd9552ac1c9b1bf 100644 --- a/substrate/bin/node-template/node/src/service.rs +++ b/substrate/bin/node-template/node/src/service.rs @@ -1,7 +1,7 @@ //! Service and ServiceFactory implementation. Specialized wrapper over substrate service. use node_template_runtime::{self, opaque::Block, RuntimeApi}; -use sc_client_api::{BlockBackend, ExecutorProvider}; +use sc_client_api::BlockBackend; use sc_consensus_aura::{ImportQueueParams, SlotProportion, StartAuraParams}; pub use sc_executor::NativeElseWasmExecutor; use sc_finality_grandpa::SharedVoterState; @@ -113,7 +113,7 @@ pub fn new_partial( let slot_duration = sc_consensus_aura::slot_duration(&*client)?; let import_queue = - sc_consensus_aura::import_queue::<AuraPair, _, _, _, _, _, _>(ImportQueueParams { + sc_consensus_aura::import_queue::<AuraPair, _, _, _, _, _>(ImportQueueParams { block_import: grandpa_block_import.clone(), justification_import: Some(Box::new(grandpa_block_import.clone())), client: client.clone(), @@ -129,9 +129,6 @@ pub fn new_partial( Ok((timestamp, slot)) }, spawner: &task_manager.spawn_essential_handle(), - can_author_with: sp_consensus::CanAuthorWithNativeVersion::new( - client.executor().clone(), - ), registry: config.prometheus_registry(), check_for_equivocation: Default::default(), telemetry: telemetry.as_ref().map(|x| x.handle()), @@ -254,12 +251,9 @@ pub fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceError> telemetry.as_ref().map(|x| x.handle()), ); - let can_author_with = - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); - let slot_duration = sc_consensus_aura::slot_duration(&*client)?; - let aura = sc_consensus_aura::start_aura::<AuraPair, _, _, _, _, _, _, _, _, _, _, _>( + let aura = sc_consensus_aura::start_aura::<AuraPair, _, _, _, _, _, _, _, _, _, _>( StartAuraParams { slot_duration, client, @@ -280,7 +274,6 @@ pub fn new_full(mut config: Configuration) -> Result<TaskManager, ServiceError> force_authoring, backoff_authoring_blocks, keystore: keystore_container.sync_keystore(), - can_author_with, sync_oracle: network.clone(), justification_sync_link: network.clone(), block_proposal_slot_portion: SlotProportion::new(2f32 / 3f32), diff --git a/substrate/bin/node/cli/src/service.rs b/substrate/bin/node/cli/src/service.rs index 2152301ac2d4294dd21ce80f74aa294215fa0728..c058e22fa7a97d9af9b792ea892afe1ffd5f4572 100644 --- a/substrate/bin/node/cli/src/service.rs +++ b/substrate/bin/node/cli/src/service.rs @@ -26,7 +26,7 @@ use futures::prelude::*; use kitchensink_runtime::RuntimeApi; use node_executor::ExecutorDispatch; use node_primitives::Block; -use sc_client_api::{BlockBackend, ExecutorProvider}; +use sc_client_api::BlockBackend; use sc_consensus_babe::{self, SlotProportion}; use sc_executor::NativeElseWasmExecutor; use sc_network::NetworkService; @@ -227,7 +227,6 @@ pub fn new_partial( }, &task_manager.spawn_essential_handle(), config.prometheus_registry(), - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()), telemetry.as_ref().map(|x| x.handle()), )?; @@ -422,9 +421,6 @@ pub fn new_full_base( telemetry.as_ref().map(|x| x.handle()), ); - let can_author_with = - sp_consensus::CanAuthorWithNativeVersion::new(client.executor().clone()); - let client_clone = client.clone(); let slot_duration = babe_link.config().slot_duration(); let babe_config = sc_consensus_babe::BabeParams { @@ -463,7 +459,6 @@ pub fn new_full_base( force_authoring, backoff_authoring_blocks, babe_link, - can_author_with, block_proposal_slot_portion: SlotProportion::new(0.5), max_block_proposal_slot_portion: None, telemetry: telemetry.as_ref().map(|x| x.handle()), diff --git a/substrate/client/consensus/aura/src/import_queue.rs b/substrate/client/consensus/aura/src/import_queue.rs index 30554006732c08d4cbc3064507f10831ac6588e4..31fe7bbaa1095f089fd11c87323ec92d5aaccfe7 100644 --- a/substrate/client/consensus/aura/src/import_queue.rs +++ b/substrate/client/consensus/aura/src/import_queue.rs @@ -35,7 +35,7 @@ use sp_blockchain::{ well_known_cache_keys::{self, Id as CacheKeyId}, HeaderBackend, }; -use sp_consensus::{CanAuthorWith, Error as ConsensusError}; +use sp_consensus::Error as ConsensusError; use sp_consensus_aura::{ digests::CompatibleDigestItem, inherents::AuraInherentData, AuraApi, ConsensusLog, AURA_ENGINE_ID, @@ -109,27 +109,24 @@ where } /// A verifier for Aura blocks. -pub struct AuraVerifier<C, P, CAW, CIDP> { +pub struct AuraVerifier<C, P, CIDP> { client: Arc<C>, phantom: PhantomData<P>, create_inherent_data_providers: CIDP, - can_author_with: CAW, check_for_equivocation: CheckForEquivocation, telemetry: Option<TelemetryHandle>, } -impl<C, P, CAW, CIDP> AuraVerifier<C, P, CAW, CIDP> { +impl<C, P, CIDP> AuraVerifier<C, P, CIDP> { pub(crate) fn new( client: Arc<C>, create_inherent_data_providers: CIDP, - can_author_with: CAW, check_for_equivocation: CheckForEquivocation, telemetry: Option<TelemetryHandle>, ) -> Self { Self { client, create_inherent_data_providers, - can_author_with, check_for_equivocation, telemetry, phantom: PhantomData, @@ -137,10 +134,9 @@ impl<C, P, CAW, CIDP> AuraVerifier<C, P, CAW, CIDP> { } } -impl<C, P, CAW, CIDP> AuraVerifier<C, P, CAW, CIDP> +impl<C, P, CIDP> AuraVerifier<C, P, CIDP> where P: Send + Sync + 'static, - CAW: Send + Sync + 'static, CIDP: Send, { async fn check_inherents<B: BlockT>( @@ -154,19 +150,8 @@ where where C: ProvideRuntimeApi<B>, C::Api: BlockBuilderApi<B>, - CAW: CanAuthorWith<B>, CIDP: CreateInherentDataProviders<B, ()>, { - if let Err(e) = self.can_author_with.can_author_with(&block_id) { - debug!( - target: "aura", - "Skipping `check_inherents` as authoring version is not compatible: {}", - e, - ); - - return Ok(()) - } - let inherent_res = self .client .runtime_api() @@ -187,14 +172,13 @@ where } #[async_trait::async_trait] -impl<B: BlockT, C, P, CAW, CIDP> Verifier<B> for AuraVerifier<C, P, CAW, CIDP> +impl<B: BlockT, C, P, CIDP> Verifier<B> for AuraVerifier<C, P, CIDP> where C: ProvideRuntimeApi<B> + Send + Sync + sc_client_api::backend::AuxStore + BlockOf, 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, - CAW: CanAuthorWith<B> + Send + Sync + 'static, CIDP: CreateInherentDataProviders<B, ()> + Send + Sync, CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { @@ -338,7 +322,7 @@ impl Default for CheckForEquivocation { } /// Parameters of [`import_queue`]. -pub struct ImportQueueParams<'a, Block, I, C, S, CAW, CIDP> { +pub struct ImportQueueParams<'a, Block, I, C, S, CIDP> { /// The block import to use. pub block_import: I, /// The justification import. @@ -351,8 +335,6 @@ pub struct ImportQueueParams<'a, Block, I, C, S, CAW, CIDP> { pub spawner: &'a S, /// The prometheus registry. pub registry: Option<&'a Registry>, - /// Can we author with the current node? - pub can_author_with: CAW, /// Should we check for equivocation? pub check_for_equivocation: CheckForEquivocation, /// Telemetry instance used to report telemetry metrics. @@ -360,7 +342,7 @@ pub struct ImportQueueParams<'a, Block, I, C, S, CAW, CIDP> { } /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue<P, Block, I, C, S, CAW, CIDP>( +pub fn import_queue<P, Block, I, C, S, CIDP>( ImportQueueParams { block_import, justification_import, @@ -368,10 +350,9 @@ pub fn import_queue<P, Block, I, C, S, CAW, CIDP>( create_inherent_data_providers, spawner, registry, - can_author_with, check_for_equivocation, telemetry, - }: ImportQueueParams<Block, I, C, S, CAW, CIDP>, + }: ImportQueueParams<Block, I, C, S, CIDP>, ) -> Result<DefaultImportQueue<Block, C>, sp_consensus::Error> where Block: BlockT, @@ -392,14 +373,12 @@ where P::Public: Clone + Eq + Send + Sync + Hash + Debug + Encode + Decode, P::Signature: Encode + Decode, S: sp_core::traits::SpawnEssentialNamed, - CAW: CanAuthorWith<Block> + Send + Sync + 'static, CIDP: CreateInherentDataProviders<Block, ()> + Sync + Send + 'static, CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { - let verifier = build_verifier::<P, _, _, _>(BuildVerifierParams { + let verifier = build_verifier::<P, _, _>(BuildVerifierParams { client, create_inherent_data_providers, - can_author_with, check_for_equivocation, telemetry, }); @@ -408,13 +387,11 @@ where } /// Parameters of [`build_verifier`]. -pub struct BuildVerifierParams<C, CIDP, CAW> { +pub struct BuildVerifierParams<C, CIDP> { /// The client to interact with the chain. pub client: Arc<C>, /// Something that can create the inherent data providers. pub create_inherent_data_providers: CIDP, - /// Can we author with the current node? - pub can_author_with: CAW, /// Should we check for equivocation? pub check_for_equivocation: CheckForEquivocation, /// Telemetry instance used to report telemetry metrics. @@ -422,19 +399,17 @@ pub struct BuildVerifierParams<C, CIDP, CAW> { } /// Build the [`AuraVerifier`] -pub fn build_verifier<P, C, CIDP, CAW>( +pub fn build_verifier<P, C, CIDP>( BuildVerifierParams { client, create_inherent_data_providers, - can_author_with, check_for_equivocation, telemetry, - }: BuildVerifierParams<C, CIDP, CAW>, -) -> AuraVerifier<C, P, CAW, CIDP> { - AuraVerifier::<_, P, _, _>::new( + }: BuildVerifierParams<C, CIDP>, +) -> AuraVerifier<C, P, CIDP> { + AuraVerifier::<_, P, _>::new( client, create_inherent_data_providers, - can_author_with, check_for_equivocation, telemetry, ) diff --git a/substrate/client/consensus/aura/src/lib.rs b/substrate/client/consensus/aura/src/lib.rs index 92fe1fa3cf29db4dc5efbc29d5b3054c9abe2559..0bdc6638150518eae7e4bf10b09a0722faaa4817 100644 --- a/substrate/client/consensus/aura/src/lib.rs +++ b/substrate/client/consensus/aura/src/lib.rs @@ -47,9 +47,7 @@ use sc_telemetry::TelemetryHandle; use sp_api::ProvideRuntimeApi; use sp_application_crypto::{AppKey, AppPublic}; use sp_blockchain::{HeaderBackend, Result as CResult}; -use sp_consensus::{ - BlockOrigin, CanAuthorWith, Environment, Error as ConsensusError, Proposer, SelectChain, -}; +use sp_consensus::{BlockOrigin, Environment, Error as ConsensusError, Proposer, SelectChain}; use sp_consensus_slots::Slot; use sp_core::crypto::{ByteArray, Pair, Public}; use sp_inherents::CreateInherentDataProviders; @@ -108,7 +106,7 @@ fn slot_author<P: Pair>(slot: Slot, authorities: &[AuthorityId<P>]) -> Option<&A } /// Parameters of [`start_aura`]. -pub struct StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS, CAW> { +pub struct StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS> { /// The duration of a slot. pub slot_duration: SlotDuration, /// The client to interact with the chain. @@ -131,8 +129,6 @@ pub struct StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS, CAW> { pub backoff_authoring_blocks: Option<BS>, /// The keystore used by the node. pub keystore: SyncCryptoStorePtr, - /// Can we author a block with this node? - pub can_author_with: CAW, /// The proportion of the slot dedicated to proposing. /// /// The block proposing will be limited to this proportion of the slot from the starting of the @@ -147,7 +143,7 @@ pub struct StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS, CAW> { } /// Start the aura worker. The returned future should be run in a futures executor. -pub fn start_aura<P, B, C, SC, I, PF, SO, L, CIDP, BS, CAW, Error>( +pub fn start_aura<P, B, C, SC, I, PF, SO, L, CIDP, BS, Error>( StartAuraParams { slot_duration, client, @@ -160,11 +156,10 @@ pub fn start_aura<P, B, C, SC, I, PF, SO, L, CIDP, BS, CAW, Error>( force_authoring, backoff_authoring_blocks, keystore, - can_author_with, block_proposal_slot_portion, max_block_proposal_slot_portion, telemetry, - }: StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS, CAW>, + }: StartAuraParams<C, SC, I, PF, SO, L, CIDP, BS>, ) -> Result<impl Future<Output = ()>, sp_consensus::Error> where P: Pair + Send + Sync, @@ -182,7 +177,6 @@ where CIDP: CreateInherentDataProviders<B, ()> + Send, CIDP::InherentDataProviders: InherentDataProviderExt + Send, BS: BackoffAuthoringBlocksStrategy<NumberFor<B>> + Send + Sync + 'static, - CAW: CanAuthorWith<B> + Send, Error: std::error::Error + Send + From<sp_consensus::Error> + 'static, { let worker = build_aura_worker::<P, _, _, _, _, _, _, _, _>(BuildAuraWorkerParams { @@ -205,7 +199,6 @@ where SimpleSlotWorkerToSlotWorker(worker), sync_oracle, create_inherent_data_providers, - can_author_with, )) } @@ -568,9 +561,7 @@ mod tests { use sc_keystore::LocalKeystore; use sc_network_test::{Block as TestBlock, *}; use sp_application_crypto::key_types::AURA; - use sp_consensus::{ - AlwaysCanAuthor, DisableProofRecording, NoNetwork as DummyOracle, Proposal, - }; + use sp_consensus::{DisableProofRecording, NoNetwork as DummyOracle, Proposal}; use sp_consensus_aura::sr25519::AuthorityPair; use sp_inherents::InherentData; use sp_keyring::sr25519::Keyring; @@ -633,7 +624,6 @@ mod tests { type AuraVerifier = import_queue::AuraVerifier< PeersFullClient, AuthorityPair, - AlwaysCanAuthor, Box< dyn CreateInherentDataProviders< TestBlock, @@ -670,7 +660,6 @@ mod tests { Ok((timestamp, slot)) }), - AlwaysCanAuthor, CheckForEquivocation::Yes, None, ) @@ -738,7 +727,7 @@ mod tests { let slot_duration = slot_duration(&*client).expect("slot duration available"); aura_futures.push( - start_aura::<AuthorityPair, _, _, _, _, _, _, _, _, _, _, _>(StartAuraParams { + start_aura::<AuthorityPair, _, _, _, _, _, _, _, _, _, _>(StartAuraParams { slot_duration, block_import: client.clone(), select_chain, @@ -760,7 +749,6 @@ mod tests { BackoffAuthoringOnFinalizedHeadLagging::default(), ), keystore, - can_author_with: sp_consensus::AlwaysCanAuthor, block_proposal_slot_portion: SlotProportion::new(0.5), max_block_proposal_slot_portion: None, telemetry: None, diff --git a/substrate/client/consensus/babe/src/lib.rs b/substrate/client/consensus/babe/src/lib.rs index 1303915efee49ec2c058506cf258868f9a6fc50c..198de865bb290f9bc64e5d1c3cd0bf55ba7bc64f 100644 --- a/substrate/client/consensus/babe/src/lib.rs +++ b/substrate/client/consensus/babe/src/lib.rs @@ -115,8 +115,7 @@ use sp_blockchain::{ Backend as _, Error as ClientError, HeaderBackend, HeaderMetadata, Result as ClientResult, }; use sp_consensus::{ - BlockOrigin, CacheKeyId, CanAuthorWith, Environment, Error as ConsensusError, Proposer, - SelectChain, + BlockOrigin, CacheKeyId, Environment, Error as ConsensusError, Proposer, SelectChain, }; use sp_consensus_babe::inherents::BabeInherentData; use sp_consensus_slots::Slot; @@ -370,7 +369,7 @@ where } /// Parameters for BABE. -pub struct BabeParams<B: BlockT, C, SC, E, I, SO, L, CIDP, BS, CAW> { +pub struct BabeParams<B: BlockT, C, SC, E, I, SO, L, CIDP, BS> { /// The keystore that manages the keys of the node. pub keystore: SyncCryptoStorePtr, @@ -406,9 +405,6 @@ pub struct BabeParams<B: BlockT, C, SC, E, I, SO, L, CIDP, BS, CAW> { /// The source of timestamps for relative slots pub babe_link: BabeLink<B>, - /// Checks if the current native implementation can author with a runtime at a given block. - pub can_author_with: CAW, - /// The proportion of the slot dedicated to proposing. /// /// The block proposing will be limited to this proportion of the slot from the starting of the @@ -425,7 +421,7 @@ pub struct BabeParams<B: BlockT, C, SC, E, I, SO, L, CIDP, BS, CAW> { } /// Start the babe worker. -pub fn start_babe<B, C, SC, E, I, SO, CIDP, BS, CAW, L, Error>( +pub fn start_babe<B, C, SC, E, I, SO, CIDP, BS, L, Error>( BabeParams { keystore, client, @@ -438,11 +434,10 @@ pub fn start_babe<B, C, SC, E, I, SO, CIDP, BS, CAW, L, Error>( force_authoring, backoff_authoring_blocks, babe_link, - can_author_with, block_proposal_slot_portion, max_block_proposal_slot_portion, telemetry, - }: BabeParams<B, C, SC, E, I, SO, L, CIDP, BS, CAW>, + }: BabeParams<B, C, SC, E, I, SO, L, CIDP, BS>, ) -> Result<BabeWorker<B>, sp_consensus::Error> where B: BlockT, @@ -468,7 +463,6 @@ where CIDP: CreateInherentDataProviders<B, ()> + Send + Sync + 'static, CIDP::InherentDataProviders: InherentDataProviderExt + Send, BS: BackoffAuthoringBlocksStrategy<NumberFor<B>> + Send + Sync + 'static, - CAW: CanAuthorWith<B> + Send + Sync + 'static, Error: std::error::Error + Send + From<ConsensusError> + From<I::Error> + 'static, { const HANDLE_BUFFER_SIZE: usize = 1024; @@ -500,7 +494,6 @@ where sc_consensus_slots::SimpleSlotWorkerToSlotWorker(worker), sync_oracle, create_inherent_data_providers, - can_author_with, ); let (worker_tx, worker_rx) = channel(HANDLE_BUFFER_SIZE); @@ -1009,23 +1002,21 @@ impl<Block: BlockT> BabeLink<Block> { } /// A verifier for Babe blocks. -pub struct BabeVerifier<Block: BlockT, Client, SelectChain, CAW, CIDP> { +pub struct BabeVerifier<Block: BlockT, Client, SelectChain, CIDP> { client: Arc<Client>, select_chain: SelectChain, create_inherent_data_providers: CIDP, config: BabeConfiguration, epoch_changes: SharedEpochChanges<Block, Epoch>, - can_author_with: CAW, telemetry: Option<TelemetryHandle>, } -impl<Block, Client, SelectChain, CAW, CIDP> BabeVerifier<Block, Client, SelectChain, CAW, CIDP> +impl<Block, Client, SelectChain, CIDP> BabeVerifier<Block, Client, SelectChain, CIDP> where Block: BlockT, Client: AuxStore + HeaderBackend<Block> + HeaderMetadata<Block> + ProvideRuntimeApi<Block>, Client::Api: BlockBuilderApi<Block> + BabeApi<Block>, SelectChain: sp_consensus::SelectChain<Block>, - CAW: CanAuthorWith<Block>, CIDP: CreateInherentDataProviders<Block, ()>, { async fn check_inherents( @@ -1036,16 +1027,6 @@ where create_inherent_data_providers: CIDP::InherentDataProviders, execution_context: ExecutionContext, ) -> Result<(), Error<Block>> { - if let Err(e) = self.can_author_with.can_author_with(&block_id) { - debug!( - target: "babe", - "Skipping `check_inherents` as authoring version is not compatible: {}", - e, - ); - - return Ok(()) - } - let inherent_res = self .client .runtime_api() @@ -1150,8 +1131,8 @@ type BlockVerificationResult<Block> = Result<(BlockImportParams<Block, ()>, Option<Vec<(CacheKeyId, Vec<u8>)>>), String>; #[async_trait::async_trait] -impl<Block, Client, SelectChain, CAW, CIDP> Verifier<Block> - for BabeVerifier<Block, Client, SelectChain, CAW, CIDP> +impl<Block, Client, SelectChain, CIDP> Verifier<Block> + for BabeVerifier<Block, Client, SelectChain, CIDP> where Block: BlockT, Client: HeaderMetadata<Block, Error = sp_blockchain::Error> @@ -1162,7 +1143,6 @@ where + AuxStore, Client::Api: BlockBuilderApi<Block> + BabeApi<Block>, SelectChain: sp_consensus::SelectChain<Block>, - CAW: CanAuthorWith<Block> + Send + Sync, CIDP: CreateInherentDataProviders<Block, ()> + Send + Sync, CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { @@ -1773,7 +1753,7 @@ where /// /// The block import object provided must be the `BabeBlockImport` or a wrapper /// of it, otherwise crucial import logic will be omitted. -pub fn import_queue<Block: BlockT, Client, SelectChain, Inner, CAW, CIDP>( +pub fn import_queue<Block: BlockT, Client, SelectChain, Inner, CIDP>( babe_link: BabeLink<Block>, block_import: Inner, justification_import: Option<BoxJustificationImport<Block>>, @@ -1782,7 +1762,6 @@ pub fn import_queue<Block: BlockT, Client, SelectChain, Inner, CAW, CIDP>( create_inherent_data_providers: CIDP, spawner: &impl sp_core::traits::SpawnEssentialNamed, registry: Option<&Registry>, - can_author_with: CAW, telemetry: Option<TelemetryHandle>, ) -> ClientResult<DefaultImportQueue<Block, Client>> where @@ -1802,7 +1781,6 @@ where + 'static, Client::Api: BlockBuilderApi<Block> + BabeApi<Block> + ApiExt<Block>, SelectChain: sp_consensus::SelectChain<Block> + 'static, - CAW: CanAuthorWith<Block> + Send + Sync + 'static, CIDP: CreateInherentDataProviders<Block, ()> + Send + Sync + 'static, CIDP::InherentDataProviders: InherentDataProviderExt + Send + Sync, { @@ -1811,7 +1789,6 @@ where create_inherent_data_providers, config: babe_link.config, epoch_changes: babe_link.epoch_changes, - can_author_with, telemetry, client, }; diff --git a/substrate/client/consensus/babe/src/tests.rs b/substrate/client/consensus/babe/src/tests.rs index 7207b7a36c3d495202a9e102b822e50f27fd2ba9..ab3805138482c54172470affd0dadb35c6aa6cdd 100644 --- a/substrate/client/consensus/babe/src/tests.rs +++ b/substrate/client/consensus/babe/src/tests.rs @@ -31,7 +31,7 @@ use sc_consensus_slots::BackoffAuthoringOnFinalizedHeadLagging; use sc_keystore::LocalKeystore; use sc_network_test::{Block as TestBlock, *}; use sp_application_crypto::key_types::BABE; -use sp_consensus::{AlwaysCanAuthor, DisableProofRecording, NoNetwork as DummyOracle, Proposal}; +use sp_consensus::{DisableProofRecording, NoNetwork as DummyOracle, Proposal}; use sp_consensus_babe::{ inherents::InherentDataProvider, make_transcript, make_transcript_data, AllowedSlots, AuthorityPair, Slot, @@ -235,7 +235,6 @@ pub struct TestVerifier { TestBlock, PeersFullClient, TestSelectChain, - AlwaysCanAuthor, Box< dyn CreateInherentDataProviders< TestBlock, @@ -332,7 +331,6 @@ impl TestNetFactory for BabeTestNet { }), config: data.link.config.clone(), epoch_changes: data.link.epoch_changes.clone(), - can_author_with: AlwaysCanAuthor, telemetry: None, }, mutator: MUTATOR.with(|m| m.borrow().clone()), @@ -447,7 +445,6 @@ fn run_one_test(mutator: impl Fn(&mut TestHeader, Stage) + Send + Sync + 'static backoff_authoring_blocks: Some(BackoffAuthoringOnFinalizedHeadLagging::default()), babe_link: data.link.clone(), keystore, - can_author_with: sp_consensus::AlwaysCanAuthor, justification_sync_link: (), block_proposal_slot_portion: SlotProportion::new(0.5), max_block_proposal_slot_portion: None, diff --git a/substrate/client/consensus/pow/src/lib.rs b/substrate/client/consensus/pow/src/lib.rs index f63e453a480266c00eabc24dd27f1ac9049533dd..6c492931d445c31cbff9985a0013daa17532b904 100644 --- a/substrate/client/consensus/pow/src/lib.rs +++ b/substrate/client/consensus/pow/src/lib.rs @@ -56,9 +56,7 @@ use sc_consensus::{ use sp_api::ProvideRuntimeApi; use sp_block_builder::BlockBuilder as BlockBuilderApi; use sp_blockchain::{well_known_cache_keys::Id as CacheKeyId, HeaderBackend}; -use sp_consensus::{ - CanAuthorWith, Environment, Error as ConsensusError, Proposer, SelectChain, SyncOracle, -}; +use sp_consensus::{Environment, Error as ConsensusError, Proposer, SelectChain, SyncOracle}; use sp_consensus_pow::{Seal, TotalDifficulty, POW_ENGINE_ID}; use sp_core::ExecutionContext; use sp_inherents::{CreateInherentDataProviders, InherentDataProvider}; @@ -214,18 +212,17 @@ pub trait PowAlgorithm<B: BlockT> { } /// A block importer for PoW. -pub struct PowBlockImport<B: BlockT, I, C, S, Algorithm, CAW, CIDP> { +pub struct PowBlockImport<B: BlockT, I, C, S, Algorithm, CIDP> { algorithm: Algorithm, inner: I, select_chain: S, client: Arc<C>, create_inherent_data_providers: Arc<CIDP>, check_inherents_after: <<B as BlockT>::Header as HeaderT>::Number, - can_author_with: CAW, } -impl<B: BlockT, I: Clone, C, S: Clone, Algorithm: Clone, CAW: Clone, CIDP> Clone - for PowBlockImport<B, I, C, S, Algorithm, CAW, CIDP> +impl<B: BlockT, I: Clone, C, S: Clone, Algorithm: Clone, CIDP> Clone + for PowBlockImport<B, I, C, S, Algorithm, CIDP> { fn clone(&self) -> Self { Self { @@ -235,12 +232,11 @@ impl<B: BlockT, I: Clone, C, S: Clone, Algorithm: Clone, CAW: Clone, CIDP> Clone client: self.client.clone(), create_inherent_data_providers: self.create_inherent_data_providers.clone(), check_inherents_after: self.check_inherents_after, - can_author_with: self.can_author_with.clone(), } } } -impl<B, I, C, S, Algorithm, CAW, CIDP> PowBlockImport<B, I, C, S, Algorithm, CAW, CIDP> +impl<B, I, C, S, Algorithm, CIDP> PowBlockImport<B, I, C, S, Algorithm, CIDP> where B: BlockT, I: BlockImport<B, Transaction = sp_api::TransactionFor<C, B>> + Send + Sync, @@ -248,7 +244,6 @@ where C: ProvideRuntimeApi<B> + Send + Sync + HeaderBackend<B> + AuxStore + BlockOf, C::Api: BlockBuilderApi<B>, Algorithm: PowAlgorithm<B>, - CAW: CanAuthorWith<B>, CIDP: CreateInherentDataProviders<B, ()>, { /// Create a new block import suitable to be used in PoW @@ -259,7 +254,6 @@ where check_inherents_after: <<B as BlockT>::Header as HeaderT>::Number, select_chain: S, create_inherent_data_providers: CIDP, - can_author_with: CAW, ) -> Self { Self { inner, @@ -268,7 +262,6 @@ where check_inherents_after, select_chain, create_inherent_data_providers: Arc::new(create_inherent_data_providers), - can_author_with, } } @@ -283,16 +276,6 @@ where return Ok(()) } - if let Err(e) = self.can_author_with.can_author_with(&block_id) { - debug!( - target: "pow", - "Skipping `check_inherents` as authoring version is not compatible: {}", - e, - ); - - return Ok(()) - } - let inherent_data = inherent_data_providers .create_inherent_data() .map_err(|e| Error::CreateInherents(e))?; @@ -317,8 +300,7 @@ where } #[async_trait::async_trait] -impl<B, I, C, S, Algorithm, CAW, CIDP> BlockImport<B> - for PowBlockImport<B, I, C, S, Algorithm, CAW, CIDP> +impl<B, I, C, S, Algorithm, CIDP> BlockImport<B> for PowBlockImport<B, I, C, S, Algorithm, CIDP> where B: BlockT, I: BlockImport<B, Transaction = sp_api::TransactionFor<C, B>> + Send + Sync, @@ -328,7 +310,6 @@ where C::Api: BlockBuilderApi<B>, Algorithm: PowAlgorithm<B> + Send + Sync, Algorithm::Difficulty: 'static + Send, - CAW: CanAuthorWith<B> + Send + Sync, CIDP: CreateInherentDataProviders<B, ()> + Send + Sync, { type Error = ConsensusError; @@ -512,7 +493,7 @@ where /// /// `pre_runtime` is a parameter that allows a custom additional pre-runtime digest to be inserted /// for blocks being built. This can encode authorship information, or just be a graffiti. -pub fn start_mining_worker<Block, C, S, Algorithm, E, SO, L, CIDP, CAW>( +pub fn start_mining_worker<Block, C, S, Algorithm, E, SO, L, CIDP>( block_import: BoxBlockImport<Block, sp_api::TransactionFor<C, Block>>, client: Arc<C>, select_chain: S, @@ -524,7 +505,6 @@ pub fn start_mining_worker<Block, C, S, Algorithm, E, SO, L, CIDP, CAW>( create_inherent_data_providers: CIDP, timeout: Duration, build_time: Duration, - can_author_with: CAW, ) -> ( MiningHandle<Block, Algorithm, C, L, <E::Proposer as Proposer<Block>>::Proof>, impl Future<Output = ()>, @@ -541,7 +521,6 @@ where SO: SyncOracle + Clone + Send + Sync + 'static, L: sc_consensus::JustificationSyncLink<Block>, CIDP: CreateInherentDataProviders<Block, ()>, - CAW: CanAuthorWith<Block> + Clone + Send + 'static, { let mut timer = UntilImportedOrTimeout::new(client.import_notification_stream(), timeout); let worker = MiningHandle::new(algorithm.clone(), block_import, justification_sync_link); @@ -573,16 +552,6 @@ where }; let best_hash = best_header.hash(); - if let Err(err) = can_author_with.can_author_with(&BlockId::Hash(best_hash)) { - warn!( - target: "pow", - "Skipping proposal `can_author_with` returned: {} \ - Probably a node update is required!", - err, - ); - continue - } - if worker.best_hash() == Some(best_hash) { continue } diff --git a/substrate/client/consensus/slots/src/lib.rs b/substrate/client/consensus/slots/src/lib.rs index 39b40a32f18cacf029dc9fd578e8cb9ec4ec16a9..b9f8c03f2ac8818f0b969c2a34b06c18678ab46a 100644 --- a/substrate/client/consensus/slots/src/lib.rs +++ b/substrate/client/consensus/slots/src/lib.rs @@ -38,13 +38,10 @@ use log::{debug, info, warn}; use sc_consensus::{BlockImport, JustificationSyncLink}; use sc_telemetry::{telemetry, TelemetryHandle, CONSENSUS_DEBUG, CONSENSUS_INFO, CONSENSUS_WARN}; use sp_arithmetic::traits::BaseArithmetic; -use sp_consensus::{CanAuthorWith, Proposal, Proposer, SelectChain, SyncOracle}; +use sp_consensus::{Proposal, Proposer, SelectChain, SyncOracle}; use sp_consensus_slots::{Slot, SlotDuration}; use sp_inherents::CreateInherentDataProviders; -use sp_runtime::{ - generic::BlockId, - traits::{Block as BlockT, HashFor, Header as HeaderT}, -}; +use sp_runtime::traits::{Block as BlockT, HashFor, Header as HeaderT}; use sp_timestamp::Timestamp; use std::{fmt::Debug, ops::Deref, time::Duration}; @@ -486,13 +483,12 @@ impl_inherent_data_provider_ext_tuple!(T, S, A, B, C, D, E, F, G, H, I, J); /// /// Every time a new slot is triggered, `worker.on_slot` is called and the future it returns is /// polled until completion, unless we are major syncing. -pub async fn start_slot_worker<B, C, W, SO, CIDP, CAW, Proof>( +pub async fn start_slot_worker<B, C, W, SO, CIDP, Proof>( slot_duration: SlotDuration, client: C, mut worker: W, sync_oracle: SO, create_inherent_data_providers: CIDP, - can_author_with: CAW, ) where B: BlockT, C: SelectChain<B>, @@ -500,7 +496,6 @@ pub async fn start_slot_worker<B, C, W, SO, CIDP, CAW, Proof>( SO: SyncOracle + Send, CIDP: CreateInherentDataProviders<B, ()> + Send, CIDP::InherentDataProviders: InherentDataProviderExt + Send, - CAW: CanAuthorWith<B> + Send, { let mut slots = Slots::new(slot_duration.as_duration(), create_inherent_data_providers, client); @@ -518,19 +513,7 @@ pub async fn start_slot_worker<B, C, W, SO, CIDP, CAW, Proof>( continue } - if let Err(err) = - can_author_with.can_author_with(&BlockId::Hash(slot_info.chain_head.hash())) - { - warn!( - target: "slots", - "Unable to author block in slot {},. `can_author_with` returned: {} \ - Probably a node update is required!", - slot_info.slot, - err, - ); - } else { - let _ = worker.on_slot(slot_info).await; - } + let _ = worker.on_slot(slot_info).await; } } diff --git a/substrate/primitives/consensus/common/src/lib.rs b/substrate/primitives/consensus/common/src/lib.rs index 043533cbf225859e67b1cee3a353c6c2c2c62b1d..458a5eee259a915cc5dd9d71b42821f3d1622340 100644 --- a/substrate/primitives/consensus/common/src/lib.rs +++ b/substrate/primitives/consensus/common/src/lib.rs @@ -25,7 +25,6 @@ use std::{sync::Arc, time::Duration}; use futures::prelude::*; use sp_runtime::{ - generic::BlockId, traits::{Block as BlockT, HashFor}, Digest, }; @@ -268,61 +267,3 @@ where T::is_offline(self) } } - -/// Checks if the current active native block authoring implementation can author with the runtime -/// at the given block. -pub trait CanAuthorWith<Block: BlockT> { - /// See trait docs for more information. - /// - /// # Return - /// - /// - Returns `Ok(())` when authoring is supported. - /// - Returns `Err(_)` when authoring is not supported. - fn can_author_with(&self, at: &BlockId<Block>) -> Result<(), String>; -} - -/// Checks if the node can author blocks by using -/// [`NativeVersion::can_author_with`](sp_version::NativeVersion::can_author_with). -#[derive(Clone)] -pub struct CanAuthorWithNativeVersion<T>(T); - -impl<T> CanAuthorWithNativeVersion<T> { - /// Creates a new instance of `Self`. - pub fn new(inner: T) -> Self { - Self(inner) - } -} - -impl<T: sp_version::GetRuntimeVersionAt<Block> + sp_version::GetNativeVersion, Block: BlockT> - CanAuthorWith<Block> for CanAuthorWithNativeVersion<T> -{ - fn can_author_with(&self, at: &BlockId<Block>) -> Result<(), String> { - match self.0.runtime_version(at) { - Ok(version) => self.0.native_version().can_author_with(&version), - Err(e) => Err(format!( - "Failed to get runtime version at `{}` and will disable authoring. Error: {}", - at, e, - )), - } - } -} - -/// Returns always `true` for `can_author_with`. This is useful for tests. -#[derive(Clone)] -pub struct AlwaysCanAuthor; - -impl<Block: BlockT> CanAuthorWith<Block> for AlwaysCanAuthor { - fn can_author_with(&self, _: &BlockId<Block>) -> Result<(), String> { - Ok(()) - } -} - -/// Never can author. -#[derive(Clone)] -pub struct NeverCanAuthor; - -impl<Block: BlockT> CanAuthorWith<Block> for NeverCanAuthor { - fn can_author_with(&self, _: &BlockId<Block>) -> Result<(), String> { - Err("Authoring is always disabled.".to_string()) - } -}