mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 13:57:58 +00:00
Allow import withouth state verification (#4031)
* Allow import without state verification * Explicit None Co-Authored-By: Robert Habermeier <rphmeier@gmail.com>
This commit is contained in:
committed by
Gavin Wood
parent
021f3a3f06
commit
cca9ab436c
@@ -838,15 +838,22 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
finalized,
|
||||
auxiliary,
|
||||
fork_choice,
|
||||
allow_missing_state,
|
||||
} = import_block;
|
||||
|
||||
assert!(justification.is_some() && finalized || justification.is_none());
|
||||
|
||||
let parent_hash = header.parent_hash().clone();
|
||||
let mut enact_state = true;
|
||||
|
||||
match self.backend.blockchain().status(BlockId::Hash(parent_hash))? {
|
||||
blockchain::BlockStatus::InChain => {},
|
||||
blockchain::BlockStatus::Unknown => return Ok(ImportResult::UnknownParent),
|
||||
match self.block_status(&BlockId::Hash(parent_hash))? {
|
||||
BlockStatus::Unknown => return Ok(ImportResult::UnknownParent),
|
||||
BlockStatus::InChainWithState | BlockStatus::Queued => {},
|
||||
BlockStatus::InChainPruned if allow_missing_state => {
|
||||
enact_state = false;
|
||||
},
|
||||
BlockStatus::InChainPruned => return Ok(ImportResult::MissingState),
|
||||
BlockStatus::KnownBad => return Ok(ImportResult::KnownBad),
|
||||
}
|
||||
|
||||
let import_headers = if post_digests.is_empty() {
|
||||
@@ -875,6 +882,7 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
finalized,
|
||||
auxiliary,
|
||||
fork_choice,
|
||||
enact_state,
|
||||
);
|
||||
|
||||
if let Ok(ImportResult::Imported(ref aux)) = result {
|
||||
@@ -902,6 +910,7 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
finalized: bool,
|
||||
aux: Vec<(Vec<u8>, Option<Vec<u8>>)>,
|
||||
fork_choice: ForkChoiceStrategy,
|
||||
enact_state: bool,
|
||||
) -> error::Result<ImportResult> where
|
||||
E: CallExecutor<Block, Blake2Hasher> + Send + Sync + Clone,
|
||||
{
|
||||
@@ -927,22 +936,39 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
BlockOrigin::Genesis | BlockOrigin::NetworkInitialSync | BlockOrigin::File => false,
|
||||
};
|
||||
|
||||
self.backend.begin_state_operation(&mut operation.op, BlockId::Hash(parent_hash))?;
|
||||
let storage_changes = match &body {
|
||||
Some(body) if enact_state => {
|
||||
self.backend.begin_state_operation(&mut operation.op, BlockId::Hash(parent_hash))?;
|
||||
|
||||
// ensure parent block is finalized to maintain invariant that
|
||||
// finality is called sequentially.
|
||||
if finalized {
|
||||
self.apply_finality_with_block_hash(operation, parent_hash, None, info.best_hash, make_notifications)?;
|
||||
}
|
||||
// ensure parent block is finalized to maintain invariant that
|
||||
// finality is called sequentially.
|
||||
if finalized {
|
||||
self.apply_finality_with_block_hash(operation, parent_hash, None, info.best_hash, make_notifications)?;
|
||||
}
|
||||
|
||||
// FIXME #1232: correct path logic for when to execute this function
|
||||
let (storage_update, changes_update, storage_changes) = self.block_execution(
|
||||
&operation.op,
|
||||
&import_headers,
|
||||
origin,
|
||||
hash,
|
||||
body.clone(),
|
||||
)?;
|
||||
// FIXME #1232: correct path logic for when to execute this function
|
||||
let (storage_update, changes_update, storage_changes) = self.block_execution(
|
||||
&operation.op,
|
||||
&import_headers,
|
||||
origin,
|
||||
hash,
|
||||
&body,
|
||||
)?;
|
||||
|
||||
operation.op.update_cache(new_cache);
|
||||
if let Some(storage_update) = storage_update {
|
||||
operation.op.update_db_storage(storage_update)?;
|
||||
}
|
||||
if let Some(storage_changes) = storage_changes.clone() {
|
||||
operation.op.update_storage(storage_changes.0, storage_changes.1)?;
|
||||
}
|
||||
if let Some(Some(changes_update)) = changes_update {
|
||||
operation.op.update_changes_trie(changes_update)?;
|
||||
}
|
||||
storage_changes
|
||||
},
|
||||
_ => None,
|
||||
};
|
||||
|
||||
let is_new_best = finalized || match fork_choice {
|
||||
ForkChoiceStrategy::LongestChain => import_headers.post().number() > &info.best_number,
|
||||
@@ -977,17 +1003,6 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
leaf_state,
|
||||
)?;
|
||||
|
||||
operation.op.update_cache(new_cache);
|
||||
if let Some(storage_update) = storage_update {
|
||||
operation.op.update_db_storage(storage_update)?;
|
||||
}
|
||||
if let Some(storage_changes) = storage_changes.clone() {
|
||||
operation.op.update_storage(storage_changes.0, storage_changes.1)?;
|
||||
}
|
||||
if let Some(Some(changes_update)) = changes_update {
|
||||
operation.op.update_changes_trie(changes_update)?;
|
||||
}
|
||||
|
||||
operation.op.insert_aux(aux)?;
|
||||
|
||||
if make_notifications {
|
||||
@@ -1014,7 +1029,7 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
import_headers: &PrePostHeader<Block::Header>,
|
||||
origin: BlockOrigin,
|
||||
hash: Block::Hash,
|
||||
body: Option<Vec<Block::Extrinsic>>,
|
||||
body: &[Block::Extrinsic],
|
||||
) -> error::Result<(
|
||||
Option<StorageUpdate<B, Block>>,
|
||||
Option<Option<ChangesUpdate<Block>>>,
|
||||
@@ -1052,7 +1067,7 @@ impl<B, E, Block, RA> Client<B, E, Block, RA> where
|
||||
|
||||
let encoded_block = <Block as BlockT>::encode_from(
|
||||
import_headers.pre(),
|
||||
&body.unwrap_or_default()
|
||||
body,
|
||||
);
|
||||
|
||||
let (_, storage_update, changes_update) = self.executor
|
||||
@@ -1523,7 +1538,7 @@ impl<'a, B, E, Block, RA> consensus::BlockImport<Block> for &'a Client<B, E, Blo
|
||||
&mut self,
|
||||
block: BlockCheckParams<Block>,
|
||||
) -> Result<ImportResult, Self::Error> {
|
||||
let BlockCheckParams { hash, number, parent_hash } = block;
|
||||
let BlockCheckParams { hash, number, parent_hash, allow_missing_state } = block;
|
||||
|
||||
if let Some(h) = self.fork_blocks.as_ref().and_then(|x| x.get(&number)) {
|
||||
if &hash != h {
|
||||
@@ -1541,7 +1556,9 @@ impl<'a, B, E, Block, RA> consensus::BlockImport<Block> for &'a Client<B, E, Blo
|
||||
.map_err(|e| ConsensusError::ClientImport(e.to_string()))?
|
||||
{
|
||||
BlockStatus::InChainWithState | BlockStatus::Queued => {},
|
||||
BlockStatus::Unknown | BlockStatus::InChainPruned => return Ok(ImportResult::UnknownParent),
|
||||
BlockStatus::Unknown => return Ok(ImportResult::UnknownParent),
|
||||
BlockStatus::InChainPruned if allow_missing_state => {},
|
||||
BlockStatus::InChainPruned => return Ok(ImportResult::MissingState),
|
||||
BlockStatus::KnownBad => return Ok(ImportResult::KnownBad),
|
||||
}
|
||||
|
||||
@@ -1553,7 +1570,6 @@ impl<'a, B, E, Block, RA> consensus::BlockImport<Block> for &'a Client<B, E, Blo
|
||||
BlockStatus::KnownBad => return Ok(ImportResult::KnownBad),
|
||||
}
|
||||
|
||||
|
||||
Ok(ImportResult::imported(false))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user