Skip to content
Merged
Show file tree
Hide file tree
Changes from 58 commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
fa942b1
WIP: began wiring up proof targets
mediocregopher Nov 20, 2025
671d9f8
WIP: should_retain
mediocregopher Nov 21, 2025
ef1dd33
WIP: RlpNode
mediocregopher Nov 21, 2025
37a6219
commit_child
mediocregopher Nov 21, 2025
cae9681
WIP: proptests
mediocregopher Nov 21, 2025
b45c7b9
WIP: windowing
mediocregopher Nov 21, 2025
a1def3d
WIP: got it working
mediocregopher Nov 24, 2025
f5d0658
WIP: cleanup
mediocregopher Nov 24, 2025
9bbb792
WIP: benches
mediocregopher Nov 24, 2025
f29fd85
docs
mediocregopher Nov 24, 2025
d82dc15
docs
mediocregopher Nov 24, 2025
fdeb1e2
Apply suggestions from code review
mediocregopher Nov 25, 2025
d83745d
remove an Option check in the common case from should_retain
mediocregopher Nov 25, 2025
1ed2ab4
Get rid of recursion in WindowIter
mediocregopher Nov 25, 2025
49abb63
Merge branch 'mediocregopher/proof-rewrite-leaf-only' into mediocrego…
mediocregopher Nov 25, 2025
9cf79a2
Fix up benchmarks to do proper comparisons
mediocregopher Nov 25, 2025
9c074e6
Switch to using storage tries
mediocregopher Nov 25, 2025
062bb78
Some perf improvements
mediocregopher Nov 25, 2025
f17b760
Simplify mock factory creation
mediocregopher Nov 25, 2025
9a95e4e
Merge remote-tracking branch 'upstream/main' into mediocregopher/proo…
mediocregopher Nov 25, 2025
e227e08
consts
mediocregopher Nov 25, 2025
9046bf6
docs
mediocregopher Nov 25, 2025
844609d
WIP: super basic usage of cached branches
mediocregopher Nov 27, 2025
a181bcd
WIP: Basic implementation done, needs testing
mediocregopher Nov 28, 2025
8cfb544
WIP: retain proofs
mediocregopher Nov 28, 2025
f8f5477
WIP: tests working, code broken
mediocregopher Nov 28, 2025
550b953
WIP: failing tests still
mediocregopher Dec 1, 2025
a52dfd2
WIP: almost working
mediocregopher Dec 1, 2025
34ffc5f
WIP: closer!
mediocregopher Dec 2, 2025
82c1509
WIP: IT WORKS
mediocregopher Dec 2, 2025
7af1f44
quick fix
mediocregopher Dec 2, 2025
245357a
Merge remote-tracking branch 'upstream/main' into mediocregopher/1951…
mediocregopher Dec 2, 2025
97ef697
reduce proptest iterations
mediocregopher Dec 2, 2025
d707382
Simplify trie cursor usage
mediocregopher Dec 3, 2025
fb4ed8f
Simplifications to next_uncached_key_range loop
mediocregopher Dec 3, 2025
aff632a
Reduce Arc clones
mediocregopher Dec 3, 2025
2147e95
Docs
mediocregopher Dec 3, 2025
dea820c
adjustments after reviewing
mediocregopher Dec 3, 2025
28b1a77
Benches
mediocregopher Dec 3, 2025
c58e4f9
Benches doc clippy
mediocregopher Dec 3, 2025
c5c1def
Update crates/trie/trie/src/proof_v2/mod.rs
mediocregopher Dec 4, 2025
d020d18
Update crates/trie/trie/src/proof_v2/mod.rs
mediocregopher Dec 4, 2025
4333aae
clippy docs
mediocregopher Dec 4, 2025
ca8eada
Update crates/trie/trie/src/proof_v2/mod.rs
mediocregopher Dec 5, 2025
fc62134
PR feedback
mediocregopher Dec 5, 2025
9c1a55e
improve tests a bit
mediocregopher Dec 5, 2025
e25fdef
Fix up try_pop logic a bit
mediocregopher Dec 5, 2025
d3d640d
increment_and_strip_trailing_zeros
mediocregopher Dec 5, 2025
308a8dd
rand/serde
mediocregopher Dec 5, 2025
c45778f
WIP: Target type
mediocregopher Dec 10, 2025
b52eaf2
WIP: ref hell
mediocregopher Dec 11, 2025
71479a3
WIP
mediocregopher Dec 11, 2025
38fb6f5
WIP: almost done, still some minor notes
mediocregopher Dec 11, 2025
c942364
WIP: just needs tests
mediocregopher Dec 12, 2025
00512b7
Working!
mediocregopher Dec 12, 2025
57ac627
Cleanup Target definition
mediocregopher Dec 12, 2025
65497a0
doc fix
mediocregopher Dec 12, 2025
1e0f72d
Clippy
mediocregopher Dec 12, 2025
02b0b18
fix arg naming
mediocregopher Dec 12, 2025
c444ece
typo
mediocregopher Dec 12, 2025
6ce13f9
Fix initialization of uncalculated_lower_bound
mediocregopher Dec 15, 2025
90cdc3f
Merge remote-tracking branch 'upstream/main' into mediocregopher/1951…
mediocregopher Dec 15, 2025
d7a5fdf
Fix out of date comments
mediocregopher Dec 16, 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
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions crates/trie/trie/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ parking_lot.workspace = true
pretty_assertions.workspace = true
proptest-arbitrary-interop.workspace = true
proptest.workspace = true
rand.workspace = true

