@@ -5,6 +5,7 @@ use katana_provider::api::block::HeaderProvider;
55use katana_provider:: api:: state_update:: StateUpdateProvider ;
66use katana_provider:: api:: trie:: TrieWriter ;
77use katana_provider:: { MutableProvider , ProviderFactory } ;
8+ use katana_tasks:: TaskSpawner ;
89use starknet:: macros:: short_string;
910use starknet_types_core:: hash:: { Poseidon , StarkHash } ;
1011use tracing:: { debug, debug_span, error} ;
@@ -22,19 +23,20 @@ use crate::{Stage, StageExecutionInput, StageExecutionOutput, StageResult};
2223#[ derive( Debug ) ]
2324pub struct StateTrie < P > {
2425 storage_provider : P ,
26+ task_spawner : TaskSpawner ,
2527}
2628
2729impl < P > StateTrie < P > {
2830 /// Create a new [`StateTrie`] stage.
29- pub fn new ( storage_provider : P ) -> Self {
30- Self { storage_provider }
31+ pub fn new ( storage_provider : P , task_spawner : TaskSpawner ) -> Self {
32+ Self { storage_provider, task_spawner }
3133 }
3234}
3335
3436impl < P > Stage for StateTrie < P >
3537where
3638 P : ProviderFactory ,
37- <P as ProviderFactory >:: ProviderMut : StateUpdateProvider + HeaderProvider + TrieWriter ,
39+ <P as ProviderFactory >:: ProviderMut : StateUpdateProvider + HeaderProvider + TrieWriter + Clone ,
3840{
3941 fn id ( & self ) -> & ' static str {
4042 "StateTrie"
@@ -58,21 +60,37 @@ where
5860 . state_update ( block_number. into ( ) ) ?
5961 . ok_or ( Error :: MissingStateUpdate ( block_number) ) ?;
6062
61- let computed_contract_trie_root =
62- provider_mut. trie_insert_contract_updates ( block_number, & state_update) ?;
63-
64- debug ! (
65- contract_trie_root = format!( "{computed_contract_trie_root:#x}" ) ,
66- "Computed contract trie root."
67- ) ;
68-
69- let computed_class_trie_root = provider_mut
70- . trie_insert_declared_classes ( block_number, & state_update. declared_classes ) ?;
71-
72- debug ! (
73- classes_tri_root = format!( "{computed_class_trie_root:#x}" ) ,
74- "Computed classes trie root."
75- ) ;
63+ let provider_mut_clone = provider_mut. clone ( ) ;
64+ let ( computed_contract_trie_root, computed_class_trie_root) = self
65+ . task_spawner
66+ . cpu_bound ( )
67+ . spawn ( move || {
68+ let computed_contract_trie_root = provider_mut_clone
69+ . trie_insert_contract_updates ( block_number, & state_update) ?;
70+
71+ debug ! (
72+ contract_trie_root = format!( "{computed_contract_trie_root:#x}" ) ,
73+ "Computed contract trie root."
74+ ) ;
75+
76+ let computed_class_trie_root = provider_mut_clone
77+ . trie_insert_declared_classes (
78+ block_number,
79+ & state_update. declared_classes ,
80+ ) ?;
81+
82+ debug ! (
83+ classes_tri_root = format!( "{computed_class_trie_root:#x}" ) ,
84+ "Computed classes trie root."
85+ ) ;
86+
87+ Result :: < ( Felt , Felt ) , crate :: Error > :: Ok ( (
88+ computed_contract_trie_root,
89+ computed_class_trie_root,
90+ ) )
91+ } )
92+ . await
93+ . map_err ( Error :: StateComputationTaskJoinError ) ??;
7694
7795 let computed_state_root = if computed_class_trie_root == Felt :: ZERO {
7896 computed_contract_trie_root
@@ -121,6 +139,9 @@ pub enum Error {
121139 #[ error( "Missing state update for block {0}" ) ]
122140 MissingStateUpdate ( BlockNumber ) ,
123141
142+ #[ error( "State computation task join error: {0}" ) ]
143+ StateComputationTaskJoinError ( katana_tasks:: JoinError ) ,
144+
124145 #[ error(
125146 "State root mismatch at block {block_number}: expected (from header) {expected:#x}, \
126147 computed {computed:#x}"
0 commit comments