Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
7a65d25
feat(engine-api): add BAL cache for EIP-7928
mattsse Jan 21, 2026
d750b49
fix: address clippy warnings
mattsse Jan 21, 2026
3f50a36
fix: stop get_by_range at first missing block
mattsse Jan 21, 2026
df14131
perf: clone only BAL bytes instead of entire payload
mattsse Jan 21, 2026
9f5cf84
refactor: simplify BalCache to use HashMap + BTreeMap
mattsse Jan 21, 2026
a0aac13
fix: make len() private to satisfy clippy
mattsse Jan 21, 2026
6cbcfe0
Merge branch 'main' into feat/bal-cache
mattsse Jan 23, 2026
65e27c4
impl bal storage
0xKarl98 Feb 14, 2026
130c880
add comments
0xKarl98 Feb 14, 2026
0e2ea8c
re-org structs
0xKarl98 Feb 14, 2026
6d1bbc9
refactor
0xKarl98 Feb 14, 2026
fe96484
Merge remote-tracking branch 'origin/main' into feat/BAL_store
0xKarl98 Feb 14, 2026
ddd6fb0
share disk-backed BAL store across engine and network
0xKarl98 Feb 14, 2026
f7fb79b
add comments
0xKarl98 Feb 14, 2026
465fcf3
fix clippy
0xKarl98 Feb 14, 2026
0b0199e
comment outdated
0xKarl98 Feb 14, 2026
12fbb98
apply mattese suggestions
0xKarl98 Feb 19, 2026
f027953
fix clippy
0xKarl98 Feb 19, 2026
2de4d06
fix api inconsistency
0xKarl98 Feb 19, 2026
81f304c
shrink
0xKarl98 Feb 19, 2026
8ca909d
Merge branch 'main' into feat/BAL_store
0xKarl98 Feb 19, 2026
fb96372
chore: modified rpcs
Rimeeeeee Feb 26, 2026
4c786c7
Merge branch 'main' into bal-store-rpc
Soubhik-10 Mar 5, 2026
ac723b2
fix
Soubhik-10 Mar 5, 2026
b07480d
Merge branch 'main' into bal-store-rpc
Soubhik-10 Mar 6, 2026
79f8244
chore: merged bal-store to branch from devnet3(BAL)
Rimeeeeee Mar 11, 2026
ca9b12d
add bal provider to blockchainprovider
Soubhik-10 Mar 11, 2026
fa747db
chore: compilation error and BalStore impl
Rimeeeeee Mar 11, 2026
124242f
docs
Soubhik-10 Mar 11, 2026
abb489a
chore: added BalStore to provider of engine api
Rimeeeeee Mar 11, 2026
66fbb63
add bal_provider in launch
Soubhik-10 Mar 11, 2026
c6db746
chore: compilation fix
Rimeeeeee Mar 11, 2026
8db4432
fix tests
Soubhik-10 Mar 11, 2026
eb847ae
chore: inserted in bal store only if validation is successful
Rimeeeeee Mar 11, 2026
76737d5
dprint
Soubhik-10 Mar 11, 2026
357c973
fix
Soubhik-10 Mar 11, 2026
bd7c577
chore: clippy
Soubhik-10 Mar 12, 2026
7f3700f
clippy
Soubhik-10 Mar 12, 2026
c2b4e6c
clippy
Soubhik-10 Mar 12, 2026
43104e9
fixes
Rimeeeeee Mar 12, 2026
c3a76d0
fixes
Rimeeeeee Apr 7, 2026
caba51b
fixes
Rimeeeeee Apr 7, 2026
c8b55d0
fixes
Rimeeeeee Apr 7, 2026
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
6 changes: 3 additions & 3 deletions .github/scripts/hive/expected_failures.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,11 @@ engine-withdrawals: []

engine-api: []

engine-cancun:
- Invalid PayloadAttributes, Missing BeaconRoot, Syncing=True (Cancun) (reth)
engine-cancun: []
# - Invalid PayloadAttributes, Missing BeaconRoot, Syncing=True (Cancun) (reth)
# the test fails with older versions of the code for which it passed before, probably related to changes
# in hive or its dependencies
- Blob Transaction Ordering, Multiple Clients (Cancun) (reth)
# - Blob Transaction Ordering, Multiple Clients (Cancun) (reth)