[features]
metrics = ["reth-metrics", "dep:metrics"]
Expand All @@ -84,6 +85,7 @@ serde = [
"revm-state/serde",
"parking_lot/serde",
"reth-ethereum-primitives/serde",
"rand/serde",
]
test-utils = [
"triehash",
Expand Down
58 changes: 37 additions & 21 deletions crates/trie/trie/benches/proof_v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,19 @@ use reth_trie::{
proof_v2::StorageProofCalculator,
trie_cursor::{mock::MockTrieCursorFactory, TrieCursorFactory},
};
use reth_trie_common::{HashedPostState, HashedStorage, Nibbles};
use std::collections::BTreeMap;
use reth_trie_common::{HashedPostState, HashedStorage};

/// Generate test data for benchmarking.
///
/// Returns a tuple of:
/// - Hashed address for the storage trie
/// - `HashedPostState` with random storage slots
/// - Proof targets (Nibbles) that are 80% from existing slots, 20% random
/// - Proof targets as B256 (sorted) for V2 implementation
/// - Equivalent [`B256Set`] for legacy implementation
fn generate_test_data(
dataset_size: usize,
num_targets: usize,
) -> (B256, HashedPostState, Vec<Nibbles>, B256Set) {
) -> (B256, HashedPostState, Vec<B256>, B256Set) {
let mut runner = TestRunner::deterministic();

// Use a fixed hashed address for the storage trie
Expand Down Expand Up @@ -68,14 +67,8 @@ fn generate_test_data(

let target_b256s = targets_strategy.new_tree(&mut runner).unwrap().current();

// Convert B256 targets to sorted Nibbles for V2
let mut targets: Vec<Nibbles> = target_b256s
.iter()
.map(|b256| {
// SAFETY: B256 is exactly 32 bytes
unsafe { Nibbles::unpack_unchecked(b256.as_slice()) }
})
.collect();
// Sort B256 targets for V2 (storage_proof expects sorted targets)
let mut targets: Vec<B256> = target_b256s.clone();
targets.sort();

// Create B256Set for legacy
Expand All @@ -86,19 +79,42 @@ fn generate_test_data(

/// Create cursor factories from a `HashedPostState` for storage trie testing.
///
/// This mimics the test harness pattern from the `proof_v2` tests.
/// This mimics the test harness pattern from the `proof_v2` tests by using `StateRoot`
/// to generate `TrieUpdates` from the `HashedPostState`.
fn create_cursor_factories(
post_state: &HashedPostState,
) -> (MockTrieCursorFactory, MockHashedCursorFactory) {
// Ensure that there's a storage trie dataset for every storage trie, even if empty
let storage_trie_nodes: B256Map<BTreeMap<_, _>> =
post_state.storages.keys().copied().map(|addr| (addr, Default::default())).collect();
use reth_trie::{updates::StorageTrieUpdates, StateRoot};

// Create empty trie cursor factory to serve as the initial state for StateRoot
// Ensure that there's a storage trie dataset for every storage account
let storage_tries: B256Map<_> = post_state
.storages
.keys()
.copied()
.map(|addr| (addr, StorageTrieUpdates::default()))
.collect();

let empty_trie_cursor_factory =
MockTrieCursorFactory::from_trie_updates(reth_trie_common::updates::TrieUpdates {
storage_tries: storage_tries.clone(),
..Default::default()
});

// Create mock hashed cursor factory from the post state
let hashed_cursor_factory = MockHashedCursorFactory::from_hashed_post_state(post_state.clone());

// Create empty trie cursor factory (leaf-only calculator doesn't need trie nodes)
let trie_cursor_factory = MockTrieCursorFactory::new(BTreeMap::new(), storage_trie_nodes);
// Generate TrieUpdates using StateRoot
let (_root, mut trie_updates) =
StateRoot::new(empty_trie_cursor_factory, hashed_cursor_factory.clone())
.root_with_updates()
.expect("StateRoot should succeed");

// Continue using empty storage tries for each account
trie_updates.storage_tries = storage_tries;

// Initialize trie cursor factory from the generated TrieUpdates
let trie_cursor_factory = MockTrieCursorFactory::from_trie_updates(trie_updates);

(trie_cursor_factory, hashed_cursor_factory)
}
Expand Down Expand Up @@ -145,10 +161,10 @@ fn bench_proof_algos(c: &mut Criterion) {
StorageProofCalculator::new_storage(trie_cursor, hashed_cursor);

b.iter_batched(
|| targets.clone(),
|targets| {
|| targets.iter().copied().map(Into::into).collect::<Vec<_>>(),
|mut targets| {
proof_calculator
.storage_proof(hashed_address, targets.into_iter())
.storage_proof(hashed_address, &mut targets)
.expect("Proof generation failed");
},
BatchSize::SmallInput,
Expand Down
7 changes: 6 additions & 1 deletion crates/trie/trie/src/hashed_cursor/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ impl MockHashedCursorFactory {
.collect();

// Extract storages from post state
let hashed_storages: B256Map<BTreeMap<B256, U256>> = post_state
let mut hashed_storages: B256Map<BTreeMap<B256, U256>> = post_state
.storages
.into_iter()
.map(|(addr, hashed_storage)| {
Expand All @@ -62,6 +62,11 @@ impl MockHashedCursorFactory {
})
.collect();

// Ensure all accounts have at least an empty storage
for account in hashed_accounts.keys() {
hashed_storages.entry(*account).or_default();
}

Self::new(hashed_accounts, hashed_storages)
}

Expand Down
Loading
Loading