1
1
use crate :: utils;
2
2
use anyhow:: { anyhow, bail} ;
3
3
use clap:: Args ;
4
+ use sbv:: primitives:: zk_trie:: hash:: keccak:: Keccak ;
5
+ use sbv:: primitives:: zk_trie:: hash:: HashSchemeKind ;
4
6
use sbv:: {
5
7
core:: { BlockExecutionResult , ChunkInfo , EvmExecutorBuilder , HardforkConfig } ,
6
8
primitives:: {
@@ -12,7 +14,7 @@ use sbv::{
12
14
use serde:: Deserialize ;
13
15
use std:: panic:: catch_unwind;
14
16
use std:: path:: PathBuf ;
15
- use tiny_keccak:: { Hasher , Keccak } ;
17
+ use tiny_keccak:: Hasher ;
16
18
use tokio:: task:: JoinSet ;
17
19
18
20
#[ derive( Args ) ]
@@ -23,6 +25,9 @@ pub struct RunFileCommand {
23
25
/// Chunk mode
24
26
#[ arg( short, long) ]
25
27
chunk_mode : bool ,
28
+ /// Hash scheme
29
+ #[ arg( long, value_enum, default_value_t = HashSchemeKind :: Poseidon ) ]
30
+ hash_scheme : HashSchemeKind ,
26
31
}
27
32
28
33
impl RunFileCommand {
@@ -44,7 +49,7 @@ impl RunFileCommand {
44
49
let mut tasks = JoinSet :: new ( ) ;
45
50
46
51
for path in self . path . into_iter ( ) {
47
- tasks. spawn ( run_trace ( path, fork_config) ) ;
52
+ tasks. spawn ( run_trace ( path, fork_config, self . hash_scheme ) ) ;
48
53
}
49
54
50
55
while let Some ( task) = tasks. join_next ( ) . await {
@@ -80,32 +85,51 @@ impl RunFileCommand {
80
85
}
81
86
82
87
let fork_config = fork_config ( traces[ 0 ] . chain_id ( ) ) ;
83
- let ( chunk_info, mut zktrie_db) = ChunkInfo :: from_block_traces ( & traces) ;
88
+ let ( chunk_info, mut zktrie_db) = ChunkInfo :: from_block_traces ( & traces, self . hash_scheme ) ;
84
89
let mut code_db = HashMapDb :: default ( ) ;
85
90
86
- let mut tx_bytes_hasher = Keccak :: v256 ( ) ;
91
+ let mut tx_bytes_hasher = tiny_keccak :: Keccak :: v256 ( ) ;
87
92
88
- let mut executor = EvmExecutorBuilder :: new ( & mut code_db, & mut zktrie_db)
93
+ let builder = EvmExecutorBuilder :: new ( & mut code_db, & mut zktrie_db)
89
94
. hardfork_config ( fork_config)
90
- . chain_id ( traces[ 0 ] . chain_id ( ) )
91
- . hash_scheme ( Poseidon )
92
- . build ( traces[ 0 ] . root_before ( ) ) ?;
93
- for trace in traces. iter ( ) {
94
- executor. insert_codes ( trace) ?;
95
- }
96
-
97
- for trace in traces. iter ( ) {
98
- let BlockExecutionResult { tx_rlps, .. } = executor. handle_block ( trace) ?;
99
- for tx_rlp in tx_rlps {
100
- tx_bytes_hasher. update ( & tx_rlp) ;
95
+ . chain_id ( traces[ 0 ] . chain_id ( ) ) ;
96
+ let post_state_root = match self . hash_scheme {
97
+ HashSchemeKind :: Poseidon => {
98
+ let mut executor = builder
99
+ . hash_scheme ( Poseidon )
100
+ . build ( traces[ 0 ] . root_before ( ) ) ?;
101
+ for trace in traces. iter ( ) {
102
+ executor. insert_codes ( trace) ?;
103
+ }
104
+
105
+ for trace in traces. iter ( ) {
106
+ let BlockExecutionResult { tx_rlps, .. } = executor. handle_block ( trace) ?;
107
+ for tx_rlp in tx_rlps {
108
+ tx_bytes_hasher. update ( & tx_rlp) ;
109
+ }
110
+ }
111
+
112
+ executor. commit_changes ( ) ?
101
113
}
102
- }
103
-
104
- let post_state_root = executor. commit_changes ( ) ?;
114
+ HashSchemeKind :: Keccak => {
115
+ let mut executor = builder. hash_scheme ( Keccak ) . build ( traces[ 0 ] . root_before ( ) ) ?;
116
+ for trace in traces. iter ( ) {
117
+ executor. insert_codes ( trace) ?;
118
+ }
119
+
120
+ for trace in traces. iter ( ) {
121
+ let BlockExecutionResult { tx_rlps, .. } = executor. handle_block ( trace) ?;
122
+ for tx_rlp in tx_rlps {
123
+ tx_bytes_hasher. update ( & tx_rlp) ;
124
+ }
125
+ }
126
+
127
+ executor. commit_changes ( ) ?
128
+ }
129
+ } ;
105
130
if post_state_root != chunk_info. post_state_root ( ) {
106
131
bail ! ( "post state root mismatch" ) ;
107
132
}
108
- drop ( executor) ;
109
133
110
134
let mut tx_bytes_hash = B256 :: ZERO ;
111
135
tx_bytes_hasher. finalize ( & mut tx_bytes_hash. 0 ) ;
@@ -149,22 +173,24 @@ fn deserialize_may_wrapped<'de, T: Deserialize<'de>>(trace: &'de str) -> anyhow:
149
173
async fn run_trace (
150
174
path : PathBuf ,
151
175
fork_config : impl Fn ( u64 ) -> HardforkConfig ,
176
+ hash_scheme : HashSchemeKind ,
152
177
) -> anyhow:: Result < ( ) > {
153
178
let trace = read_block_trace ( & path) . await ?;
154
179
let fork_config = fork_config ( trace. chain_id ( ) ) ;
155
- if let Err ( e) =
156
- tokio:: task:: spawn_blocking ( move || catch_unwind ( || utils:: verify ( & trace, & fork_config) ) )
157
- . await ?
158
- . map_err ( |e| {
159
- e. downcast_ref :: < & str > ( )
180
+ if let Err ( e) = tokio:: task:: spawn_blocking ( move || {
181
+ catch_unwind ( || utils:: verify ( & trace, & fork_config, hash_scheme) )
182
+ } )
183
+ . await ?
184
+ . map_err ( |e| {
185
+ e. downcast_ref :: < & str > ( )
186
+ . map ( |s| anyhow ! ( "task panics with: {s}" ) )
187
+ . or_else ( || {
188
+ e. downcast_ref :: < String > ( )
160
189
. map ( |s| anyhow ! ( "task panics with: {s}" ) )
161
- . or_else ( || {
162
- e. downcast_ref :: < String > ( )
163
- . map ( |s| anyhow ! ( "task panics with: {s}" ) )
164
- } )
165
- . unwrap_or_else ( || anyhow ! ( "task panics" ) )
166
190
} )
167
- . and_then ( |r| r. map_err ( anyhow:: Error :: from) )
191
+ . unwrap_or_else ( || anyhow ! ( "task panics" ) )
192
+ } )
193
+ . and_then ( |r| r. map_err ( anyhow:: Error :: from) )
168
194
{
169
195
dev_error ! (
170
196
"Error occurs when verifying block ({}): {:?}" ,
0 commit comments