Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
117 commits
Select commit Hold shift + click to select a range
3777a54
feat(snap): add snap/2 state downloader and pivot tracking
lean-apple Jul 28, 2026
2da324a
refactor(snap): group snap state writes behind SnapStateWriter
lean-apple Jul 28, 2026
3602535
feat(snap): apply block access lists to catch up from the pivot
lean-apple Jul 28, 2026
6aa10dc
refactor(snap): reuse existing components and group helpers behind types
lean-apple Jul 28, 2026
7765bac
feat(snap): verify the final state root and persist the trie tables
lean-apple Jul 28, 2026
46edf92
feat(snap): detect reorgs during catch-up and track the state they st…
lean-apple Jul 28, 2026
ff35129
fix(snap): report peers that serve invalid snap responses
lean-apple Jul 28, 2026
7749956
fix(snap): retry a rejected snap request instead of failing the download
lean-apple Jul 28, 2026
82b9021
feat(snap): re-read state stranded by a reorg
lean-apple Jul 28, 2026
d269cac
feat(net): add --snap to advertise snap/2, and fix a docs lint
lean-apple Jul 28, 2026
18aef31
refactor(snap): move snap sync out of engine and into one session
lean-apple Jul 29, 2026
46d2ee1
fix(snap): close the correctness gaps in the new session
lean-apple Jul 29, 2026
a8e4ded
fix(snap): commit downloads atomically and re-check forkchoice after …
lean-apple Jul 29, 2026
77ce114
ci: exclude reth-snap-sync from the wasm build
lean-apple Jul 29, 2026
5af5a9b
refactor(snap): walk the final trie in chunks instead of one pass
lean-apple Aug 1, 2026
2ef67db
fix(snap): wait for snap peers instead of failing the sync
lean-apple Aug 1, 2026
715a760
feat(snap): mark a generation until its state root is checked
lean-apple Aug 1, 2026
6afa30d
test(snap): cover the slim account codec where it lives
lean-apple Aug 1, 2026
dff59c5
fix(snap): commit BAL state and its bytecodes in one transaction
lean-apple Aug 1, 2026
907bd8b
fix(snap): refuse to sync onto the legacy plain-state layout
lean-apple Aug 1, 2026
1bd5238
refactor(trie): share the BAL post-block state extraction
lean-apple Aug 1, 2026
89c3a23
refactor(snap): take cached access lists from the shared BAL store
lean-apple Aug 2, 2026
6084164
feat(snap): record the target's hash and root in the generation marker
lean-apple Aug 2, 2026
0c0ac67
fix(snap): give session BAL requests distinct request ids
lean-apple Aug 2, 2026
2b0ddf9
fix(snap): keep the generation marker until the state is accepted
lean-apple Aug 2, 2026
a2f3829
feat(snap): cache fetched access lists in the shared BAL store
lean-apple Aug 2, 2026
b8154cf
feat(snap): resolve the canonical chain from peers' headers
lean-apple Aug 2, 2026
b7533ee
docs: add a snap/2 page to the book
lean-apple Aug 2, 2026
ce30d08
fix(snap): choose a BAL-capable pivot
lean-apple Aug 3, 2026
fee067e
refactor(engine): inject backfill sync into orchestrator
lean-apple Aug 3, 2026
ade8954
fix(snap): rebuild trie cleanly after head advances
lean-apple Aug 3, 2026
dbf068a
feat(snap): drive sessions through verified handoff
lean-apple Aug 3, 2026
02c458f
feat(snap): read canonical headers from provider
lean-apple Aug 3, 2026
c01e878
fix(snap): accept state with pipeline checkpoints
lean-apple Aug 3, 2026
e62d5f6
feat(engine): select between backfill implementations
lean-apple Aug 3, 2026
c7d3fcc
feat(node): activate snap state bootstrap
lean-apple Aug 3, 2026
2ddc070
fix(node): use pipeline after snap bootstrap
lean-apple Aug 3, 2026
fe29814
fix(node): advance stale snap pivots
lean-apple Aug 3, 2026
f76711d
chore(snap): satisfy nightly clippy
lean-apple Aug 3, 2026
bc0056f
feat(storage): persist block access lists
lean-apple Aug 3, 2026
086fb61
fix(test): propagate snap client bounds
lean-apple Aug 3, 2026
d137402
test(snap): cover bootstrap and pipeline handoff
lean-apple Aug 3, 2026
20567b3
fix(snap): align persistence frontiers on acceptance
lean-apple Aug 3, 2026
6c88a23
test(snap): exercise bootstrap above tree threshold
lean-apple Aug 3, 2026
daf59f0
test(snap): cover staged pipeline handoff
lean-apple Aug 3, 2026
8f4db14
fix(node): support snap bounds with noop network
lean-apple Aug 3, 2026
14a5d94
refactor(snap): remove obsolete peer header chain
lean-apple Aug 3, 2026
80ded37
refactor(snap): trim superseded writer APIs
lean-apple Aug 3, 2026
3597a49
chore(snap): remove stale downloader remnants
lean-apple Aug 3, 2026
a34131e
docs(snap): describe durable BAL retention
lean-apple Aug 3, 2026
3000d34
fix(storage): preserve unflushed BALs across cache eviction
lean-apple Aug 3, 2026
7e2fc0e
test(rpc): exercise persisted BAL cache lookup
lean-apple Aug 3, 2026
d42a24d
test(snap): cover stale pivot advancement
lean-apple Aug 3, 2026
3e0bcaf
fix(snap): reject trailing range payload bytes
lean-apple Aug 3, 2026
cb26206
fix(snap): propagate p2p test utilities
lean-apple Aug 3, 2026
59b52f6
Merge remote-tracking branch 'upstream/main' into poc/eip-8189-snap-sync
lean-apple Aug 3, 2026
aa48624
refactor(node): reuse pipeline backfill for snap bootstrap
lean-apple Aug 3, 2026
cc61c6c
fix(node): handle lost snap header pipeline
lean-apple Aug 3, 2026
48711ad
perf(snap): batch account reads during healing
lean-apple Aug 4, 2026
a8a608b
perf(snap): deduplicate verified access lists in constant time
lean-apple Aug 4, 2026
d3c96ae
perf(storage): release BAL buffer lock during flush
lean-apple Aug 4, 2026
8aa92c5
perf(trie): commit snap trie rebuild in chunks
lean-apple Aug 4, 2026
4c5fc7c
refactor(snap): use parking lot for canonical head
lean-apple Aug 4, 2026
6f5a7ad
chore(snap): update lockfile for parking lot
lean-apple Aug 4, 2026
9e60edf
fix(node): preserve snap launch error source
lean-apple Aug 4, 2026
7ac320a
chore(snap): align downloader tracing target
lean-apple Aug 4, 2026
3fb72ae
chore: sort snap sync workspace member
lean-apple Aug 4, 2026
2dedd72
refactor(node): keep snap sync type first
lean-apple Aug 4, 2026
8d66521
refactor(snap): keep state writer type first
lean-apple Aug 4, 2026
6a1b3a2
docs(snap): clarify interrupted generation restart
lean-apple Aug 4, 2026
63948a8
refactor(net): group snap wire message types
lean-apple Aug 4, 2026
cfd871e
fix(node): advance snap head during bootstrap
lean-apple Aug 4, 2026
ff42b4a
refactor(node): reuse pipeline sync for snap headers
lean-apple Aug 4, 2026
69241ab
docs(node): describe snap bootstrap components
lean-apple Aug 4, 2026
47e79b3
fix(snap): use renamed atomic update method
lean-apple Aug 4, 2026
93082fe
Merge upstream/main into poc/eip-8189-snap-sync
lean-apple Aug 5, 2026
a8f0287
feat: add snap downloader with proof verification
lean-apple Aug 11, 2026
0efd776
Merge branch 'main' into feat/snap-account-range-downloader
lean-apple Aug 11, 2026
a75af1a
Merge upstream/main into poc/eip-8189-snap-sync
lean-apple Aug 11, 2026
8422c9f
Merge branch 'main' into feat/snap-account-range-downloader
lean-apple Aug 12, 2026
4806e1f
chore(trie): move thiserror out of the alloy dependency group
lean-apple Aug 12, 2026
b4ba24c
refactor(trie): drop redundant range-proof guards
lean-apple Aug 12, 2026
2d707ac
feat(trie): report where the trie continues past a verified range
lean-apple Aug 12, 2026
658dede
refactor(downloaders): take the snap client by value
lean-apple Aug 12, 2026
76ba187
feat(downloaders): reject account ranges that run past the limit
lean-apple Aug 12, 2026
8770c2f
feat(downloaders): name the peer that lacks the requested state
lean-apple Aug 12, 2026
4221f0b
docs(downloaders): describe what a snap retry actually does
lean-apple Aug 12, 2026
0c0081f
refactor(snap): tighten account range documentation
lean-apple Aug 12, 2026
e5c45d8
Merge branch 'main' into feat/snap-account-range-downloader
lean-apple Aug 12, 2026
a2f77d4
perf(snap): verify account ranges off async workers
lean-apple Aug 12, 2026
1d46e73
Merge branch 'main' into feat/snap-account-range-downloader
lean-apple Aug 13, 2026
787914d
feat(downloaders): add snap storage range downloader
lean-apple Aug 12, 2026
afbc24f
refactor(snap): organize account range verification
lean-apple Aug 13, 2026
638e73a
fix(snap): make proof runtime explicit
lean-apple Aug 13, 2026
dbb8410
Merge branch 'main' into feat/snap-account-range-downloader
lean-apple Aug 16, 2026
32111b1
docs(trie): explain range proof verification
lean-apple Aug 16, 2026
a586b53
Merge branch 'feat/snap-account-range-downloader' of github.com:lean-…
lean-apple Aug 16, 2026
568fd5b
Merge remote-tracking branch 'upstream/main' into poc/eip-8189-snap-sync
lean-apple Aug 16, 2026
c82446b
Merge branch 'feat/snap-account-range-downloader' into poc/eip-8189-s…
lean-apple Aug 16, 2026
64c79a6
Merge branch 'feat/snap-storage-range-downloader' into poc/eip-8189-s…
lean-apple Aug 16, 2026
64896b2
refactor(snap): reuse range proof downloaders
lean-apple Aug 17, 2026
a0bb4b7
fix(snap): propagate test utility features
lean-apple Aug 17, 2026
a25e59c
refactor(snap): simplify shared request primitives
lean-apple Aug 17, 2026
f965286
refactor(snap-sync): verify and decode BALs through alloy
lean-apple Aug 17, 2026
e4b5817
refactor(trie): rename the range-proof node index
lean-apple Aug 17, 2026
282cfc3
perf(snap-sync): reuse one provider per header walk
lean-apple Aug 17, 2026
ea1b826
refactor(snap-sync): name state-machine misuse for what it is
lean-apple Aug 17, 2026
aee7cc7
refactor(snap-sync): keep error sources typed
lean-apple Aug 17, 2026
0dd181e
refactor(snap-sync): free bytecode matching from the downloader
lean-apple Aug 17, 2026
77514ab
refactor(node): name snap bootstrap policy
lean-apple Aug 17, 2026
9fd1733
chore(snap-sync): group metrics with the third-party deps
lean-apple Aug 17, 2026
8d7c0a5
refactor(downloaders): share snap request handling
lean-apple Aug 17, 2026
0ac39f0
docs(snap): clarify range and BAL invariants
lean-apple Aug 17, 2026
938f7ac
refactor(snap-sync): give BlockRef a NumHash accessor
lean-apple Aug 17, 2026
a5096fd
fix(snap): retry snap requests on a different peer
lean-apple Aug 17, 2026
a86b0aa
fix(snap-sync): keep forkchoice moving during finalization
lean-apple Aug 17, 2026
08aa4ec
feat(net): serve snap/2 over the satellite multiplexer
lean-apple Aug 17, 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
1 change: 1 addition & 0 deletions .github/scripts/check_wasm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ exclude_crates=(
reth-prune-static-files # reth-provider
reth-tasks # tokio rt-multi-thread
reth-stages-api # reth-provider, reth-prune
reth-snap-sync # reth-provider, reth-network-p2p
reth-static-file # tokio
reth-transaction-pool # c-kzg
reth-payload-util # reth-transaction-pool
Expand Down
35 changes: 35 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 @@ -91,6 +91,7 @@ members = [
"crates/rpc/rpc-e2e-tests/",
"crates/rpc/rpc-convert/",
"crates/rpc/rpc/",
"crates/snap-sync/",
"crates/stages/api/",
"crates/stages/stages/",
"crates/stages/types/",
Expand Down Expand Up @@ -409,6 +410,7 @@ reth-rpc-layer = { path = "crates/rpc/rpc-layer" }
reth-rpc-server-types = { path = "crates/rpc/rpc-server-types" }
reth-rpc-convert = { path = "crates/rpc/rpc-convert" }
reth-rpc-traits = { version = "0.6.0", default-features = false }
reth-snap-sync = { path = "crates/snap-sync" }
reth-stages = { path = "crates/stages/stages" }
reth-stages-api = { path = "crates/stages/api" }
reth-stages-types = { path = "crates/stages/types", default-features = false }
Expand Down
7 changes: 4 additions & 3 deletions crates/e2e-test-utils/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ use alloy_rpc_types_engine::PayloadAttributes;
use node::NodeTestContext;
use reth_chainspec::ChainSpec;
use reth_db::{test_utils::TempDatabase, DatabaseEnv};
use reth_network_api::test_utils::PeersHandleProvider;
use reth_network_api::{test_utils::PeersHandleProvider, BlockDownloaderProvider};
use reth_network_p2p::snap::client::SnapClient;
use reth_node_builder::{
components::NodeComponentsBuilder,
rpc::{EngineValidatorAddOn, RethRpcAddOns},
Expand Down Expand Up @@ -153,7 +154,7 @@ where
TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
Components: NodeComponents<
TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
Network: PeersHandleProvider,
Network: PeersHandleProvider + BlockDownloaderProvider<Client: SnapClient>,
>,
>,
AddOns: RethRpcAddOns<
Expand All @@ -175,7 +176,7 @@ impl<T> NodeBuilderHelper for T where
TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
Components: NodeComponents<
TmpNodeAdapter<Self, BlockchainProvider<NodeTypesWithDBAdapter<Self, TmpDB>>>,
Network: PeersHandleProvider,
Network: PeersHandleProvider + BlockDownloaderProvider<Client: SnapClient>,
>,
>,
AddOns: RethRpcAddOns<
Expand Down
2 changes: 1 addition & 1 deletion crates/engine/tree/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ reth-tasks = { workspace = true, features = ["rayon"] }
reth-trie-parallel.workspace = true
reth-trie-sparse = { workspace = true, features = ["std", "metrics"] }
reth-trie.workspace = true
reth-trie-common.workspace = true
reth-trie-common = { workspace = true, features = ["eip7928"] }

# alloy
alloy-evm.workspace = true
Expand Down
18 changes: 8 additions & 10 deletions crates/engine/tree/src/launch.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
//! [`ChainOrchestrator`](crate::chain::ChainOrchestrator) ready to be polled as a `Stream`.

use crate::{
backfill::PipelineSync,
backfill::BackfillSync,
chain::ChainOrchestrator,
download::BasicBlockDownloader,
engine::{EngineApiKind, EngineApiRequest, EngineApiRequestHandler, EngineHandler},
Expand All @@ -24,7 +24,7 @@ use reth_provider::{
ProviderFactory,
};
use reth_prune::PrunerWithFactory;
use reth_stages_api::{MetricEventsSender, Pipeline};
use reth_stages_api::MetricEventsSender;
use reth_storage_overlay::OverlayManager;
use reth_tasks::Runtime;
use std::sync::Arc;
Expand All @@ -40,21 +40,20 @@ use std::sync::Arc;
/// (`newPayload`, `forkchoiceUpdated`) and maintains the in-memory chain state.
/// - **[`EngineApiRequestHandler`]** + **[`EngineHandler`]** — glue that routes incoming CL
/// messages to the tree handler and manages download requests.
/// - **[`PipelineSync`]** — wraps the staged sync [`Pipeline`] for backfill sync when the node
/// needs to catch up over large block ranges.
/// - **[`BackfillSync`]** — drives the configured backfill implementation when the node needs to
/// catch up over large block ranges.
///
/// The returned orchestrator implements [`Stream`] and yields
/// [`ChainEvent`]s.
///
/// [`ChainEvent`]: crate::chain::ChainEvent
#[expect(clippy::too_many_arguments, clippy::type_complexity)]
pub fn build_engine_orchestrator<N, Client, S, V, C>(
pub fn build_engine_orchestrator<N, Client, S, V, C, B>(
engine_kind: EngineApiKind,
consensus: Arc<dyn FullConsensus<N::Primitives>>,
client: Client,
incoming_requests: S,
pipeline: Pipeline<N>,
pipeline_task_spawner: Runtime,
backfill_sync: B,
provider: ProviderFactory<N>,
blockchain_db: BlockchainProvider<N>,
pruner: PrunerWithFactory<ProviderFactory<N>>,
Expand All @@ -71,14 +70,15 @@ pub fn build_engine_orchestrator<N, Client, S, V, C>(
S,
BasicBlockDownloader<Client, <N::Primitives as NodePrimitives>::Block>,
>,
PipelineSync<N>,
B,
>
where
N: ProviderNodeTypes,
Client: BlockClient<Block = <N::Primitives as NodePrimitives>::Block> + 'static,
S: Stream<Item = BeaconEngineMessage<N::Payload>> + Send + Sync + Unpin + 'static,
V: EngineValidator<N::Payload> + WaitForCaches,
C: ConfigureEvm<Primitives = N::Primitives> + 'static,
B: BackfillSync + Unpin,
{
let downloader = BasicBlockDownloader::new(client, consensus.clone());

Expand All @@ -104,7 +104,5 @@ where
let engine_handler = EngineApiRequestHandler::new(to_tree_tx, from_tree);
let handler = EngineHandler::new(engine_handler, downloader, incoming_requests);

let backfill_sync = PipelineSync::new(pipeline, pipeline_task_spawner);

ChainOrchestrator::new(handler, backfill_sync)
}
Loading
Loading