Skip to content

Commit 6c26082

Browse files
committed
fix ChunkInfo
1 parent 865de40 commit 6c26082

File tree

4 files changed

+116
-59
lines changed

4 files changed

+116
-59
lines changed

crates/bin/src/commands/run_file.rs

+57-31
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use crate::utils;
22
use anyhow::{anyhow, bail};
33
use clap::Args;
4+
use sbv::primitives::zk_trie::hash::keccak::Keccak;
5+
use sbv::primitives::zk_trie::hash::HashSchemeKind;
46
use sbv::{
57
core::{BlockExecutionResult, ChunkInfo, EvmExecutorBuilder, HardforkConfig},
68
primitives::{
@@ -12,7 +14,7 @@ use sbv::{
1214
use serde::Deserialize;
1315
use std::panic::catch_unwind;
1416
use std::path::PathBuf;
15-
use tiny_keccak::{Hasher, Keccak};
17+
use tiny_keccak::Hasher;
1618
use tokio::task::JoinSet;
1719

1820
#[derive(Args)]
@@ -23,6 +25,9 @@ pub struct RunFileCommand {
2325
/// Chunk mode
2426
#[arg(short, long)]
2527
chunk_mode: bool,
28+
/// Hash scheme
29+
#[arg(long, value_enum, default_value_t = HashSchemeKind::Poseidon)]
30+
hash_scheme: HashSchemeKind,
2631
}
2732

2833
impl RunFileCommand {
@@ -44,7 +49,7 @@ impl RunFileCommand {
4449
let mut tasks = JoinSet::new();
4550

4651
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));
4853
}
4954

5055
while let Some(task) = tasks.join_next().await {
@@ -80,32 +85,51 @@ impl RunFileCommand {
8085
}
8186

8287
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);
8489
let mut code_db = HashMapDb::default();
8590

86-
let mut tx_bytes_hasher = Keccak::v256();
91+
let mut tx_bytes_hasher = tiny_keccak::Keccak::v256();
8792

88-
let mut executor = EvmExecutorBuilder::new(&mut code_db, &mut zktrie_db)
93+
let builder = EvmExecutorBuilder::new(&mut code_db, &mut zktrie_db)
8994
.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()?
101113
}
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+
};
105130
if post_state_root != chunk_info.post_state_root() {
106131
bail!("post state root mismatch");
107132
}
108-
drop(executor);
109133

110134
let mut tx_bytes_hash = B256::ZERO;
111135
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:
149173
async fn run_trace(
150174
path: PathBuf,
151175
fork_config: impl Fn(u64) -> HardforkConfig,
176+
hash_scheme: HashSchemeKind,
152177
) -> anyhow::Result<()> {
153178
let trace = read_block_trace(&path).await?;
154179
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>()
160189
.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"))
166190
})
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))
168194
{
169195
dev_error!(
170196
"Error occurs when verifying block ({}): {:?}",

crates/bin/src/commands/run_rpc.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use alloy::providers::{Provider, ProviderBuilder};
33
use clap::Args;
44
use futures::future::OptionFuture;
55
use sbv::primitives::types::LegacyStorageTrace;
6+
use sbv::primitives::zk_trie::hash::HashSchemeKind;
67
use sbv::{
78
core::HardforkConfig,
89
primitives::{types::BlockTrace, Block},
@@ -115,10 +116,12 @@ impl RunRpcCommand {
115116
l2_trace.block_hash()
116117
);
117118

118-
tokio::task::spawn_blocking(move || utils::verify(&l2_trace, &fork_config))
119-
.await
120-
.expect("failed to spawn blocking task")
121-
.map_err(|e| (block_number, e.into()))?;
119+
tokio::task::spawn_blocking(move || {
120+
utils::verify(&l2_trace, &fork_config, HashSchemeKind::Poseidon)
121+
})
122+
.await
123+
.expect("failed to spawn blocking task")
124+
.map_err(|e| (block_number, e.into()))?;
122125
}
123126
Ok::<_, (u64, anyhow::Error)>(())
124127
});

crates/bin/src/utils.rs

