Skip to content

Commit

Permalink
fix: enable skip_state_root_validation on new engine
Browse files Browse the repository at this point in the history
  • Loading branch information
j75689 committed Sep 19, 2024
1 parent afc0917 commit 0f97971
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 18 deletions.
3 changes: 3 additions & 0 deletions crates/engine/service/src/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ where
pruner: Pruner<DB, ProviderFactory<DB>>,
payload_builder: PayloadBuilderHandle<T>,
tree_config: TreeConfig,
skip_state_root_validation: bool,
) -> Self {
let downloader = BasicBlockDownloader::new(client, consensus.clone());

Expand All @@ -97,6 +98,7 @@ where
payload_builder,
canonical_in_memory_state,
tree_config,
skip_state_root_validation,
);

let engine_handler = EngineApiRequestHandler::new(to_tree_tx, from_tree);
Expand Down Expand Up @@ -203,6 +205,7 @@ mod tests {
pruner,
PayloadBuilderHandle::new(tx),
TreeConfig::default(),
false,
);
}
}
45 changes: 27 additions & 18 deletions crates/engine/tree/src/tree/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ use reth_rpc_types::{
ExecutionPayload,
};
use reth_stages_api::ControlFlow;
use reth_trie::HashedPostState;
use reth_trie::{updates::TrieUpdates, HashedPostState};
use std::{
collections::{BTreeMap, HashMap, HashSet},
ops::Bound,
Expand Down Expand Up @@ -415,6 +415,8 @@ pub struct EngineApiTreeHandler<P, E, T: EngineTypes> {
config: TreeConfig,
/// Metrics for the engine api.
metrics: EngineApiMetrics,
/// Flag indicating whether the state root validation should be skipped.
skip_state_root_validation: bool,
}

impl<P, E, T> EngineApiTreeHandler<P, E, T>
Expand All @@ -437,6 +439,7 @@ where
persistence_state: PersistenceState,
payload_builder: PayloadBuilderHandle<T>,
config: TreeConfig,
skip_state_root_validation: bool,
) -> Self {
let (incoming_tx, incoming) = std::sync::mpsc::channel();
Self {
Expand All @@ -455,6 +458,7 @@ where
config,
metrics: Default::default(),
incoming_tx,
skip_state_root_validation,
}
}

Expand All @@ -473,6 +477,7 @@ where
payload_builder: PayloadBuilderHandle<T>,
canonical_in_memory_state: CanonicalInMemoryState,
config: TreeConfig,
skip_state_root_validation: bool,
) -> (Sender<FromEngine<EngineApiRequest<T>>>, UnboundedReceiver<EngineApiEvent>) {
let best_block_number = provider.best_block_number().unwrap_or(0);
let header = provider.sealed_header(best_block_number).ok().flatten().unwrap_or_default();
Expand Down Expand Up @@ -502,6 +507,7 @@ where
persistence_state,
payload_builder,
config,
skip_state_root_validation,
);
let incoming = task.incoming_tx.clone();
std::thread::Builder::new().name("Tree Task".to_string()).spawn(|| task.run()).unwrap();
Expand Down Expand Up @@ -1775,26 +1781,28 @@ where
)?;

let hashed_state = HashedPostState::from_bundle_state(&output.state.state);
let trie_output = TrieUpdates::default();
if !self.skip_state_root_validation {
let root_time = Instant::now();
let (state_root, trie_output) =
state_provider.state_root_with_updates(hashed_state.clone())?;
if state_root != block.state_root {
debug!(
target: "engine",
number = block.number,
hash = %block_hash,
receipts = ?output.receipts,
"Mismatched state root"
);
return Err(ConsensusError::BodyStateRootDiff(
GotExpected { got: state_root, expected: block.state_root }.into(),
)
.into())
}

let root_time = Instant::now();
let (state_root, trie_output) =
state_provider.state_root_with_updates(hashed_state.clone())?;
if state_root != block.state_root {
debug!(
target: "engine",
number = block.number,
hash = %block_hash,
receipts = ?output.receipts,
"Mismatched state root"
);
return Err(ConsensusError::BodyStateRootDiff(
GotExpected { got: state_root, expected: block.state_root }.into(),
)
.into())
debug!(target: "engine", elapsed=?root_time.elapsed(), ?block_number, "Calculated state root");
}

debug!(target: "engine", elapsed=?root_time.elapsed(), ?block_number, "Calculated state root");

let executed = ExecutedBlock {
block: sealed_block.clone(),
senders: Arc::new(block.senders),
Expand Down Expand Up @@ -2127,6 +2135,7 @@ mod tests {
PersistenceState::default(),
payload_builder,
TreeConfig::default(),
false,
);

let block_builder = TestBlockBuilder::default().with_chain_spec((*chain_spec).clone());
Expand Down
2 changes: 2 additions & 0 deletions crates/node/builder/src/launch/engine.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ where
pruner,
ctx.components().payload_builder().clone(),
TreeConfig::default(),
ctx.node_config().skip_state_root_validation,
);
eth_service
}
Expand Down Expand Up @@ -255,6 +256,7 @@ where
pruner,
ctx.components().payload_builder().clone(),
TreeConfig::default(),
ctx.node_config().skip_state_root_validation,
);
eth_service
}
Expand Down

0 comments on commit 0f97971

Please sign in to comment.