Allow blacklisting blocks from being finalized again after block revert (#6301)

* Allow blacklisting blocks from being finalized again after block revert

* Use BlockRules for storing unfinalized and add have_state_at in revert

* Move finalization_check in finalize_block upward

* Directly mark finalization blacklist as badblocks

* Remove obselete comment
This commit is contained in:
Wei Tang
2020-07-31 14:32:13 +02:00
committed by GitHub
parent 7db19db948
commit 3c5cbb00aa
9 changed files with 105 additions and 50 deletions
+11 -7
View File
@@ -19,7 +19,7 @@
//! Substrate Client data backend
use std::sync::Arc;
use std::collections::HashMap;
use std::collections::{HashMap, HashSet};
use sp_core::ChangesTrieConfigurationRange;
use sp_core::offchain::{OffchainStorage,storage::OffchainOverlayedChanges};
use sp_runtime::{generic::BlockId, Justification, Storage};
@@ -418,7 +418,10 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
) -> sp_blockchain::Result<()>;
/// Commit block insertion.
fn commit_operation(&self, transaction: Self::BlockImportOperation) -> sp_blockchain::Result<()>;
fn commit_operation(
&self,
transaction: Self::BlockImportOperation,
) -> sp_blockchain::Result<()>;
/// Finalize block with given Id.
///
@@ -449,16 +452,17 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
/// Returns state backend with post-state of given block.
fn state_at(&self, block: BlockId<Block>) -> sp_blockchain::Result<Self::State>;
/// Attempts to revert the chain by `n` blocks. If `revert_finalized` is set
/// it will attempt to revert past any finalized block, this is unsafe and
/// can potentially leave the node in an inconsistent state.
/// Attempts to revert the chain by `n` blocks. If `revert_finalized` is set it will attempt to
/// revert past any finalized block, this is unsafe and can potentially leave the node in an
/// inconsistent state.
///
/// Returns the number of blocks that were successfully reverted.
/// Returns the number of blocks that were successfully reverted and the list of finalized
/// blocks that has been reverted.
fn revert(
&self,
n: NumberFor<Block>,
revert_finalized: bool,
) -> sp_blockchain::Result<NumberFor<Block>>;
) -> sp_blockchain::Result<(NumberFor<Block>, HashSet<Block::Hash>)>;
/// Insert auxiliary data into key-value store.
fn insert_aux<