Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
1,997 changes: 1,078 additions & 919 deletions Cargo.lock

Large diffs are not rendered by default.

96 changes: 49 additions & 47 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[workspace.package]
version = "0.1.0"
edition = "2021"
rust-version = "1.88"
rust-version = "1.93"
license = "MIT OR Apache-2.0"
homepage = "https://github.com/flashbots/rbuilder"
repository = "https://github.com/flashbots/rbuilder"
Expand Down Expand Up @@ -70,62 +70,64 @@ codegen-units = 1
incremental = false

[workspace.dependencies]
reth = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-cli-util = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-db = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-db-common = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-errors = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-node-api = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-trie = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-node-core = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-primitives-traits = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-provider = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b", features = [
reth = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-cli-util = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-db-common = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-payload-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-node-api = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-node-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-trie = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-trie-parallel = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-node-core = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-primitives = { package = "reth-ethereum-primitives", git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-primitives-traits = { version = "0.3.1", default-features = false }
reth-provider = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0", features = [
"test-utils",
] }
reth-chainspec = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-evm = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-revm = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-trie-db = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }
reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", rev = "d6324d63e27ef6b7c49cdc9b1977c1b808234c7b" }

# compatible with reth d6324d63e27ef6b7c49cdc9b1977c1b808234c7b dependencies
revm = { version = "34.0.0", features = [
reth-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-revm = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-execution-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-trie-db = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }
reth-tasks = { git = "https://github.com/paradigmxyz/reth", tag = "v2.2.0" }

# compatible with reth v2.2.0 dependencies
revm = { version = "=38.0.0", features = [
"std",
"secp256k1",
"optional_balance_check",
], default-features = false }
revm-inspectors = { version = "0.34.2", default-features = false }
revm-inspectors = { version = "=0.39.0", default-features = false }

ethereum_ssz_derive = "0.9.0"
ethereum_ssz = "0.9.0"
ethereum_ssz_derive = "0.10"
ethereum_ssz = "0.10"

alloy-primitives = { version = "1.5.6", default-features = false, features = [
alloy-primitives = { version = "=1.5.6", default-features = false, features = [
"getrandom",
"map-foldhash",
] }
alloy-rlp = "0.3.13"
alloy-chains = "0.2.5"
alloy-trie = { version = "0.9.4", default-features = false }
alloy-evm = { version = "0.27.2", default-features = false }
alloy-provider = { version = "1.6.3", features = ["ipc", "pubsub", "ws"] }
alloy-eips = { version = "1.6.3" }
alloy-rpc-types = { version = "1.6.3" }
alloy-json-rpc = { version = "1.6.3" }
alloy-network = { version = "1.6.3" }
alloy-network-primitives = { version = "1.6.3" }
alloy-node-bindings = { version = "1.6.3" }
alloy-consensus = { version = "1.6.3", features = ["kzg"] }
alloy-rpc-types-beacon = { version = "1.6.3", features = ["ssz"] }
alloy-rpc-types-engine = { version = "1.6.3", features = ["ssz"] }
alloy-rpc-types-eth = { version = "1.6.3" }
alloy-signer = { version = "1.6.3" }
alloy-signer-local = { version = "1.6.3" }
alloy-rlp = { version = "=0.3.13", default-features = false, features = ["core-net"] }
alloy-chains = { version = "=0.2.33", default-features = false }
alloy-trie = { version = "=0.9.4", default-features = false }
alloy-evm = { version = "=0.34.0", default-features = false }
alloy-provider = { version = "=2.0.4", features = ["ipc", "pubsub", "ws"] }
alloy-eips = { version = "=2.0.4" }
alloy-rpc-types = { version = "=2.0.4" }
alloy-json-rpc = { version = "=2.0.4" }
alloy-network = { version = "=2.0.4" }
alloy-network-primitives = { version = "=2.0.4" }
alloy-node-bindings = { version = "=2.0.4" }
alloy-consensus = { version = "=2.0.4", features = ["kzg"] }
alloy-rpc-types-beacon = { version = "=2.0.4", features = ["ssz"] }
alloy-rpc-types-engine = { version = "=2.0.4", features = ["ssz"] }
alloy-rpc-types-eth = { version = "=2.0.4" }
alloy-signer = { version = "=2.0.4" }
alloy-signer-local = { version = "=2.0.4" }

# Version required by ethereum-consensus beacon-api-client
mev-share-sse = { git = "https://github.com/paradigmxyz/mev-share-rs", rev = "9eb2b0138ab3202b9eb3af4b19c7b3bf40b0faa8", default-features = false }
Expand Down
8 changes: 7 additions & 1 deletion crates/eth-sparse-mpt/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@

use crate::utils::{HashMap, HashSet};
use alloy_primitives::{Address, Bytes, B256};
use reth_provider::{providers::ConsistentDbView, BlockReader, DatabaseProviderFactory};
use reth_provider::{
providers::ConsistentDbView, BlockReader, DatabaseProviderFactory, StorageSettingsCache,
};
use revm::database::BundleState;
use std::sync::Arc;

Expand Down Expand Up @@ -107,6 +109,7 @@ pub fn prefetch_tries_for_accounts<'a, Provider>(
) -> Result<SparseTrieMetrics, SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
match version {
ETHSpareMPTVersion::V1 => {
Expand Down Expand Up @@ -166,6 +169,7 @@ pub fn calculate_account_proofs_with_sparse_trie<Provider>(
)
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let calculate = || match version {
ETHSpareMPTVersion::V1 => (
Expand Down Expand Up @@ -221,6 +225,7 @@ pub fn calculate_root_hash_with_sparse_trie<Provider>(
) -> (Result<B256, SparseTrieError>, SparseTrieMetrics)
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
if let Some(thread_pool) = thread_pool {
thread_pool.rayon_pool.install(|| {
Expand Down Expand Up @@ -255,6 +260,7 @@ pub fn calculate_root_hash_with_sparse_trie_internal<Provider>(
) -> (Result<B256, SparseTrieError>, SparseTrieMetrics)
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
match version {
ETHSpareMPTVersion::V1 => {
Expand Down
6 changes: 5 additions & 1 deletion crates/eth-sparse-mpt/src/v1/reth_sparse_trie/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
use alloy_primitives::B256;
use change_set::{prepare_change_set, prepare_change_set_for_prefetch};
use hash::RootHashError;
use reth_provider::{providers::ConsistentDbView, BlockReader, DatabaseProviderFactory};
use reth_provider::{
providers::ConsistentDbView, BlockReader, DatabaseProviderFactory, StorageSettingsCache,
};
use revm::database::BundleState;
use std::time::{Duration, Instant};

Expand Down Expand Up @@ -63,6 +65,7 @@ pub fn prefetch_tries_for_accounts<'a, Provider>(
) -> Result<SparseTrieMetrics, SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let mut metrics = SparseTrieMetrics::default();

Expand Down Expand Up @@ -108,6 +111,7 @@ pub fn calculate_root_hash_with_sparse_trie<Provider>(
) -> (Result<B256, SparseTrieError>, SparseTrieMetrics)
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let mut metrics = SparseTrieMetrics::default();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ use reth_errors::ProviderError;
use reth_execution_errors::trie::StateProofError;
use reth_provider::{
providers::ConsistentDbView, BlockReader, DBProvider, DatabaseProviderFactory,
StorageSettingsCache,
};
use reth_trie::{proof::Proof, MultiProof as RethMultiProof, MultiProofTargets, EMPTY_ROOT_HASH};
use reth_trie_db::{DatabaseHashedCursorFactory, DatabaseTrieCursorFactory};
Expand Down Expand Up @@ -61,6 +62,7 @@ pub struct TrieFetcher<Provider> {
impl<Provider> TrieFetcher<Provider>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
pub fn new(consistent_db_view: ConsistentDbView<Provider>) -> Self {
Self { consistent_db_view }
Expand All @@ -77,14 +79,16 @@ where
.map(|targets| -> Result<MultiProof, FetchNodeError> {
let start = Instant::now();
let provider = self.consistent_db_view.provider_ro()?;
let proof = Proof::new(
DatabaseTrieCursorFactory::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
);
let targets_accounts = targets.len();
let targets_slots = targets.values().map(|v| v.len()).sum::<usize>();

let reth_multiproof = proof.multiproof(targets)?;
let reth_multiproof = reth_trie_db::with_adapter!(provider, |A| {
Proof::new(
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
)
.multiproof(targets)
})?;
let result = convert_reth_multiproof(reth_multiproof, &all_requested_accounts);
let time_ms = start.elapsed().as_micros() as f64 / 1000.0;
trace!(
Expand Down
43 changes: 27 additions & 16 deletions crates/eth-sparse-mpt/src/v2/fetch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,28 @@ use alloy_primitives::B256;
use nybbles::Nibbles;
use reth_provider::{
providers::ConsistentDbView, BlockReader, DBProvider, DatabaseProviderFactory,
StorageSettingsCache,
};
use reth_trie::{
proof::{Proof, StorageProof},
MultiProofTargets, StateRoot,
};
use reth_trie_db::{DatabaseHashedCursorFactory, DatabaseStateRoot, DatabaseTrieCursorFactory};
use reth_trie_db::{DatabaseHashedCursorFactory, DatabaseTrieCursorFactory};

use super::SharedCacheV2;

pub fn check_state_root_in_db(
provider: &impl DBProvider,
provider: &(impl DBProvider + StorageSettingsCache),
expected_state_root: B256,
) -> Result<(), SparseTrieError> {
let db_state_root = StateRoot::from_tx(provider.tx_ref())
let db_state_root = reth_trie_db::with_adapter!(provider, |A| {
StateRoot::new(
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
)
.root()
.map_err(SparseTrieError::other)?;
})
.map_err(SparseTrieError::other)?;
if db_state_root == expected_state_root {
Ok(())
} else {
Expand Down Expand Up @@ -66,6 +72,7 @@ impl MissingNodesFetcher {
) -> Result<usize, SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let fetched_nodes: Arc<Mutex<usize>> = Default::default();

Expand All @@ -81,14 +88,15 @@ impl MissingNodesFetcher {
check_state_root_in_db(&provider, parent_state_root)?;
}

let proof = StorageProof::new_hashed(
DatabaseTrieCursorFactory::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
hashed_address,
);
let storge_multiproof = proof
let storge_multiproof = reth_trie_db::with_adapter!(provider, |A| {
StorageProof::new_hashed(
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
hashed_address,
)
.storage_multiproof(targets)
.map_err(SparseTrieError::other)?;
})
.map_err(SparseTrieError::other)?;
*fetched_nodes.lock() += requested_proofs.len();
for requested_proof in requested_proofs {
let proof_for_node = storge_multiproof
Expand All @@ -112,12 +120,15 @@ impl MissingNodesFetcher {
check_state_root_in_db(&provider, parent_state_root)?
}

let proof = Proof::new(
DatabaseTrieCursorFactory::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
);
let targets = MultiProofTargets::accounts(std::mem::take(&mut self.account_proof_targets));
let multiproof = proof.multiproof(targets).map_err(SparseTrieError::other)?;
let multiproof = reth_trie_db::with_adapter!(provider, |A| {
Proof::new(
DatabaseTrieCursorFactory::<_, A>::new(provider.tx_ref()),
DatabaseHashedCursorFactory::new(provider.tx_ref()),
)
.multiproof(targets)
})
.map_err(SparseTrieError::other)?;

*fetched_nodes.lock() += self.account_proof_requested_nodes.len();
for requested_node in self.account_proof_requested_nodes.drain(..) {
Expand Down
9 changes: 8 additions & 1 deletion crates/eth-sparse-mpt/src/v2/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ use fetch::MissingNodesFetcher;
use nybbles::Nibbles;
use parking_lot::{Mutex, RwLock};
use rayon::prelude::*;
use reth_provider::{providers::ConsistentDbView, BlockReader, DatabaseProviderFactory};
use reth_provider::{
providers::ConsistentDbView, BlockReader, DatabaseProviderFactory, StorageSettingsCache,
};
use reth_trie::TrieAccount;
use revm::{
database::{BundleAccount, BundleState},
Expand Down Expand Up @@ -256,6 +258,7 @@ pub fn prefetch_proofs<'a, Provider>(
) -> Result<SparseTrieMetrics, SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let mut metrics = SparseTrieMetrics::default();
let mut fetcher = MissingNodesFetcher::default();
Expand Down Expand Up @@ -427,6 +430,7 @@ impl RootHashCalculator {
) -> Result<(), SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
stats.start();

Expand Down Expand Up @@ -623,6 +627,7 @@ impl RootHashCalculator {
) -> Result<(), SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let fetcher = Arc::new(Mutex::new(MissingNodesFetcher::default()));

Expand Down Expand Up @@ -910,6 +915,7 @@ impl RootHashCalculator {
) -> Result<(), SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
let mut fetcher = MissingNodesFetcher::default();

Expand Down Expand Up @@ -968,6 +974,7 @@ impl RootHashCalculator {
) -> Result<(B256, HashMap<Address, Vec<Bytes>>, SparseTrieMetrics), SparseTrieError>
where
Provider: DatabaseProviderFactory<Provider: BlockReader> + Send + Sync,
<Provider as DatabaseProviderFactory>::Provider: StorageSettingsCache,
{
if !incremental_change.is_empty() {
self.incremental_account_change.extend(incremental_change);
Expand Down
Loading