Skip to content

Commit

Permalink
feat(engine): add StateRootTask skeleton (#12305)
Browse files Browse the repository at this point in the history
  • Loading branch information
fgimenez authored Nov 4, 2024
1 parent 0475af8 commit 3fe2234
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 0 deletions.
2 changes: 2 additions & 0 deletions Cargo.lock

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

3 changes: 3 additions & 0 deletions crates/engine/tree/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,12 @@ alloy-primitives.workspace = true
alloy-eips.workspace = true
alloy-rpc-types-engine.workspace = true

revm-primitives.workspace = true

# common
futures.workspace = true
tokio = { workspace = true, features = ["macros", "sync"] }
tokio-stream.workspace = true
thiserror.workspace = true

# metrics
Expand Down
2 changes: 2 additions & 0 deletions crates/engine/tree/src/tree/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ pub use invalid_block_hook::{InvalidBlockHooks, NoopInvalidBlockHook};
pub use persistence_state::PersistenceState;
pub use reth_engine_primitives::InvalidBlockHook;

mod root;

/// Keeps track of the state of the tree.
///
/// ## Invariants
Expand Down
60 changes: 60 additions & 0 deletions crates/engine/tree/src/tree/root.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
//! State root task related functionality.

use reth_provider::providers::ConsistentDbView;
use reth_trie::{updates::TrieUpdates, TrieInput};
use reth_trie_parallel::parallel_root::ParallelStateRootError;
use revm_primitives::{EvmState, B256};
use std::{
future::Future,
pin::Pin,
sync::Arc,
task::{Context, Poll},
};
use tokio_stream::wrappers::UnboundedReceiverStream;

/// Standalone task that receives a transaction state stream and updates relevant
/// data structures to calculate state root.
///
/// It is responsile of initializing a blinded sparse trie and subscribe to
/// transaction state stream. As it receives transaction execution results, it
/// fetches the proofs for relevant accounts from the database and reveal them
/// to the tree.
/// Then it updates relevant leaves according to the result of the transaction.
#[allow(dead_code)]
pub(crate) struct StateRootTask<Factory> {
/// View over the state in the database.
consistent_view: ConsistentDbView<Factory>,
/// Incoming state updates.
state_stream: UnboundedReceiverStream<EvmState>,
/// Latest trie input.
input: Arc<TrieInput>,
}

#[allow(dead_code)]
impl<Factory> StateRootTask<Factory> {
/// Creates a new `StateRootTask`.
pub(crate) const fn new(
consistent_view: ConsistentDbView<Factory>,
input: Arc<TrieInput>,
state_stream: UnboundedReceiverStream<EvmState>,
) -> Self {
Self { consistent_view, state_stream, input }
}

/// Handles state updates.
pub(crate) fn on_state_update(&self, _update: EvmState) {
// TODO: calculate hashed state update and dispatch proof gathering for it.
}
}

impl<Factory> Future for StateRootTask<Factory> {
type Output = Result<(B256, TrieUpdates), ParallelStateRootError>;

fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
// TODO:
// * poll incoming state updates stream
// * keep track of proof calculation
// * keep track of intermediate root computation
Poll::Pending
}
}

0 comments on commit 3fe2234

Please sign in to comment.