Skip to content

Commit d654765

Browse files
authored
fix(stage): handle state root computation when class root is zero (#335)
1 parent 31df310 commit d654765

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed

crates/sync/stage/src/trie.rs

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use katana_provider::api::state_update::StateUpdateProvider;
66
use katana_provider::api::trie::TrieWriter;
77
use starknet::macros::short_string;
88
use starknet_types_core::hash::{Poseidon, StarkHash};
9-
use tracing::{error, trace, trace_span};
9+
use tracing::{debug, debug_span, error};
1010

1111
use crate::{Stage, StageExecutionInput, StageExecutionOutput, StageResult};
1212

@@ -41,7 +41,7 @@ where
4141
fn execute<'a>(&'a mut self, input: &'a StageExecutionInput) -> BoxFuture<'a, StageResult> {
4242
Box::pin(async move {
4343
for block_number in input.from()..=input.to() {
44-
let span = trace_span!("compute_state_root", %block_number);
44+
let span = debug_span!("state_trie.compute_state_root", %block_number);
4545
let _enter = span.enter();
4646

4747
let expected_state_root = self
@@ -55,29 +55,41 @@ where
5555
.state_update(block_number.into())?
5656
.ok_or(Error::MissingStateUpdate(block_number))?;
5757

58-
let class_trie_root = self
58+
let computed_contract_trie_root =
59+
self.provider.trie_insert_contract_updates(block_number, &state_update)?;
60+
61+
debug!(
62+
contract_trie_root = format!("{computed_contract_trie_root:#x}"),
63+
"Computed contract trie root."
64+
);
65+
66+
let computed_class_trie_root = self
5967
.provider
6068
.trie_insert_declared_classes(block_number, &state_update.declared_classes)?;
6169

62-
let contract_trie_root =
63-
self.provider.trie_insert_contract_updates(block_number, &state_update)?;
70+
debug!(
71+
classes_tri_root = format!("{computed_class_trie_root:#x}"),
72+
"Computed classes trie root."
73+
);
6474

65-
// Compute the state root:
66-
// hash("STARKNET_STATE_V0", contract_trie_root, class_trie_root)
67-
let computed_state_root = Poseidon::hash_array(&[
68-
short_string!("STARKNET_STATE_V0"),
69-
contract_trie_root,
70-
class_trie_root,
71-
]);
75+
let computed_state_root = if computed_class_trie_root == Felt::ZERO {
76+
computed_contract_trie_root
77+
} else {
78+
Poseidon::hash_array(&[
79+
short_string!("STARKNET_STATE_V0"),
80+
computed_contract_trie_root,
81+
computed_class_trie_root,
82+
])
83+
};
7284

7385
// Verify that the computed state root matches the expected state root from the
7486
// block header
7587
if computed_state_root != expected_state_root {
7688
error!(
77-
block = %block_number,
89+
target: "stage",
7890
state_root = %format!("{computed_state_root:#x}"),
7991
expected_state_root = %format!("{expected_state_root:#x}"),
80-
"Wrong trie root for block - computed state root does not match expected state root (from header)",
92+
"Bad state trie root for block - computed state root does not match expected state root (from header)",
8193
);
8294

8395
return Err(Error::StateRootMismatch {
@@ -88,11 +100,7 @@ where
88100
.into());
89101
}
90102

91-
trace!(
92-
block = %block_number,
93-
state_root = %format!("{computed_state_root:#x}"),
94-
"State root verified successfully."
95-
);
103+
debug!("State root verified successfully.");
96104
}
97105

98106
Ok(StageExecutionOutput { last_block_processed: input.to() })

0 commit comments

Comments
 (0)