sync: []

Expand Down
18 changes: 18 additions & 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 Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ members = [
"crates/exex/test-utils/",
"crates/exex/types/",
"crates/metrics/",
"crates/net/bal-store/",
"crates/net/banlist/",
"crates/net/discv4/",
"crates/net/discv5/",
Expand Down Expand Up @@ -375,6 +376,7 @@ reth-ipc = { path = "crates/rpc/ipc" }
reth-libmdbx = { path = "crates/storage/libmdbx-rs" }
reth-mdbx-sys = { path = "crates/storage/libmdbx-rs/mdbx-sys" }
reth-metrics = { path = "crates/metrics" }
reth-bal-store = { path = "crates/net/bal-store" }
reth-net-banlist = { path = "crates/net/banlist" }
reth-net-nat = { path = "crates/net/nat" }
reth-network = { path = "crates/net/network" }
Expand Down
1 change: 1 addition & 0 deletions crates/engine/tree/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ workspace = true

[dependencies]
# reth
reth-bal-store.workspace = true
reth-chain-state = { workspace = true, features = ["rayon"] }
reth-chainspec = { workspace = true, optional = true }
reth-consensus.workspace = true
Expand Down
4 changes: 2 additions & 2 deletions crates/engine/tree/src/tree/payload_processor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1178,7 +1178,7 @@ mod tests {
use reth_evm_ethereum::EthEvmConfig;
use reth_primitives_traits::{Account, Recovered, StorageEntry};
use reth_provider::{
providers::{BlockchainProvider, OverlayStateProviderFactory},
providers::{BalProvider, BlockchainProvider, OverlayStateProviderFactory},
test_utils::create_test_provider_factory_with_chain_spec,
ChainSpecProvider, HashingWriter,
};
Expand Down Expand Up @@ -1444,7 +1444,7 @@ mod tests {
PrecompileCacheMap::default(),
);

let provider_factory = BlockchainProvider::new(factory).unwrap();
let provider_factory = BlockchainProvider::new(factory, BalProvider::default()).unwrap();

let mut handle = payload_processor.spawn(
ExecutionEnv::test_default(),
Expand Down
10 changes: 9 additions & 1 deletion crates/engine/tree/src/tree/payload_validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use alloy_eips::{eip1898::BlockWithParent, eip4895::Withdrawal, NumHash};
use alloy_evm::Evm;
use alloy_primitives::{map::B256Set, B256};
use alloy_rlp::Decodable;
use reth_bal_store::BalStore;
#[cfg(feature = "trie-debug")]
use reth_trie_sparse::debug_recorder::TrieDebugRecorder;

Expand Down Expand Up @@ -178,6 +179,7 @@ where
+ StateProviderFactory
+ StateReader
+ HashedPostStateProvider
+ BalStore
+ Clone
+ 'static,
Evm: ConfigureEvm<Primitives = N> + 'static,
Expand Down Expand Up @@ -1387,13 +1389,18 @@ where
block,
output,
receipt_root_bloom,
built_bal,
built_bal.clone(),
true,
) {
// call post-block hook
self.on_invalid_block(parent_block, block, output, None, ctx.state_mut());
return Err(err.into())
}
if built_bal.is_some() {
let bal_bytes: alloy_primitives::Bytes =
alloy_rlp::encode(built_bal.unwrap_or_default()).into();
let _ = self.provider.insert(block.hash(), block.num_hash().number, bal_bytes);
}
drop(_enter);

// Wait for the background keccak256 hashing task to complete. This blocks until
Expand Down Expand Up @@ -1968,6 +1975,7 @@ where
+ ChangeSetReader
+ BlockNumReader
+ HashedPostStateProvider
+ BalStore
+ Clone
+ 'static,
N: NodePrimitives,
Expand Down
18 changes: 12 additions & 6 deletions crates/exex/exex/src/backfill/job.rs
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,8 @@ mod tests {
use reth_evm_ethereum::EthEvmConfig;
use reth_primitives_traits::crypto::secp256k1::public_key_to_address;
use reth_provider::{
providers::BlockchainProvider, test_utils::create_test_provider_factory_with_chain_spec,
providers::{BalProvider, BlockchainProvider},
test_utils::create_test_provider_factory_with_chain_spec,
};
use reth_testing_utils::generators;

Expand All @@ -270,7 +271,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

let blocks_and_execution_outputs =
blocks_and_execution_outputs(provider_factory, chain_spec, key_pair)?;
Expand Down Expand Up @@ -306,7 +308,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

let blocks_and_execution_outcomes =
blocks_and_execution_outputs(provider_factory, chain_spec, key_pair)?;
Expand Down Expand Up @@ -356,7 +359,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

// Execute blocks via LatestStateProvider (pipeline-style) and commit to DB.
// This mirrors what the pipeline's ExecutionStage does.
Expand Down Expand Up @@ -420,7 +424,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

let pipeline_results =
blocks_and_execution_outputs(provider_factory, chain_spec, key_pair)?;
Expand Down Expand Up @@ -463,7 +468,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

let blocks_and_execution_outputs =
blocks_and_execution_outputs(provider_factory, chain_spec, key_pair)?;
Expand Down
11 changes: 7 additions & 4 deletions crates/exex/exex/src/backfill/stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ mod tests {
crypto::secp256k1::public_key_to_address, Block as _, NodePrimitives,
};
use reth_provider::{
providers::{BlockchainProvider, ProviderNodeTypes},
providers::{BalProvider, BlockchainProvider, ProviderNodeTypes},
test_utils::create_test_provider_factory_with_chain_spec,
ProviderFactory,
};
Expand All @@ -281,7 +281,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

// Create first 2 blocks
let blocks_and_execution_outcomes =
Expand Down Expand Up @@ -318,7 +319,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

// Create first 2 blocks
let (blocks, execution_outcome) =
Expand Down Expand Up @@ -421,7 +423,8 @@ mod tests {
let executor = EthEvmConfig::ethereum(chain_spec.clone());
let provider_factory = create_test_provider_factory_with_chain_spec(chain_spec.clone());
init_genesis(&provider_factory)?;
let blockchain_db = BlockchainProvider::new(provider_factory.clone())?;
let blockchain_db =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

// Create and commit 4 blocks
let blocks = create_blocks(&chain_spec, key_pair, 4)?;
Expand Down
18 changes: 10 additions & 8 deletions crates/exex/exex/src/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -687,8 +687,9 @@ mod tests {
use reth_evm_ethereum::EthEvmConfig;
use reth_primitives_traits::RecoveredBlock;
use reth_provider::{
providers::BlockchainProvider, test_utils::create_test_provider_factory, BlockReader,
BlockWriter, Chain, DBProvider, DatabaseProviderFactory, TransactionVariant,
providers::{BalProvider, BlockchainProvider},
test_utils::create_test_provider_factory,
BlockReader, BlockWriter, Chain, DBProvider, DatabaseProviderFactory, TransactionVariant,
};
use reth_testing_utils::generators::{self, random_block, BlockParams};

Expand Down Expand Up @@ -1119,7 +1120,7 @@ mod tests {
async fn exex_handle_new() {
let provider_factory = create_test_provider_factory();
init_genesis(&provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory, BalProvider::default()).unwrap();

let temp_dir = tempfile::tempdir().unwrap();
let wal = Wal::new(temp_dir.path()).unwrap();
Expand Down Expand Up @@ -1174,7 +1175,7 @@ mod tests {
async fn test_notification_if_finished_height_gt_chain_tip() {
let provider_factory = create_test_provider_factory();
init_genesis(&provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory, BalProvider::default()).unwrap();

let temp_dir = tempfile::tempdir().unwrap();
let wal = Wal::new(temp_dir.path()).unwrap();
Expand Down Expand Up @@ -1224,7 +1225,7 @@ mod tests {
async fn test_sends_chain_reorged_notification() {
let provider_factory = create_test_provider_factory();
init_genesis(&provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory, BalProvider::default()).unwrap();

let temp_dir = tempfile::tempdir().unwrap();
let wal = Wal::new(temp_dir.path()).unwrap();
Expand Down Expand Up @@ -1267,7 +1268,7 @@ mod tests {
async fn test_sends_chain_reverted_notification() {
let provider_factory = create_test_provider_factory();
init_genesis(&provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory, BalProvider::default()).unwrap();

let temp_dir = tempfile::tempdir().unwrap();
let wal = Wal::new(temp_dir.path()).unwrap();
Expand Down Expand Up @@ -1327,7 +1328,7 @@ mod tests {
provider_rw.insert_block(&block).unwrap();
provider_rw.commit().unwrap();

let provider = BlockchainProvider::new(provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory, BalProvider::default()).unwrap();

let temp_dir = tempfile::tempdir().unwrap();
let wal = Wal::new(temp_dir.path()).unwrap();
Expand Down Expand Up @@ -1428,7 +1429,8 @@ mod tests {
let wal = Wal::new(temp_dir.path()).unwrap();
let provider_factory = create_test_provider_factory();
init_genesis(&provider_factory).unwrap();
let provider = BlockchainProvider::new(provider_factory.clone()).unwrap();
let provider =
BlockchainProvider::new(provider_factory.clone(), BalProvider::default()).unwrap();

// 1. Setup Manager with Capacity = 1
let (exex_handle, _, mut notifications) = ExExHandle::new(
Expand Down
15 changes: 8 additions & 7 deletions crates/exex/exex/src/notifications.rs
Original file line number Diff line number Diff line change
Expand Up @@ -529,8 +529,9 @@ mod tests {
use reth_evm_ethereum::EthEvmConfig;
use reth_primitives_traits::Block as _;
use reth_provider::{
providers::BlockchainProvider, test_utils::create_test_provider_factory, BlockWriter,
Chain, DBProvider, DatabaseProviderFactory,
providers::{BalProvider, BlockchainProvider},
test_utils::create_test_provider_factory,
BlockWriter, Chain, DBProvider, DatabaseProviderFactory,
};
use reth_testing_utils::generators::{self, random_block, BlockParams};
use std::collections::BTreeMap;
Expand All @@ -549,7 +550,7 @@ mod tests {
.block(genesis_hash.into())?
.ok_or_else(|| eyre::eyre!("genesis block not found"))?;

let provider = BlockchainProvider::new(provider_factory.clone())?;
let provider = BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

let node_head_block = random_block(
&mut rng,
Expand Down Expand Up @@ -623,7 +624,7 @@ mod tests {
.block(genesis_hash.into())?
.ok_or_else(|| eyre::eyre!("genesis block not found"))?;

let provider = BlockchainProvider::new(provider_factory)?;
let provider = BlockchainProvider::new(provider_factory, BalProvider::default())?;

let node_head = BlockNumHash { number: genesis_block.number, hash: genesis_hash };
let exex_head = ExExHead { block: node_head };
Expand Down Expand Up @@ -677,7 +678,7 @@ mod tests {
.block(genesis_hash.into())?
.ok_or_else(|| eyre::eyre!("genesis block not found"))?;

let provider = BlockchainProvider::new(provider_factory)?;
let provider = BlockchainProvider::new(provider_factory, BalProvider::default())?;

let node_head_block = random_block(
&mut rng,
Expand Down Expand Up @@ -768,7 +769,7 @@ mod tests {
.block(genesis_hash.into())?
.ok_or_else(|| eyre::eyre!("genesis block not found"))?;

let provider = BlockchainProvider::new(provider_factory)?;
let provider = BlockchainProvider::new(provider_factory, BalProvider::default())?;

let exex_head_block = random_block(
&mut rng,
Expand Down Expand Up @@ -853,7 +854,7 @@ mod tests {
.block(genesis_hash.into())?
.ok_or_else(|| eyre::eyre!("genesis block not found"))?;

let provider = BlockchainProvider::new(provider_factory.clone())?;
let provider = BlockchainProvider::new(provider_factory.clone(), BalProvider::default())?;

// Insert block 1 into the DB so there's something to backfill
let node_head_block = random_block(
Expand Down
Loading
Loading