+47-20
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use sbv::primitives::zk_trie::db::NodeDb;
2+
use sbv::primitives::zk_trie::hash::keccak::Keccak;
23
use sbv::primitives::zk_trie::hash::HashSchemeKind;
34
use sbv::{
45
core::{EvmExecutorBuilder, HardforkConfig, VerificationError},
@@ -8,16 +9,18 @@ use sbv::{
89
pub fn verify<T: Block + Clone>(
910
l2_trace: T,
1011
fork_config: &HardforkConfig,
12+
hash_scheme: HashSchemeKind,
1113
) -> Result<(), VerificationError> {
1214
measure_duration_millis!(
1315
total_block_verification_duration_milliseconds,
14-
verify_inner(l2_trace, fork_config)
16+
verify_inner(l2_trace, fork_config, hash_scheme)
1517
)
1618
}
1719

1820
fn verify_inner<T: Block + Clone>(
1921
l2_trace: T,
2022
fork_config: &HardforkConfig,
23+
hash_scheme: HashSchemeKind,
2124
) -> Result<(), VerificationError> {
2225
dev_trace!("{l2_trace:#?}");
2326
let root_before = l2_trace.root_before();
@@ -44,7 +47,7 @@ fn verify_inner<T: Block + Clone>(
4447
measure_duration_millis!(
4548
build_zktrie_db_duration_milliseconds,
4649
l2_trace
47-
.build_zktrie_db(&mut zktrie_db, HashSchemeKind::Poseidon)
50+
.build_zktrie_db(&mut zktrie_db, hash_scheme)
4851
.unwrap()
4952
);
5053
zktrie_db
@@ -53,28 +56,52 @@ fn verify_inner<T: Block + Clone>(
5356
);
5457
let mut code_db = HashMapDb::default();
5558

56-
let mut executor = EvmExecutorBuilder::new(&mut code_db, &mut zktrie_db)
59+
let builder = EvmExecutorBuilder::new(&mut code_db, &mut zktrie_db)
5760
.hardfork_config(*fork_config)
58-
.chain_id(l2_trace.chain_id())
59-
.hash_scheme(Poseidon)
60-
.build(root_before)?;
61+
.chain_id(l2_trace.chain_id());
6162

62-
executor.insert_codes(&l2_trace)?;
63+
let revm_root_after = match hash_scheme {
64+
HashSchemeKind::Poseidon => {
65+
let mut executor = builder.hash_scheme(Poseidon).build(root_before)?;
6366

64-
// TODO: change to Result::inspect_err when sp1 toolchain >= 1.76
65-
#[allow(clippy::map_identity)]
66-
#[allow(clippy::manual_inspect)]
67-
executor.handle_block(&l2_trace).map_err(|e| {
68-
dev_error!(
69-
"Error occurs when executing block #{}({:?}): {e:?}",
70-
l2_trace.number(),
71-
l2_trace.block_hash()
72-
);
67+
executor.insert_codes(&l2_trace)?;
7368

74-
update_metrics_counter!(verification_error);
75-
e
76-
})?;
77-
let revm_root_after = executor.commit_changes()?;
69+
// TODO: change to Result::inspect_err when sp1 toolchain >= 1.76
70+
#[allow(clippy::map_identity)]
71+
#[allow(clippy::manual_inspect)]
72+
executor.handle_block(&l2_trace).map_err(|e| {
73+
dev_error!(
74+
"Error occurs when executing block #{}({:?}): {e:?}",
75+
l2_trace.number(),
76+
l2_trace.block_hash()
77+
);
78+
79+
update_metrics_counter!(verification_error);
80+
e
81+
})?;
82+
executor.commit_changes()?
83+
}
84+
HashSchemeKind::Keccak => {
85+
let mut executor = builder.hash_scheme(Keccak).build(root_before)?;
86+
87+
executor.insert_codes(&l2_trace)?;
88+
89+
// TODO: change to Result::inspect_err when sp1 toolchain >= 1.76
90+
#[allow(clippy::map_identity)]
91+
#[allow(clippy::manual_inspect)]
92+
executor.handle_block(&l2_trace).map_err(|e| {
93+
dev_error!(
94+
"Error occurs when executing block #{}({:?}): {e:?}",
95+
l2_trace.number(),
96+
l2_trace.block_hash()
97+
);
98+
99+
update_metrics_counter!(verification_error);
100+
e
101+
})?;
102+
executor.commit_changes()?
103+
}
104+
};
78105

79106
#[cfg(feature = "profiling")]
80107
if let Ok(report) = guard.report().build() {

crates/core/src/chunk.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ pub struct ChunkInfo {
2323

2424
impl ChunkInfo {
2525
/// Construct by block traces
26-
pub fn from_block_traces<T: Block>(traces: &[T]) -> (Self, NodeDb<HashMapDb>) {
26+
pub fn from_block_traces<T: Block>(
27+
traces: &[T],
28+
hash_scheme: HashSchemeKind,
29+
) -> (Self, NodeDb<HashMapDb>) {
2730
let chain_id = traces.first().unwrap().chain_id();
2831
let prev_state_root = traces
2932
.first()
@@ -49,9 +52,7 @@ impl ChunkInfo {
4952
for trace in traces.iter() {
5053
measure_duration_millis!(
5154
build_zktrie_db_duration_milliseconds,
52-
trace
53-
.build_zktrie_db(&mut zktrie_db, HashSchemeKind::Poseidon)
54-
.unwrap()
55+
trace.build_zktrie_db(&mut zktrie_db, hash_scheme).unwrap()
5556
);
5657
}
5758
cycle_tracker_end!("Block::build_zktrie_db");

0 commit comments

Comments
 (0)