@@ -6,7 +6,7 @@ use katana_provider::api::state_update::StateUpdateProvider;
66use katana_provider:: api:: trie:: TrieWriter ;
77use starknet:: macros:: short_string;
88use starknet_types_core:: hash:: { Poseidon , StarkHash } ;
9- use tracing:: { error , trace , trace_span } ;
9+ use tracing:: { debug , debug_span , error } ;
1010
1111use crate :: { Stage , StageExecutionInput , StageExecutionOutput , StageResult } ;
1212
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