From 979d22ac40f86636a0943598a1c80f905d7282de Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Sun, 2 Feb 2020 16:22:11 +0100 Subject: [PATCH 1/8] babe: pass epoch data via intermediates --- client/consensus/babe/src/epoch_changes.rs | 2 + client/consensus/babe/src/lib.rs | 51 +++++++++++++--------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/babe/src/epoch_changes.rs index 01e957c4998ed..50aea878bd1fd 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/babe/src/epoch_changes.rs @@ -72,12 +72,14 @@ impl<'a, H, Block> IsDescendentOfBuilder } /// An unimported genesis epoch. +#[derive(Decode, Encode, Debug, Clone)] pub struct UnimportedGenesis(Epoch); /// The viable epoch under which a block can be verified. /// /// If this is the first non-genesis block in the chain, then it will /// hold an `UnimportedGenesis` epoch. +#[derive(Decode, Encode, Debug, Clone)] pub enum ViableEpoch { Genesis(UnimportedGenesis), Regular(Epoch), diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 848097231109f..8cacd26629d66 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -64,6 +64,7 @@ pub use sp_consensus_babe::{ }; pub use sp_consensus::SyncOracle; use std::{collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}}; +use codec::{Encode, Decode}; use sp_consensus_babe; use sp_consensus::{ImportResult, CanAuthorWith}; use sp_consensus::import_queue::{ @@ -101,7 +102,7 @@ use log::{warn, debug, info, trace}; use sc_consensus_slots::{ SlotWorker, SlotInfo, SlotCompatible, StorageChanges, CheckedHeader, check_equivocation, }; -use epoch_changes::descendent_query; +use epoch_changes::{descendent_query, ViableEpoch}; use sp_blockchain::{ Result as ClientResult, Error as ClientError, HeaderBackend, ProvideCache, HeaderMetadata @@ -121,7 +122,6 @@ pub use sp_consensus_babe::{ }; pub use epoch_changes::{EpochChanges, EpochChangesFor, SharedEpochChanges}; - #[derive(derive_more::Display, Debug)] enum Error { #[display(fmt = "Multiple BABE pre-runtime digests, rejecting!")] @@ -162,16 +162,14 @@ enum Error { FetchParentHeader(sp_blockchain::Error), #[display(fmt = "Expected epoch change to happen at {:?}, s{}", _0, _1)] ExpectedEpochChange(B::Hash, u64), - #[display(fmt = "Could not look up epoch: {:?}", _0)] - CouldNotLookUpEpoch(Box>), - #[display(fmt = "Block {} is not valid under any epoch.", _0)] - BlockNotValid(B::Hash), #[display(fmt = "Unexpected epoch change")] UnexpectedEpochChange, #[display(fmt = "Parent block of {} has no associated weight", _0)] ParentBlockNoAssociatedWeight(B::Hash), #[display(fmt = "Checking inherents failed: {}", _0)] CheckInherents(String), + #[display(fmt = "Intermediate is missing or invalid for block import")] + NoIntermediate, Client(sp_blockchain::Error), Runtime(sp_inherents::Error), ForkTree(Box>), @@ -197,6 +195,17 @@ macro_rules! babe_info { }; } + +/// Intermediate value passed to block importer. +#[derive(Encode, Decode, Clone, Debug)] +pub struct BabeIntermediate { + /// The epoch data. + pub epoch: ViableEpoch, +} + +/// Intermediate key for Babe engine. +pub static INTERMEDIATE_KEY: &[u8] = b"babe1"; + /// A slot duration. Create with `get_or_compute`. // FIXME: Once Rust has higher-kinded types, the duplication between this // and `super::babe::Config` can be eliminated. @@ -796,6 +805,12 @@ impl Verifier for BabeVerifier ?pre_header); + let mut intermediates = HashMap::new(); + intermediates.insert( + INTERMEDIATE_KEY.to_vec(), + BabeIntermediate { epoch }.encode() + ); + let block_import_params = BlockImportParams { origin, header: pre_header, @@ -805,7 +820,7 @@ impl Verifier for BabeVerifier BlockImport for BabeBlockImport| ConsensusError::ChainLookup( - babe_err(Error::::CouldNotLookUpEpoch(Box::new(e))).into() - ))? - .ok_or_else(|| ConsensusError::ClientImport( - babe_err(Error::::BlockNotValid(hash)).into() - ))?; + let intermediate = BabeIntermediate::decode( + &mut &block.intermediates.remove(INTERMEDIATE_KEY) + .ok_or(ConsensusError::ClientImport( + babe_err(Error::::NoIntermediate).into() + ))?[..] + ).map_err(|_| ConsensusError::ClientImport( + babe_err(Error::::NoIntermediate).into() + ))?; + let epoch = intermediate.epoch; let first_in_epoch = parent_slot < epoch.as_ref().start_slot; (epoch, first_in_epoch, parent_weight) }; From 0520f33cfcac2ba1626306f83be4d99460f872f9 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Mon, 3 Feb 2020 11:16:51 +0100 Subject: [PATCH 2/8] Switch to use Box for intermediates --- client/consensus/babe/src/lib.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 8cacd26629d66..f4389ca292b0c 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -63,7 +63,10 @@ pub use sp_consensus_babe::{ CompatibleDigestItem, }; pub use sp_consensus::SyncOracle; -use std::{collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}}; +use std::{ + collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}, + any::Any, borrow::Cow +}; use codec::{Encode, Decode}; use sp_consensus_babe; use sp_consensus::{ImportResult, CanAuthorWith}; @@ -168,8 +171,6 @@ enum Error { ParentBlockNoAssociatedWeight(B::Hash), #[display(fmt = "Checking inherents failed: {}", _0)] CheckInherents(String), - #[display(fmt = "Intermediate is missing or invalid for block import")] - NoIntermediate, Client(sp_blockchain::Error), Runtime(sp_inherents::Error), ForkTree(Box>), @@ -807,8 +808,8 @@ impl Verifier for BabeVerifier, ); let block_import_params = BlockImportParams { @@ -978,14 +979,9 @@ impl BlockImport for BabeBlockImport::NoIntermediate).into() - ))?[..] - ).map_err(|_| ConsensusError::ClientImport( - babe_err(Error::::NoIntermediate).into() - ))?; + let intermediate = block.take_intermediate::( + INTERMEDIATE_KEY + )?; let epoch = intermediate.epoch; let first_in_epoch = parent_slot < epoch.as_ref().start_slot; From fab62324fc79eb6317ee29952c782c55fb5b2188 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Mon, 3 Feb 2020 11:25:59 +0100 Subject: [PATCH 3/8] Set intermediate.epoch to be Option --- client/consensus/babe/src/lib.rs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index f4389ca292b0c..9c125a8f4ba2c 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -165,6 +165,10 @@ enum Error { FetchParentHeader(sp_blockchain::Error), #[display(fmt = "Expected epoch change to happen at {:?}, s{}", _0, _1)] ExpectedEpochChange(B::Hash, u64), + #[display(fmt = "Could not look up epoch: {:?}", _0)] + CouldNotLookUpEpoch(Box>), + #[display(fmt = "Block {} is not valid under any epoch.", _0)] + BlockNotValid(B::Hash), #[display(fmt = "Unexpected epoch change")] UnexpectedEpochChange, #[display(fmt = "Parent block of {} has no associated weight", _0)] @@ -200,8 +204,8 @@ macro_rules! babe_info { /// Intermediate value passed to block importer. #[derive(Encode, Decode, Clone, Debug)] pub struct BabeIntermediate { - /// The epoch data. - pub epoch: ViableEpoch, + /// The epoch data, if available. + pub epoch: Option, } /// Intermediate key for Babe engine. @@ -809,7 +813,9 @@ impl Verifier for BabeVerifier, + Box::new(BabeIntermediate { + epoch: Some(epoch), + }) as Box, ); let block_import_params = BlockImportParams { @@ -983,7 +989,25 @@ impl BlockImport for BabeBlockImport epoch, + None => { + epoch_changes.epoch_for_child_of( + descendent_query(&*self.client), + &parent_hash, + *parent_header.number(), + slot_number, + |slot| self.config.genesis_epoch(slot), + ) + .map_err(|e: fork_tree::Error| + ConsensusError::ChainLookup( + babe_err(Error::::CouldNotLookUpEpoch(Box::new(e))).into() + ))? + .ok_or_else(|| ConsensusError::ClientImport( + babe_err(Error::::BlockNotValid(hash)).into() + ))? + }, + }; let first_in_epoch = parent_slot < epoch.as_ref().start_slot; (epoch, first_in_epoch, parent_weight) }; From 6c89c29f18328ceeb575f74b962b5d29eec60f9d Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Mon, 3 Feb 2020 11:41:31 +0100 Subject: [PATCH 4/8] Fix proposer should put out an empty intermediate --- client/consensus/babe/src/lib.rs | 9 ++++++++- client/consensus/babe/src/tests.rs | 9 ++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 9c125a8f4ba2c..af9e09f71c4ad 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -465,7 +465,14 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork storage_changes: Some(storage_changes), finalized: false, auxiliary: Vec::new(), // block-weight is written in block import. - intermediates: Default::default(), + intermediates: { + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { epoch: None }) as Box, + ); + intermediates + }, fork_choice: None, allow_missing_state: false, import_existing: false, diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 3339c06d650dc..47cbb8fdf54fe 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -594,7 +594,14 @@ fn propose_and_import_block( storage_changes: None, finalized: false, auxiliary: Vec::new(), - intermediates: Default::default(), + intermediates: { + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { epoch: None }) as Box, + ); + intermediates + }, fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, From 9939bf6ccf52f9718b8046e2b0a74a5c48ca06a9 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Wed, 5 Feb 2020 14:44:37 +0100 Subject: [PATCH 5/8] Remove unnecessary encode/decode --- client/consensus/babe/src/epoch_changes.rs | 2 -- client/consensus/babe/src/lib.rs | 2 -- 2 files changed, 4 deletions(-) diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/babe/src/epoch_changes.rs index 50aea878bd1fd..01e957c4998ed 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/babe/src/epoch_changes.rs @@ -72,14 +72,12 @@ impl<'a, H, Block> IsDescendentOfBuilder } /// An unimported genesis epoch. -#[derive(Decode, Encode, Debug, Clone)] pub struct UnimportedGenesis(Epoch); /// The viable epoch under which a block can be verified. /// /// If this is the first non-genesis block in the chain, then it will /// hold an `UnimportedGenesis` epoch. -#[derive(Decode, Encode, Debug, Clone)] pub enum ViableEpoch { Genesis(UnimportedGenesis), Regular(Epoch), diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index af9e09f71c4ad..399b3a9c2356d 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -67,7 +67,6 @@ use std::{ collections::HashMap, sync::Arc, u64, pin::Pin, time::{Instant, Duration}, any::Any, borrow::Cow }; -use codec::{Encode, Decode}; use sp_consensus_babe; use sp_consensus::{ImportResult, CanAuthorWith}; use sp_consensus::import_queue::{ @@ -202,7 +201,6 @@ macro_rules! babe_info { /// Intermediate value passed to block importer. -#[derive(Encode, Decode, Clone, Debug)] pub struct BabeIntermediate { /// The epoch data, if available. pub epoch: Option, From 138051442b64429f2d8ddaea141b0b555f9d3402 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 6 Feb 2020 15:19:23 +0100 Subject: [PATCH 6/8] Add EpochData to block_import_params in slot worker --- client/consensus/babe/src/lib.rs | 42 +++++++----------------------- client/consensus/babe/src/tests.rs | 12 ++++++++- client/consensus/slots/src/lib.rs | 4 ++- 3 files changed, 24 insertions(+), 34 deletions(-) diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 399b3a9c2356d..27d6eca5d9f7d 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -164,10 +164,6 @@ enum Error { FetchParentHeader(sp_blockchain::Error), #[display(fmt = "Expected epoch change to happen at {:?}, s{}", _0, _1)] ExpectedEpochChange(B::Hash, u64), - #[display(fmt = "Could not look up epoch: {:?}", _0)] - CouldNotLookUpEpoch(Box>), - #[display(fmt = "Block {} is not valid under any epoch.", _0)] - BlockNotValid(B::Hash), #[display(fmt = "Unexpected epoch change")] UnexpectedEpochChange, #[display(fmt = "Parent block of {} has no associated weight", _0)] @@ -203,7 +199,7 @@ macro_rules! babe_info { /// Intermediate value passed to block importer. pub struct BabeIntermediate { /// The epoch data, if available. - pub epoch: Option, + pub epoch: ViableEpoch, } /// Intermediate key for Babe engine. @@ -372,7 +368,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork SO: SyncOracle + Send + Clone, Error: std::error::Error + Send + From + From + 'static, { - type EpochData = Epoch; + type EpochData = ViableEpoch; type Claim = (BabePreDigest, AuthorityPair); type SyncOracle = SO; type CreateProposer = Pin sc_consensus_slots::SimpleSlotWorker for BabeWork |slot| self.config.genesis_epoch(slot) ) .map_err(|e| ConsensusError::ChainLookup(format!("{:?}", e)))? - .map(|e| e.into_inner()) .ok_or(sp_consensus::Error::InvalidAuthoritiesSet) } fn authorities_len(&self, epoch_data: &Self::EpochData) -> usize { - epoch_data.authorities.len() + epoch_data.as_ref().authorities.len() } fn claim_slot( &self, _parent_header: &B::Header, slot_number: SlotNumber, - epoch_data: &Epoch, + epoch_data: &ViableEpoch, ) -> Option { debug!(target: "babe", "Attempting to claim slot {}", slot_number); let s = authorship::claim_slot( slot_number, - epoch_data, + epoch_data.as_ref(), &*self.config, &self.keystore, ); @@ -447,8 +442,9 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork Vec, StorageChanges, Self::Claim, + Self::EpochData, ) -> sp_consensus::BlockImportParams + Send> { - Box::new(|header, header_hash, body, storage_changes, (_, pair)| { + Box::new(|header, header_hash, body, storage_changes, (_, pair), epoch| { // sign the pre-sealed hash of the block and then // add it to a digest item. let signature = pair.sign(header_hash.as_ref()); @@ -467,7 +463,7 @@ impl sc_consensus_slots::SimpleSlotWorker for BabeWork let mut intermediates = HashMap::new(); intermediates.insert( Cow::from(INTERMEDIATE_KEY), - Box::new(BabeIntermediate { epoch: None }) as Box, + Box::new(BabeIntermediate { epoch }) as Box, ); intermediates }, @@ -819,7 +815,7 @@ impl Verifier for BabeVerifier, ); @@ -994,25 +990,7 @@ impl BlockImport for BabeBlockImport epoch, - None => { - epoch_changes.epoch_for_child_of( - descendent_query(&*self.client), - &parent_hash, - *parent_header.number(), - slot_number, - |slot| self.config.genesis_epoch(slot), - ) - .map_err(|e: fork_tree::Error| - ConsensusError::ChainLookup( - babe_err(Error::::CouldNotLookUpEpoch(Box::new(e))).into() - ))? - .ok_or_else(|| ConsensusError::ClientImport( - babe_err(Error::::BlockNotValid(hash)).into() - ))? - }, - }; + let epoch = intermediate.epoch; let first_in_epoch = parent_slot < epoch.as_ref().start_slot; (epoch, first_in_epoch, parent_weight) }; diff --git a/client/consensus/babe/src/tests.rs b/client/consensus/babe/src/tests.rs index 47cbb8fdf54fe..d429d5d2840b8 100644 --- a/client/consensus/babe/src/tests.rs +++ b/client/consensus/babe/src/tests.rs @@ -566,8 +566,18 @@ fn propose_and_import_block( ], }; + let parent_hash = parent.hash(); + let mut block = futures::executor::block_on(proposer.propose_with(pre_digest)).unwrap().block; + let epoch = proposer_factory.epoch_changes.lock().epoch_for_child_of( + descendent_query(&*proposer_factory.client), + &parent_hash, + *parent.number(), + slot_number, + |slot| proposer_factory.config.genesis_epoch(slot) + ).unwrap().unwrap(); + let seal = { // sign the pre-sealed hash of the block and then // add it to a digest item. @@ -598,7 +608,7 @@ fn propose_and_import_block( let mut intermediates = HashMap::new(); intermediates.insert( Cow::from(INTERMEDIATE_KEY), - Box::new(BabeIntermediate { epoch: None }) as Box, + Box::new(BabeIntermediate { epoch }) as Box, ); intermediates }, diff --git a/client/consensus/slots/src/lib.rs b/client/consensus/slots/src/lib.rs index c6185d5d307b9..8bc2547a49e39 100644 --- a/client/consensus/slots/src/lib.rs +++ b/client/consensus/slots/src/lib.rs @@ -81,7 +81,7 @@ pub trait SimpleSlotWorker { type Claim: Send + 'static; /// Epoch data necessary for authoring. - type EpochData; + type EpochData: Send + 'static; /// The logging target to use when logging messages. fn logging_target(&self) -> &'static str; @@ -119,6 +119,7 @@ pub trait SimpleSlotWorker { Vec, StorageChanges<>::Transaction, B>, Self::Claim, + Self::EpochData, ) -> sp_consensus::BlockImportParams< B, >::Transaction @@ -280,6 +281,7 @@ pub trait SimpleSlotWorker { body, proposal.storage_changes, claim, + epoch_data, ); info!( From 233bb94906a28985a75d0151ea7591ed7959b693 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 6 Feb 2020 15:24:17 +0100 Subject: [PATCH 7/8] Fix aura compile --- client/consensus/aura/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/consensus/aura/src/lib.rs b/client/consensus/aura/src/lib.rs index 4b107d87d5512..434314a85353e 100644 --- a/client/consensus/aura/src/lib.rs +++ b/client/consensus/aura/src/lib.rs @@ -274,8 +274,9 @@ impl sc_consensus_slots::SimpleSlotWorker for AuraW Vec, StorageChanges, B>, Self::Claim, + Self::EpochData, ) -> sp_consensus::BlockImportParams> + Send> { - Box::new(|header, header_hash, body, storage_changes, pair| { + Box::new(|header, header_hash, body, storage_changes, pair, _epoch| { // sign the pre-sealed hash of the block and then // add it to a digest item. let signature = pair.sign(header_hash.as_ref()); From a52e96cff4b65a6566a847f305cc2e3e43d8c3e4 Mon Sep 17 00:00:00 2001 From: Wei Tang Date: Thu, 6 Feb 2020 16:38:43 +0100 Subject: [PATCH 8/8] Fix integration test --- bin/node/cli/src/service.rs | 27 ++++++++++++++++++---- client/consensus/babe/src/epoch_changes.rs | 4 ++-- client/consensus/babe/src/lib.rs | 17 ++++++++++++-- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/bin/node/cli/src/service.rs b/bin/node/cli/src/service.rs index c462a60836a22..dc03eb970fc55 100644 --- a/bin/node/cli/src/service.rs +++ b/bin/node/cli/src/service.rs @@ -371,8 +371,10 @@ pub fn new_light(config: NodeConfiguration) #[cfg(test)] mod tests { - use std::sync::Arc; - use sc_consensus_babe::CompatibleDigestItem; + use std::{sync::Arc, collections::HashMap, borrow::Cow, any::Any}; + use sc_consensus_babe::{ + descendent_query, CompatibleDigestItem, BabeIntermediate, INTERMEDIATE_KEY + }; use sp_consensus::{ Environment, Proposer, BlockImportParams, BlockOrigin, ForkChoiceStrategy, BlockImport, RecordProof, @@ -384,7 +386,7 @@ mod tests { use sp_core::{crypto::Pair as CryptoPair, H256}; use sp_runtime::{ generic::{BlockId, Era, Digest, SignedPayload}, - traits::Block as BlockT, + traits::{Block as BlockT, Header as HeaderT}, traits::Verify, OpaqueExtrinsic, }; @@ -499,11 +501,21 @@ mod tests { let parent_id = BlockId::number(service.client().chain_info().best_number); let parent_header = service.client().header(&parent_id).unwrap().unwrap(); + let parent_hash = parent_header.hash(); + let parent_number = *parent_header.number(); let mut proposer_factory = sc_basic_authorship::ProposerFactory { client: service.client(), transaction_pool: service.transaction_pool(), }; + let epoch = babe_link.epoch_changes().lock().epoch_for_child_of( + descendent_query(&*service.client()), + &parent_hash, + parent_number, + slot_num, + |slot| babe_link.config().genesis_epoch(slot) + ).unwrap().unwrap(); + let mut digest = Digest::::default(); // even though there's only one authority some slots might be empty, @@ -555,7 +567,14 @@ mod tests { storage_changes: None, finalized: false, auxiliary: Vec::new(), - intermediates: Default::default(), + intermediates: { + let mut intermediates = HashMap::new(); + intermediates.insert( + Cow::from(INTERMEDIATE_KEY), + Box::new(BabeIntermediate { epoch }) as Box, + ); + intermediates + }, fork_choice: Some(ForkChoiceStrategy::LongestChain), allow_missing_state: false, import_existing: false, diff --git a/client/consensus/babe/src/epoch_changes.rs b/client/consensus/babe/src/epoch_changes.rs index 01e957c4998ed..26eee4cc92ff8 100644 --- a/client/consensus/babe/src/epoch_changes.rs +++ b/client/consensus/babe/src/epoch_changes.rs @@ -48,13 +48,13 @@ pub trait IsDescendentOfBuilder { } /// Produce a descendent query object given the client. -pub(crate) fn descendent_query(client: &H) -> HeaderBackendDescendentBuilder<&H, Block> { +pub fn descendent_query(client: &H) -> HeaderBackendDescendentBuilder<&H, Block> { HeaderBackendDescendentBuilder(client, std::marker::PhantomData) } /// Wrapper to get around unconstrained type errors when implementing /// `IsDescendentOfBuilder` for header backends. -pub(crate) struct HeaderBackendDescendentBuilder(H, std::marker::PhantomData); +pub struct HeaderBackendDescendentBuilder(H, std::marker::PhantomData); impl<'a, H, Block> IsDescendentOfBuilder for HeaderBackendDescendentBuilder<&'a H, Block> where diff --git a/client/consensus/babe/src/lib.rs b/client/consensus/babe/src/lib.rs index 27d6eca5d9f7d..dfa379c408cc3 100644 --- a/client/consensus/babe/src/lib.rs +++ b/client/consensus/babe/src/lib.rs @@ -104,7 +104,7 @@ use log::{warn, debug, info, trace}; use sc_consensus_slots::{ SlotWorker, SlotInfo, SlotCompatible, StorageChanges, CheckedHeader, check_equivocation, }; -use epoch_changes::{descendent_query, ViableEpoch}; +use epoch_changes::ViableEpoch; use sp_blockchain::{ Result as ClientResult, Error as ClientError, HeaderBackend, ProvideCache, HeaderMetadata @@ -122,7 +122,7 @@ mod tests; pub use sp_consensus_babe::{ AuthorityId, AuthorityPair, AuthoritySignature, Epoch, NextEpochDescriptor, }; -pub use epoch_changes::{EpochChanges, EpochChangesFor, SharedEpochChanges}; +pub use epoch_changes::{descendent_query, EpochChanges, EpochChangesFor, SharedEpochChanges}; #[derive(derive_more::Display, Debug)] enum Error { @@ -615,6 +615,19 @@ pub struct BabeLink { epoch_changes: SharedEpochChanges, config: Config, } + +impl BabeLink { + /// Get the epoch changes of this link. + pub fn epoch_changes(&self) -> &SharedEpochChanges { + &self.epoch_changes + } + + /// Get the config of this link. + pub fn config(&self) -> &Config { + &self.config + } +} + /// A verifier for Babe blocks. pub struct BabeVerifier { client: Arc>,