diff --git a/crates/op-rbuilder/src/main.rs b/crates/op-rbuilder/src/main.rs index a248f0e4c..da5674e41 100644 --- a/crates/op-rbuilder/src/main.rs +++ b/crates/op-rbuilder/src/main.rs @@ -28,6 +28,7 @@ mod primitives; mod tester; mod tx_signer; use monitor_tx_pool::monitor_tx_pool; +mod provider; fn main() { Cli::::parse() diff --git a/crates/op-rbuilder/src/payload_builder.rs b/crates/op-rbuilder/src/payload_builder.rs index 82613c1ad..6203412bd 100644 --- a/crates/op-rbuilder/src/payload_builder.rs +++ b/crates/op-rbuilder/src/payload_builder.rs @@ -50,9 +50,7 @@ use reth_primitives_traits::Block as _; use reth_primitives_traits::SignedTransaction; use reth_provider::CanonStateSubscriptions; use reth_provider::StorageRootProvider; -use reth_provider::{ - HashedPostStateProvider, ProviderError, StateProviderFactory, StateRootProvider, -}; +use reth_provider::{HashedPostStateProvider, ProviderError}; use reth_revm::database::StateProviderDatabase; use reth_transaction_pool::PoolTransaction; use reth_transaction_pool::{BestTransactionsAttributes, TransactionPool}; @@ -77,6 +75,7 @@ use tokio_tungstenite::accept_async; use tokio_tungstenite::WebSocketStream; use url::Url; +use crate::provider::{BuilderStateProviderFactory, BuilderStateRootProvider}; use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] @@ -312,7 +311,7 @@ impl OpPayloadBuilder OpPayloadBuilder where Pool: TransactionPool>, - Client: StateProviderFactory + ChainSpecProvider, + Client: BuilderStateProviderFactory + ChainSpecProvider, N: OpPayloadPrimitives<_TX = OpTransactionSigned>, EvmConfig: ConfigureEvmFor, { @@ -463,7 +462,9 @@ where impl PayloadBuilder for OpPayloadBuilder where - Client: StateProviderFactory + ChainSpecProvider + Clone, + Client: BuilderStateProviderFactory + + ChainSpecProvider + + Clone, N: OpPayloadPrimitives<_TX = OpTransactionSigned>, Pool: TransactionPool>, EvmConfig: ConfigureEvmFor, @@ -490,7 +491,7 @@ where ChainSpec: EthChainSpec + OpHardforks, N: OpPayloadPrimitives<_TX = OpTransactionSigned>, DB: Database + AsRef

, - P: StateRootProvider + HashedPostStateProvider + StorageRootProvider, + P: BuilderStateRootProvider + HashedPostStateProvider + StorageRootProvider, { let withdrawals_root = ctx.commit_withdrawals(&mut state)?; diff --git a/crates/op-rbuilder/src/payload_builder_vanilla.rs b/crates/op-rbuilder/src/payload_builder_vanilla.rs index 4113b7629..ce363b669 100644 --- a/crates/op-rbuilder/src/payload_builder_vanilla.rs +++ b/crates/op-rbuilder/src/payload_builder_vanilla.rs @@ -1,3 +1,4 @@ +use crate::provider::{BuilderStateProviderFactory, BuilderStateRootProvider}; use crate::{ generator::{BlockCell, BlockPayloadJobGenerator, BuildArguments, PayloadBuilder}, metrics::OpRBuilderMetrics, @@ -62,10 +63,7 @@ use reth_primitives_traits::Block; use reth_primitives_traits::RecoveredBlock; use reth_primitives_traits::SignedTransaction; use reth_provider::CanonStateSubscriptions; -use reth_provider::{ - HashedPostStateProvider, ProviderError, StateProviderFactory, StateRootProvider, - StorageRootProvider, -}; +use reth_provider::{HashedPostStateProvider, ProviderError, StorageRootProvider}; use reth_revm::database::StateProviderDatabase; use reth_transaction_pool::BestTransactionsAttributes; use reth_transaction_pool::PoolTransaction; @@ -316,7 +314,9 @@ impl impl PayloadBuilder for OpPayloadBuilderVanilla where - Client: StateProviderFactory + ChainSpecProvider + Clone, + Client: BuilderStateProviderFactory + + ChainSpecProvider + + Clone, N: OpPayloadPrimitives<_TX = OpTransactionSigned>, Pool: TransactionPool>, EvmConfig: ConfigureEvmFor, @@ -375,7 +375,7 @@ where impl OpPayloadBuilderVanilla where Pool: TransactionPool>, - Client: StateProviderFactory + ChainSpecProvider, + Client: BuilderStateProviderFactory + ChainSpecProvider, N: OpPayloadPrimitives<_TX = OpTransactionSigned>, EvmConfig: ConfigureEvmFor, { @@ -631,7 +631,7 @@ impl OpBuilder<'_, Txs> { N: OpPayloadPrimitives<_TX = OpTransactionSigned>, Txs: PayloadTransactions>, DB: Database + AsRef

, - P: StateRootProvider + HashedPostStateProvider + StorageRootProvider, + P: BuilderStateRootProvider + HashedPostStateProvider + StorageRootProvider, { let ExecutedPayload { info, diff --git a/crates/op-rbuilder/src/provider/mod.rs b/crates/op-rbuilder/src/provider/mod.rs new file mode 100644 index 000000000..dd0b59401 --- /dev/null +++ b/crates/op-rbuilder/src/provider/mod.rs @@ -0,0 +1,38 @@ +use alloy_primitives::{BlockHash, B256}; +use reth_provider::{ProviderResult, StateProviderBox, StateProviderFactory, StateRootProvider}; +use reth_trie::updates::TrieUpdates; +use reth_trie::HashedPostState; + +/// Main trait to interact with the chain data. +/// Allows to create different backends for chain data access without implementing lots of interfaces as would happen with reth_provider::StateProviderFactory +/// since it only asks for what we really use. +pub trait BuilderStateProviderFactory: Send + Sync { + /// Returns _any_ [StateProvider] with matching block hash. + /// + /// This will return a [StateProvider] for either a historical or pending block. + fn state_by_block_hash(&self, block: BlockHash) -> ProviderResult; +} + +impl BuilderStateProviderFactory for T { + fn state_by_block_hash(&self, block: BlockHash) -> ProviderResult { + StateProviderFactory::state_by_block_hash(self, block) + } +} + +pub trait BuilderStateRootProvider: Send + Sync { + /// Returns the state root of the `HashedPostState` on top of the current state with trie + /// updates to be committed to the database. + fn state_root_with_updates( + &self, + hashed_state: HashedPostState, + ) -> ProviderResult<(B256, TrieUpdates)>; +} + +impl BuilderStateRootProvider for T { + fn state_root_with_updates( + &self, + hashed_state: HashedPostState, + ) -> ProviderResult<(B256, TrieUpdates)> { + StateRootProvider::state_root_with_updates(self, hashed_state) + } +}