mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 18:01:03 +00:00
cumulus-consensus-common: block import: delayed_best_block flag added (#2001)
This PR adds the `delayed_best_block` flag to `ParachainBlockImport`. If not set, the `params.fork_choice` is not updated (to `ForkChoiceStrategy::Custom`) during the block import. When `delayed_best_block` is set to `false` all parachain blocks on the [longest fork](https://github.com/paritytech/polkadot-sdk/blob/552be4800d9e4b480f79a300fc531783e04be099/substrate/client/service/src/client/client.rs#L708-L709) will be notified as the best block, allowing transaction pool to be updated with every imported block. Otherwise imported blocks will not be notified as best blocks (`fork_choice=ForkChoiceStrategy::Custom(false)`), and transaction pool would be updated only with best block received from relay-chain. Improvement for: #1202 --------- Co-authored-by: Bastian Köcher <git@kchr.de>
This commit is contained in:
committed by
GitHub
parent
552be4800d
commit
b25d29a502
@@ -111,12 +111,15 @@ impl<B: BlockT> ParachainConsensus<B> for Box<dyn ParachainConsensus<B> + Send +
|
|||||||
|
|
||||||
/// Parachain specific block import.
|
/// Parachain specific block import.
|
||||||
///
|
///
|
||||||
/// This is used to set `block_import_params.fork_choice` to `false` as long as the block origin is
|
/// Specialized block import for parachains. It supports to delay setting the best block until the
|
||||||
/// not `NetworkInitialSync`. The best block for parachains is determined by the relay chain.
|
/// relay chain has included a candidate in its best block. By default the delayed best block
|
||||||
/// Meaning we will update the best block, as it is included by the relay-chain.
|
/// setting is disabled. The block import also monitors the imported blocks and prunes by default if
|
||||||
|
/// there are too many blocks at the same height. Too many blocks at the same height can for example
|
||||||
|
/// happen if the relay chain is rejecting the parachain blocks in the validation.
|
||||||
pub struct ParachainBlockImport<Block: BlockT, BI, BE> {
|
pub struct ParachainBlockImport<Block: BlockT, BI, BE> {
|
||||||
inner: BI,
|
inner: BI,
|
||||||
monitor: Option<SharedData<LevelMonitor<Block, BE>>>,
|
monitor: Option<SharedData<LevelMonitor<Block, BE>>>,
|
||||||
|
delayed_best_block: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Block: BlockT, BI, BE: Backend<Block>> ParachainBlockImport<Block, BI, BE> {
|
impl<Block: BlockT, BI, BE: Backend<Block>> ParachainBlockImport<Block, BI, BE> {
|
||||||
@@ -141,13 +144,27 @@ impl<Block: BlockT, BI, BE: Backend<Block>> ParachainBlockImport<Block, BI, BE>
|
|||||||
let monitor =
|
let monitor =
|
||||||
level_limit.map(|level_limit| SharedData::new(LevelMonitor::new(level_limit, backend)));
|
level_limit.map(|level_limit| SharedData::new(LevelMonitor::new(level_limit, backend)));
|
||||||
|
|
||||||
Self { inner, monitor }
|
Self { inner, monitor, delayed_best_block: false }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new instance which delays setting the best block.
|
||||||
|
///
|
||||||
|
/// The number of leaves per level limit is set to `LevelLimit::Default`.
|
||||||
|
pub fn new_with_delayed_best_block(inner: BI, backend: Arc<BE>) -> Self {
|
||||||
|
Self {
|
||||||
|
delayed_best_block: true,
|
||||||
|
..Self::new_with_limit(inner, backend, LevelLimit::Default)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Block: BlockT, I: Clone, BE> Clone for ParachainBlockImport<Block, I, BE> {
|
impl<Block: BlockT, I: Clone, BE> Clone for ParachainBlockImport<Block, I, BE> {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
ParachainBlockImport { inner: self.inner.clone(), monitor: self.monitor.clone() }
|
ParachainBlockImport {
|
||||||
|
inner: self.inner.clone(),
|
||||||
|
monitor: self.monitor.clone(),
|
||||||
|
delayed_best_block: self.delayed_best_block,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,11 +199,13 @@ where
|
|||||||
params.finalized = true;
|
params.finalized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Best block is determined by the relay chain, or if we are doing the initial sync
|
if self.delayed_best_block {
|
||||||
// we import all blocks as new best.
|
// Best block is determined by the relay chain, or if we are doing the initial sync
|
||||||
params.fork_choice = Some(sc_consensus::ForkChoiceStrategy::Custom(
|
// we import all blocks as new best.
|
||||||
params.origin == sp_consensus::BlockOrigin::NetworkInitialSync,
|
params.fork_choice = Some(sc_consensus::ForkChoiceStrategy::Custom(
|
||||||
));
|
params.origin == sp_consensus::BlockOrigin::NetworkInitialSync,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
let maybe_lock = self.monitor.as_ref().map(|monitor_lock| {
|
let maybe_lock = self.monitor.as_ref().map(|monitor_lock| {
|
||||||
let mut monitor = monitor_lock.shared_data_locked();
|
let mut monitor = monitor_lock.shared_data_locked();
|
||||||
|
|||||||
@@ -1124,7 +1124,8 @@ fn find_potential_parents_aligned_with_pending() {
|
|||||||
|
|
||||||
let backend = Arc::new(Backend::new_test(1000, 1));
|
let backend = Arc::new(Backend::new_test(1000, 1));
|
||||||
let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build());
|
let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build());
|
||||||
let mut para_import = ParachainBlockImport::new(client.clone(), backend.clone());
|
let mut para_import =
|
||||||
|
ParachainBlockImport::new_with_delayed_best_block(client.clone(), backend.clone());
|
||||||
|
|
||||||
let relay_parent = relay_hash_from_block_num(10);
|
let relay_parent = relay_hash_from_block_num(10);
|
||||||
// Choose different relay parent for alternative chain to get new hashes.
|
// Choose different relay parent for alternative chain to get new hashes.
|
||||||
@@ -1279,7 +1280,8 @@ fn find_potential_parents_aligned_no_pending() {
|
|||||||
|
|
||||||
let backend = Arc::new(Backend::new_test(1000, 1));
|
let backend = Arc::new(Backend::new_test(1000, 1));
|
||||||
let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build());
|
let client = Arc::new(TestClientBuilder::with_backend(backend.clone()).build());
|
||||||
let mut para_import = ParachainBlockImport::new(client.clone(), backend.clone());
|
let mut para_import =
|
||||||
|
ParachainBlockImport::new_with_delayed_best_block(client.clone(), backend.clone());
|
||||||
|
|
||||||
let relay_parent = relay_hash_from_block_num(10);
|
let relay_parent = relay_hash_from_block_num(10);
|
||||||
// Choose different relay parent for alternative chain to get new hashes.
|
// Choose different relay parent for alternative chain to get new hashes.
|
||||||
|
|||||||
Reference in New Issue
Block a user