Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf(l2): add prover benchmarks from RPC downloaded blocks #1705

Draft
wants to merge 53 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
94fb3e3
add indexdb
xqft Jan 14, 2025
2847cf8
rename InnerIndexDB to AuxIndexDB
xqft Jan 14, 2025
89ba179
add IndexDBError
xqft Jan 15, 2025
f5192c4
change Revm EVM error to ours
xqft Jan 15, 2025
9616b7d
replace from_exec impl with indexdb
xqft Jan 15, 2025
9d97192
Merge branch 'main' into l2/touched_state
xqft Jan 15, 2025
253ab7f
WIP add PreExecDB
xqft Jan 17, 2025
966706e
WIP add proofs in from_store()
xqft Jan 17, 2025
2135a08
WIP remove internal mutability
xqft Jan 17, 2025
eabd6a3
refactor
xqft Jan 17, 2025
9ffbc44
replace PreExecDB with CacheDB
xqft Jan 17, 2025
a308649
nits
xqft Jan 20, 2025
b0d214f
fix filter
xqft Jan 20, 2025
1b64809
add nonce and balance validations during pre-exec
xqft Jan 20, 2025
dd75353
put proofs inside executiondb
xqft Jan 20, 2025
389ddab
fix errors
xqft Jan 20, 2025
fec82ef
remove optiona_balance_check feature
xqft Jan 20, 2025
0405835
remove unused errors
xqft Jan 20, 2025
987e359
fix filter
xqft Jan 20, 2025
4a0a715
add db verification
xqft Jan 20, 2025
eb98e53
remove unused imports
xqft Jan 20, 2025
892060a
update sp1 prover
xqft Jan 20, 2025
d9aee43
Merge branch 'main' into l2/touched_state
xqft Jan 20, 2025
6f2169c
remove revm types
xqft Jan 21, 2025
d0669bf
add bench crate
xqft Jan 13, 2025
321d260
make a blocking rpc client
xqft Jan 21, 2025
76c5cff
create ToExecDB trait
xqft Jan 22, 2025
fdf6d9f
remove unnecessary store_wrapper
xqft Jan 22, 2025
297b7f4
WIP optimizing rpc db
xqft Jan 23, 2025
6a7c60c
cache storage
xqft Jan 23, 2025
c18e753
add timeout and retry
xqft Jan 23, 2025
e5f9876
update cargo lock
xqft Jan 23, 2025
b8c953e
remove blocking rpc
xqft Jan 24, 2025
f84063e
refactor rpc
xqft Jan 24, 2025
664804d
add storageAt request
xqft Jan 24, 2025
de11b0a
fix access list
xqft Jan 24, 2025
90d71a4
fetch latest block number
xqft Jan 24, 2025
99938c0
reqwest optimizations
xqft Jan 24, 2025
c7c6100
convert to exec db
xqft Jan 27, 2025
e918786
refactor retry logic
xqft Jan 27, 2025
ca13ac0
remove max retries
xqft Jan 27, 2025
d75f543
write db to file
xqft Jan 27, 2025
0ca8b8b
remove unnecesary nodes
xqft Jan 27, 2025
9133af8
add bincode
xqft Jan 27, 2025
e29975c
use rpc cache approach
xqft Jan 27, 2025
e99df38
remove use
xqft Jan 27, 2025
6e4e9ff
rewrite verify_db fn'
xqft Jan 28, 2025
119304e
cache block hashes
xqft Jan 28, 2025
d1d4aee
handle null storage values
xqft Jan 28, 2025
c4c2bc0
handle non-existing accounts
xqft Jan 29, 2025
0c35fcd
fix skipping an accounts proof
xqft Jan 29, 2025
3135fb7
Merge branch 'main' into l2/rpc_bench
xqft Jan 29, 2025
c5feb83
remove diff
xqft Jan 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
217 changes: 204 additions & 13 deletions Cargo.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ members = [
"crates/vm/levm/bench/revm_comparison",
"crates/l2/",
"crates/l2/prover",
"crates/l2/prover/bench",
"crates/l2/contracts",
"crates/l2/sdk",
"cmd/loc",
Expand Down
16 changes: 12 additions & 4 deletions crates/l2/proposer/prover_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ use ethrex_l2_sdk::{
eth_client::{eth_sender::Overrides, EthClient, WrappedTransaction},
};
use ethrex_storage::Store;
use ethrex_vm::{execution_db::ExecutionDB, EvmError};
use ethrex_vm::{
db::StoreWrapper,
execution_db::{ExecutionDB, ToExecDB},
EvmError,
};
use secp256k1::SecretKey;
use serde::{Deserialize, Serialize};
use std::{
Expand Down Expand Up @@ -405,12 +409,16 @@ impl ProverServer {

let block = Block::new(header, body);

let db =
ExecutionDB::from_store(&block, self.store.clone()).map_err(EvmError::ExecutionDB)?;
let parent_hash = block.header.parent_hash;
let store = StoreWrapper {
store: self.store.clone(),
block_hash: parent_hash,
};
let db = store.to_exec_db(&block).map_err(EvmError::ExecutionDB)?;

let parent_block_header = self
.store
.get_block_header_by_hash(block.header.parent_hash)?
.get_block_header_by_hash(parent_hash)?
.ok_or(ProverServerError::StorageDataIsNone)?;

debug!("Created prover input for block {block_number}");
Expand Down
53 changes: 53 additions & 0 deletions crates/l2/prover/bench/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
[package]
name = "bench"
version = "0.1.0"
edition = "2021"

[dependencies]
ethrex-core.workspace = true
ethrex-rlp.workspace = true
ethrex-vm.workspace = true
ethrex-prover.workspace = true
ethrex-l2.workspace = true
ethrex-trie.workspace = true
ethrex-storage.workspace = true

zkvm_interface = { path = "../zkvm/interface", default-features = false }

serde.workspace = true
hex.workspace = true
serde_json.workspace = true
bytes.workspace = true

tokio = { version = "1.21", default-features = false, features = ["full"] }
reqwest = { version = "0.12.9", features = [
"json",
"rustls-tls",
], default-features = false }
clap = { version = "4.5.21", features = ["derive"] }

revm = { version = "14.0.3", features = [
"serde",
"std",
"serde-json",
"optional_no_base_fee",
"optional_block_gas_limit",
], default-features = false }

# These dependencies must be kept up to date with the corresponding revm version, otherwise errors may pop up because of trait implementation mismatches
revm-inspectors = { version = "0.8.1" }
revm-primitives = { version = "10.0.0", features = [
"std",
], default-features = false }
futures-util = "0.3.31"
tokio-utils = "0.1.2"
again = "0.1.2"
lazy_static = "1.5.0"
bincode = "1.3.3"

[features]
## risc0
build_risc0 = ["zkvm_interface/build_risc0", "ethrex-prover/build_risc0"]
gpu = ["ethrex-prover/gpu"]
## sp1
build_sp1 = ["zkvm_interface/build_sp1", "zkvm_interface/build_risc0"]
39 changes: 39 additions & 0 deletions crates/l2/prover/bench/src/constants.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// Blockchain related constants

use std::time::Duration;

use ethrex_core::types::ChainConfig;
use revm_primitives::SpecId;

// Chain config for different forks as defined on https://ethereum.github.io/execution-spec-tests/v3.0.0/consuming_tests/common_types/#fork
pub static CANCUN_CONFIG: ChainConfig = ChainConfig {
chain_id: 1_u64,
homestead_block: Some(0),
dao_fork_block: Some(0),
dao_fork_support: true,
eip150_block: Some(0),
eip155_block: Some(0),
eip158_block: Some(0),
byzantium_block: Some(0),
constantinople_block: Some(0),
petersburg_block: Some(0),
istanbul_block: Some(0),
muir_glacier_block: Some(0),
berlin_block: Some(0),
london_block: Some(0),
arrow_glacier_block: Some(0),
gray_glacier_block: Some(0),
merge_netsplit_block: Some(0),
terminal_total_difficulty: Some(0),
shanghai_time: Some(0),
cancun_time: Some(0),
prague_time: None,
terminal_total_difficulty_passed: false,
verkle_time: None,
};
pub const MAINNET_CHAIN_ID: u64 = 0x1;
pub const MAINNET_SPEC_ID: SpecId = SpecId::CANCUN;

// RPC related constants

pub const RPC_RATE_LIMIT: usize = 100; // requests per second
2 changes: 2 additions & 0 deletions crates/l2/prover/bench/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
pub mod constants;
pub mod rpc;
85 changes: 85 additions & 0 deletions crates/l2/prover/bench/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
use std::{fs::File, io::Write};

use bench::{
constants::{CANCUN_CONFIG, MAINNET_CHAIN_ID},
rpc::{db::RpcDB, get_block, get_latest_block_number},
};
use clap::Parser;
use ethrex_l2::utils::prover::proving_systems::ProverType;
use ethrex_prover_lib::prover::create_prover;
use ethrex_vm::execution_db::ToExecDB;
use zkvm_interface::io::ProgramInput;

#[derive(Parser, Debug)]
struct Args {
#[arg(short, long)]
rpc_url: String,
#[arg(short, long)]
block_number: Option<usize>,
}

#[tokio::main]
async fn main() {
let Args {
rpc_url,
block_number,
} = Args::parse();

let block_number = match block_number {
Some(n) => n,
None => {
println!("fetching latest block number");
get_latest_block_number(&rpc_url)
.await
.expect("failed to fetch latest block number")
}
};

println!("fetching block {block_number} and its parent header");
let block = get_block(&rpc_url, block_number)
.await
.expect("failed to fetch block");
let parent_block_header = get_block(&rpc_url, block_number - 1)
.await
.expect("failed to fetch block")
.header;

let db = if let Ok(file) = File::open("db.bin") {
println!("db file found");
bincode::deserialize_from(file).expect("failed to deserialize db from file")
} else {
println!("db file not found");

println!("populating rpc db cache");
let rpc_db = RpcDB::with_cache(&rpc_url, block_number - 1, &block)
.await
.expect("failed to create rpc db");

println!("pre-executing to build execution db");
let db = rpc_db
.to_exec_db(&block)
.expect("failed to build execution db");

println!("writing db to file db.bin");
let mut file = File::create("db.bin").expect("failed to create db file");
file.write_all(
bincode::serialize(&db)
.expect("failed to serialize db")
.as_slice(),
)
.expect("failed to write db to file");

db
};

println!("proving");
let mut prover = create_prover(ProverType::SP1);
let receipt = prover
.prove(ProgramInput {
block,
parent_block_header,
db,
})
.expect("proving failed");
let execution_gas = prover.get_gas().expect("failed to get execution gas");
}
Loading
Loading