mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 19:09:54 +00:00
feat: introduce evm config trait (#6461)
Co-authored-by: Dan Cline <6798349+Rjected@users.noreply.github.com> Co-authored-by: Oliver Nordbjerg <onbjerg@users.noreply.github.com>
This commit is contained in:
99
Cargo.lock
generated
99
Cargo.lock
generated
@ -1161,9 +1161,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "bumpalo"
|
||||
version = "3.15.2"
|
||||
version = "3.15.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a3b1be7772ee4501dba05acbe66bb1e8760f6a6c474a36035631638e4415f130"
|
||||
checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b"
|
||||
|
||||
[[package]]
|
||||
name = "byte-slice-cast"
|
||||
@ -1286,7 +1286,7 @@ dependencies = [
|
||||
"num-traits",
|
||||
"serde",
|
||||
"wasm-bindgen",
|
||||
"windows-targets 0.52.0",
|
||||
"windows-targets 0.52.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1872,12 +1872,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "darling"
|
||||
version = "0.20.6"
|
||||
version = "0.20.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c376d08ea6aa96aafe61237c7200d1241cb177b7d3a542d791f2d118e9cbb955"
|
||||
checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391"
|
||||
dependencies = [
|
||||
"darling_core 0.20.6",
|
||||
"darling_macro 0.20.6",
|
||||
"darling_core 0.20.8",
|
||||
"darling_macro 0.20.8",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1910,9 +1910,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "darling_core"
|
||||
version = "0.20.6"
|
||||
version = "0.20.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33043dcd19068b8192064c704b3f83eb464f91f1ff527b44a4e2b08d9cdb8855"
|
||||
checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f"
|
||||
dependencies = [
|
||||
"fnv",
|
||||
"ident_case",
|
||||
@ -1946,11 +1946,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "darling_macro"
|
||||
version = "0.20.6"
|
||||
version = "0.20.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c5a91391accf613803c2a9bf9abccdbaa07c54b4244a5b64883f9c3c137c86be"
|
||||
checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
|
||||
dependencies = [
|
||||
"darling_core 0.20.6",
|
||||
"darling_core 0.20.8",
|
||||
"quote",
|
||||
"syn 2.0.50",
|
||||
]
|
||||
@ -2969,9 +2969,9 @@ checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
|
||||
|
||||
[[package]]
|
||||
name = "futures-timer"
|
||||
version = "3.0.2"
|
||||
version = "3.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
||||
checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
|
||||
dependencies = [
|
||||
"gloo-timers",
|
||||
"send_wrapper 0.4.0",
|
||||
@ -3360,7 +3360,7 @@ dependencies = [
|
||||
"httpdate",
|
||||
"itoa",
|
||||
"pin-project-lite",
|
||||
"socket2 0.5.5",
|
||||
"socket2 0.5.6",
|
||||
"tokio",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
@ -3738,7 +3738,7 @@ version = "0.3.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
|
||||
dependencies = [
|
||||
"socket2 0.5.5",
|
||||
"socket2 0.5.6",
|
||||
"widestring",
|
||||
"windows-sys 0.48.0",
|
||||
"winreg",
|
||||
@ -6338,6 +6338,7 @@ version = "0.1.0-alpha.19"
|
||||
dependencies = [
|
||||
"reth-primitives",
|
||||
"reth-rpc-types",
|
||||
"revm",
|
||||
"revm-primitives",
|
||||
"serde",
|
||||
"thiserror",
|
||||
@ -6462,6 +6463,7 @@ dependencies = [
|
||||
"reth-rpc-types",
|
||||
"reth-tracing",
|
||||
"reth-transaction-pool",
|
||||
"revm",
|
||||
"serde",
|
||||
]
|
||||
|
||||
@ -6484,6 +6486,7 @@ dependencies = [
|
||||
"reth-rpc-types-compat",
|
||||
"reth-tracing",
|
||||
"reth-transaction-pool",
|
||||
"revm",
|
||||
"serde",
|
||||
]
|
||||
|
||||
@ -7654,7 +7657,7 @@ version = "3.6.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d"
|
||||
dependencies = [
|
||||
"darling 0.20.6",
|
||||
"darling 0.20.8",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.50",
|
||||
@ -7885,12 +7888,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "socket2"
|
||||
version = "0.5.5"
|
||||
version = "0.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
|
||||
checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"windows-sys 0.48.0",
|
||||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -8222,7 +8225,7 @@ version = "5.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17f9bc8c69f276df24e4d1c082e52ea057544495916c4aa0708b82e47f55f364"
|
||||
dependencies = [
|
||||
"darling 0.20.6",
|
||||
"darling 0.20.8",
|
||||
"itertools 0.12.1",
|
||||
"once_cell",
|
||||
"prettyplease",
|
||||
@ -8381,7 +8384,7 @@ dependencies = [
|
||||
"parking_lot 0.12.1",
|
||||
"pin-project-lite",
|
||||
"signal-hook-registry",
|
||||
"socket2 0.5.5",
|
||||
"socket2 0.5.6",
|
||||
"tokio-macros",
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
@ -9219,7 +9222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
|
||||
dependencies = [
|
||||
"windows-core",
|
||||
"windows-targets 0.52.0",
|
||||
"windows-targets 0.52.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -9228,7 +9231,7 @@ version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.0",
|
||||
"windows-targets 0.52.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -9246,7 +9249,7 @@ version = "0.52.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
|
||||
dependencies = [
|
||||
"windows-targets 0.52.0",
|
||||
"windows-targets 0.52.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -9266,17 +9269,17 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "windows-targets"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
|
||||
checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f"
|
||||
dependencies = [
|
||||
"windows_aarch64_gnullvm 0.52.0",
|
||||
"windows_aarch64_msvc 0.52.0",
|
||||
"windows_i686_gnu 0.52.0",
|
||||
"windows_i686_msvc 0.52.0",
|
||||
"windows_x86_64_gnu 0.52.0",
|
||||
"windows_x86_64_gnullvm 0.52.0",
|
||||
"windows_x86_64_msvc 0.52.0",
|
||||
"windows_aarch64_gnullvm 0.52.3",
|
||||
"windows_aarch64_msvc 0.52.3",
|
||||
"windows_i686_gnu 0.52.3",
|
||||
"windows_i686_msvc 0.52.3",
|
||||
"windows_x86_64_gnu 0.52.3",
|
||||
"windows_x86_64_gnullvm 0.52.3",
|
||||
"windows_x86_64_msvc 0.52.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -9287,9 +9290,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_gnullvm"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
|
||||
checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
@ -9299,9 +9302,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_aarch64_msvc"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
|
||||
checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
@ -9311,9 +9314,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_gnu"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
|
||||
checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
@ -9323,9 +9326,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
|
||||
|
||||
[[package]]
|
||||
name = "windows_i686_msvc"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
|
||||
checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
@ -9335,9 +9338,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnu"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
|
||||
checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
@ -9347,9 +9350,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_gnullvm"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
|
||||
checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
@ -9359,9 +9362,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
||||
|
||||
[[package]]
|
||||
name = "windows_x86_64_msvc"
|
||||
version = "0.52.0"
|
||||
version = "0.52.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
|
||||
checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
|
||||
@ -58,13 +58,13 @@ use tracing::{debug, error, info, instrument, trace, warn};
|
||||
/// * [BlockchainTree::make_canonical]: Check if we have the hash of a block that is the current
|
||||
/// canonical head and commit it to db.
|
||||
#[derive(Debug)]
|
||||
pub struct BlockchainTree<DB: Database, EF: ExecutorFactory> {
|
||||
pub struct BlockchainTree<DB: Database, EVM: ExecutorFactory> {
|
||||
/// The state of the tree
|
||||
///
|
||||
/// Tracks all the chains, the block indices, and the block buffer.
|
||||
state: TreeState,
|
||||
/// External components (the database, consensus engine etc.)
|
||||
externals: TreeExternals<DB, EF>,
|
||||
externals: TreeExternals<DB, EVM>,
|
||||
/// Tree configuration
|
||||
config: BlockchainTreeConfig,
|
||||
/// Broadcast channel for canon state changes notifications.
|
||||
@ -76,10 +76,10 @@ pub struct BlockchainTree<DB: Database, EF: ExecutorFactory> {
|
||||
prune_modes: Option<PruneModes>,
|
||||
}
|
||||
|
||||
impl<DB: Database, EF: ExecutorFactory> BlockchainTree<DB, EF> {
|
||||
impl<DB: Database, EVM: ExecutorFactory> BlockchainTree<DB, EVM> {
|
||||
/// Create a new blockchain tree.
|
||||
pub fn new(
|
||||
externals: TreeExternals<DB, EF>,
|
||||
externals: TreeExternals<DB, EVM>,
|
||||
config: BlockchainTreeConfig,
|
||||
prune_modes: Option<PruneModes>,
|
||||
) -> RethResult<Self> {
|
||||
|
||||
@ -163,18 +163,18 @@ impl AppendableChain {
|
||||
/// - [BlockAttachment] represents if the block extends the canonical chain, and thus we can
|
||||
/// cache the trie state updates.
|
||||
/// - [BlockValidationKind] determines if the state root __should__ be validated.
|
||||
fn validate_and_execute<BSDP, DB, EF>(
|
||||
fn validate_and_execute<BSDP, DB, EVM>(
|
||||
block: SealedBlockWithSenders,
|
||||
parent_block: &SealedHeader,
|
||||
bundle_state_data_provider: BSDP,
|
||||
externals: &TreeExternals<DB, EF>,
|
||||
externals: &TreeExternals<DB, EVM>,
|
||||
block_attachment: BlockAttachment,
|
||||
block_validation_kind: BlockValidationKind,
|
||||
) -> RethResult<(BundleStateWithReceipts, Option<TrieUpdates>)>
|
||||
where
|
||||
BSDP: BundleStateDataProvider,
|
||||
DB: Database,
|
||||
EF: ExecutorFactory,
|
||||
EVM: ExecutorFactory,
|
||||
{
|
||||
// some checks are done before blocks comes here.
|
||||
externals.consensus.validate_header_against_parent(&block, parent_block)?;
|
||||
|
||||
@ -16,27 +16,27 @@ use std::{collections::BTreeMap, sync::Arc};
|
||||
/// - The executor factory to execute blocks with
|
||||
/// - The chain spec
|
||||
#[derive(Debug)]
|
||||
pub struct TreeExternals<DB, EF> {
|
||||
pub struct TreeExternals<DB, EVM> {
|
||||
/// The provider factory, used to commit the canonical chain, or unwind it.
|
||||
pub(crate) provider_factory: ProviderFactory<DB>,
|
||||
/// The consensus engine.
|
||||
pub(crate) consensus: Arc<dyn Consensus>,
|
||||
/// The executor factory to execute blocks with.
|
||||
pub(crate) executor_factory: EF,
|
||||
pub(crate) executor_factory: EVM,
|
||||
}
|
||||
|
||||
impl<DB, EF> TreeExternals<DB, EF> {
|
||||
impl<DB, EVM> TreeExternals<DB, EVM> {
|
||||
/// Create new tree externals.
|
||||
pub fn new(
|
||||
provider_factory: ProviderFactory<DB>,
|
||||
consensus: Arc<dyn Consensus>,
|
||||
executor_factory: EF,
|
||||
executor_factory: EVM,
|
||||
) -> Self {
|
||||
Self { provider_factory, consensus, executor_factory }
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB: Database, EF> TreeExternals<DB, EF> {
|
||||
impl<DB: Database, EVM> TreeExternals<DB, EVM> {
|
||||
/// Fetches the latest canonical block hashes by walking backwards from the head.
|
||||
///
|
||||
/// Returns the hashes sorted by increasing block numbers
|
||||
|
||||
@ -19,7 +19,7 @@ use reth_interfaces::{
|
||||
consensus::{Consensus, ConsensusError},
|
||||
executor::{BlockExecutionError, BlockValidationError},
|
||||
};
|
||||
use reth_node_api::{ConfigureEvmEnv, EngineTypes};
|
||||
use reth_node_api::{ConfigureEvm, EngineTypes};
|
||||
use reth_primitives::{
|
||||
constants::{EMPTY_RECEIPTS, EMPTY_TRANSACTIONS, ETHEREUM_BLOCK_GAS_LIMIT},
|
||||
proofs, Block, BlockBody, BlockHash, BlockHashOrNumber, BlockNumber, BlockWithSenders, Bloom,
|
||||
@ -320,7 +320,7 @@ impl StorageInner {
|
||||
executor: &mut EVMProcessor<'_, EvmConfig>,
|
||||
) -> Result<(BundleStateWithReceipts, u64), BlockExecutionError>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv,
|
||||
EvmConfig: ConfigureEvm,
|
||||
{
|
||||
trace!(target: "consensus::auto", transactions=?&block.body, "executing transactions");
|
||||
// TODO: there isn't really a parent beacon block root here, so not sure whether or not to
|
||||
@ -434,7 +434,7 @@ impl StorageInner {
|
||||
evm_config: EvmConfig,
|
||||
) -> Result<(SealedHeader, BundleStateWithReceipts), BlockExecutionError>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv,
|
||||
EvmConfig: ConfigureEvm,
|
||||
{
|
||||
let header = self.build_header_template(&transactions, chain_spec.clone());
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@ use crate::{mode::MiningMode, Storage};
|
||||
use futures_util::{future::BoxFuture, FutureExt};
|
||||
use reth_beacon_consensus::{BeaconEngineMessage, ForkchoiceStatus};
|
||||
use reth_interfaces::consensus::ForkchoiceState;
|
||||
use reth_node_api::{ConfigureEvmEnv, EngineTypes};
|
||||
use reth_node_api::{ConfigureEvm, EngineTypes};
|
||||
use reth_primitives::{Block, ChainSpec, IntoRecoveredTransaction, SealedBlockWithSenders};
|
||||
use reth_provider::{CanonChainTracker, CanonStateNotificationSender, Chain, StateProviderFactory};
|
||||
use reth_stages::PipelineEvent;
|
||||
@ -88,7 +88,7 @@ where
|
||||
Pool: TransactionPool + Unpin + 'static,
|
||||
<Pool as TransactionPool>::Transaction: IntoRecoveredTransaction,
|
||||
Engine: EngineTypes + 'static,
|
||||
EvmConfig: ConfigureEvmEnv + Clone + Unpin + Send + Sync + 'static,
|
||||
EvmConfig: ConfigureEvm + Clone + Unpin + Send + Sync + 'static,
|
||||
{
|
||||
type Output = ();
|
||||
|
||||
|
||||
@ -17,6 +17,7 @@ use reth_downloaders::{
|
||||
};
|
||||
use reth_interfaces::{
|
||||
consensus::Consensus,
|
||||
executor::BlockExecutionError,
|
||||
p2p::{bodies::client::BodiesClient, either::EitherDownloader, headers::client::HeadersClient},
|
||||
sync::NoopSyncStateUpdater,
|
||||
test_utils::{NoopFullBlockClient, TestConsensus},
|
||||
@ -174,7 +175,7 @@ where
|
||||
fn with_state<'a, SP: reth_provider::StateProvider + 'a>(
|
||||
&'a self,
|
||||
sp: SP,
|
||||
) -> Box<dyn PrunableBlockExecutor + 'a> {
|
||||
) -> Box<dyn PrunableBlockExecutor<Error = BlockExecutionError> + 'a> {
|
||||
match self {
|
||||
EitherExecutorFactory::Left(a) => a.with_state::<'a, SP>(sp),
|
||||
EitherExecutorFactory::Right(b) => b.with_state::<'a, SP>(sp),
|
||||
|
||||
@ -16,6 +16,7 @@ reth-primitives.workspace = true
|
||||
reth-rpc-types.workspace = true
|
||||
revm-primitives.workspace = true
|
||||
thiserror.workspace = true
|
||||
revm.workspace = true
|
||||
|
||||
# io
|
||||
serde.workspace = true
|
||||
|
||||
@ -1,38 +1,5 @@
|
||||
use reth_primitives::{revm::env::fill_block_env, Address, ChainSpec, Header, Transaction, U256};
|
||||
use revm_primitives::{BlockEnv, CfgEnvWithHandlerCfg, SpecId, TxEnv};
|
||||
//! Traits and structs for working with a configurable EVM.
|
||||
|
||||
/// EVM configuration trait.
|
||||
pub trait EvmConfig: ConfigureEvmEnv + Clone + Send + Sync + 'static {}
|
||||
|
||||
/// This represents the set of methods used to configure the EVM before execution.
|
||||
pub trait ConfigureEvmEnv: Send + Sync + Unpin + Clone {
|
||||
/// The type of the transaction metadata.
|
||||
type TxMeta;
|
||||
|
||||
/// Fill transaction environment from a [Transaction] and the given sender address.
|
||||
fn fill_tx_env<T>(tx_env: &mut TxEnv, transaction: T, sender: Address, meta: Self::TxMeta)
|
||||
where
|
||||
T: AsRef<Transaction>;
|
||||
|
||||
/// Fill [CfgEnvWithHandlerCfg] fields according to the chain spec and given header
|
||||
fn fill_cfg_env(
|
||||
cfg_env: &mut CfgEnvWithHandlerCfg,
|
||||
chain_spec: &ChainSpec,
|
||||
header: &Header,
|
||||
total_difficulty: U256,
|
||||
);
|
||||
|
||||
/// Convenience function to call both [fill_cfg_env](ConfigureEvmEnv::fill_cfg_env) and
|
||||
/// [fill_block_env].
|
||||
fn fill_cfg_and_block_env(
|
||||
cfg: &mut CfgEnvWithHandlerCfg,
|
||||
block_env: &mut BlockEnv,
|
||||
chain_spec: &ChainSpec,
|
||||
header: &Header,
|
||||
total_difficulty: U256,
|
||||
) {
|
||||
Self::fill_cfg_env(cfg, chain_spec, header, total_difficulty);
|
||||
let after_merge = cfg.handler_cfg.spec_id >= SpecId::MERGE;
|
||||
fill_block_env(block_env, chain_spec, header, after_merge);
|
||||
}
|
||||
}
|
||||
/// Traits for working with a configurable EVM.
|
||||
mod traits;
|
||||
pub use traits::{ConfigureEvm, ConfigureEvmEnv};
|
||||
|
||||
54
crates/node-api/src/evm/traits.rs
Normal file
54
crates/node-api/src/evm/traits.rs
Normal file
@ -0,0 +1,54 @@
|
||||
use reth_primitives::{revm::env::fill_block_env, Address, ChainSpec, Header, Transaction, U256};
|
||||
use revm::{Database, Evm, EvmBuilder};
|
||||
use revm_primitives::{BlockEnv, CfgEnvWithHandlerCfg, SpecId, TxEnv};
|
||||
|
||||
/// Trait for configuring the EVM for executing full blocks.
|
||||
pub trait ConfigureEvm: ConfigureEvmEnv {
|
||||
/// Returns new EVM with the given database
|
||||
fn evm<'a, DB: Database + 'a>(&self, db: DB) -> Evm<'a, (), DB> {
|
||||
EvmBuilder::default().with_db(db).build()
|
||||
}
|
||||
|
||||
/// Returns a new EVM with the given inspector
|
||||
fn evm_with_inspector<'a, DB: Database + 'a, I>(&self, db: DB, inspector: I) -> Evm<'a, I, DB> {
|
||||
EvmBuilder::default().with_db(db).with_external_context(inspector).build()
|
||||
}
|
||||
}
|
||||
|
||||
/// This represents the set of methods used to configure the EVM's environment before block
|
||||
/// execution.
|
||||
pub trait ConfigureEvmEnv: Send + Sync + Unpin + Clone {
|
||||
/// The type of the transaction metadata that should be used to fill fields in the transaction
|
||||
/// environment.
|
||||
///
|
||||
/// On ethereum mainnet, this is `()`, and on optimism these are the L1 fee fields and
|
||||
/// additional L1 block info.
|
||||
type TxMeta;
|
||||
|
||||
/// Fill transaction environment from a [Transaction] and the given sender address.
|
||||
fn fill_tx_env<T>(tx_env: &mut TxEnv, transaction: T, sender: Address, meta: Self::TxMeta)
|
||||
where
|
||||
T: AsRef<Transaction>;
|
||||
|
||||
/// Fill [CfgEnvWithHandlerCfg] fields according to the chain spec and given header
|
||||
fn fill_cfg_env(
|
||||
cfg_env: &mut CfgEnvWithHandlerCfg,
|
||||
chain_spec: &ChainSpec,
|
||||
header: &Header,
|
||||
total_difficulty: U256,
|
||||
);
|
||||
|
||||
/// Convenience function to call both [fill_cfg_env](ConfigureEvmEnv::fill_cfg_env) and
|
||||
/// [fill_block_env].
|
||||
fn fill_cfg_and_block_env(
|
||||
cfg: &mut CfgEnvWithHandlerCfg,
|
||||
block_env: &mut BlockEnv,
|
||||
chain_spec: &ChainSpec,
|
||||
header: &Header,
|
||||
total_difficulty: U256,
|
||||
) {
|
||||
Self::fill_cfg_env(cfg, chain_spec, header, total_difficulty);
|
||||
let after_merge = cfg.handler_cfg.spec_id >= SpecId::MERGE;
|
||||
fill_block_env(block_env, chain_spec, header, after_merge);
|
||||
}
|
||||
}
|
||||
@ -19,6 +19,6 @@ pub use engine::{
|
||||
|
||||
/// Traits and helper types used to abstract over EVM methods and types.
|
||||
pub mod evm;
|
||||
pub use evm::ConfigureEvmEnv;
|
||||
pub use evm::{ConfigureEvm, ConfigureEvmEnv};
|
||||
|
||||
pub mod primitives;
|
||||
|
||||
@ -66,7 +66,7 @@ type RethFullProviderType<DB, Evm> =
|
||||
/// engine types.
|
||||
///
|
||||
/// Next all stateful components of the node are configured, these include the
|
||||
/// [EvmConfig](reth_node_api::evm::EvmConfig), the database [Database] and finally all the
|
||||
/// [ConfigureEvm](reth_node_api::evm::ConfigureEvm), the database [Database] and finally all the
|
||||
/// components of the node that are downstream of those types, these include:
|
||||
///
|
||||
/// - The transaction pool: [PoolBuilder](crate::components::PoolBuilder)
|
||||
|
||||
@ -4,7 +4,7 @@ use crate::{
|
||||
};
|
||||
use reth_db::database::Database;
|
||||
use reth_network::NetworkHandle;
|
||||
use reth_node_api::{evm::EvmConfig, primitives::NodePrimitives, EngineTypes};
|
||||
use reth_node_api::{evm::ConfigureEvm, primitives::NodePrimitives, EngineTypes};
|
||||
use reth_node_core::{
|
||||
cli::components::FullProvider,
|
||||
dirs::{ChainPath, DataDirPath},
|
||||
@ -21,7 +21,7 @@ pub trait NodeTypes: Send + Sync + 'static {
|
||||
/// The node's engine types.
|
||||
type Engine: EngineTypes;
|
||||
/// The node's evm configuration.
|
||||
type Evm: EvmConfig;
|
||||
type Evm: ConfigureEvm;
|
||||
|
||||
/// Returns the node's evm config.
|
||||
fn evm_config(&self) -> Self::Evm;
|
||||
|
||||
@ -39,7 +39,7 @@ use reth_network::{
|
||||
transactions::{TransactionFetcherConfig, TransactionsManagerConfig},
|
||||
NetworkBuilder, NetworkConfig, NetworkHandle, NetworkManager,
|
||||
};
|
||||
use reth_node_api::ConfigureEvmEnv;
|
||||
use reth_node_api::ConfigureEvm;
|
||||
use reth_primitives::{
|
||||
constants::eip4844::{LoadKzgSettingsError, MAINNET_KZG_TRUSTED_SETUP},
|
||||
kzg::KzgSettings,
|
||||
@ -433,7 +433,7 @@ impl NodeConfig {
|
||||
) -> eyre::Result<BlockchainTree<DB, EvmProcessorFactory<EvmConfig>>>
|
||||
where
|
||||
DB: Database + Unpin + Clone + 'static,
|
||||
EvmConfig: ConfigureEvmEnv + Clone + 'static,
|
||||
EvmConfig: ConfigureEvm + Clone + 'static,
|
||||
{
|
||||
// configure blockchain tree
|
||||
let tree_externals = TreeExternals::new(
|
||||
@ -547,7 +547,7 @@ impl NodeConfig {
|
||||
where
|
||||
DB: Database + Unpin + Clone + 'static,
|
||||
Client: HeadersClient + BodiesClient + Clone + 'static,
|
||||
EvmConfig: ConfigureEvmEnv + Clone + 'static,
|
||||
EvmConfig: ConfigureEvm + Clone + 'static,
|
||||
{
|
||||
// building network downloaders using the fetch client
|
||||
let header_downloader = ReverseHeadersDownloaderBuilder::new(config.headers)
|
||||
@ -796,7 +796,7 @@ impl NodeConfig {
|
||||
DB: Database + Clone + 'static,
|
||||
H: HeaderDownloader + 'static,
|
||||
B: BodyDownloader + 'static,
|
||||
EvmConfig: ConfigureEvmEnv + Clone + 'static,
|
||||
EvmConfig: ConfigureEvm + Clone + 'static,
|
||||
{
|
||||
let mut builder = Pipeline::builder();
|
||||
|
||||
|
||||
@ -23,6 +23,7 @@ reth-tracing.workspace = true
|
||||
reth-provider.workspace = true
|
||||
reth-transaction-pool.workspace = true
|
||||
reth-network.workspace = true
|
||||
revm.workspace = true
|
||||
|
||||
# misc
|
||||
eyre.workspace = true
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
use reth_node_api::{evm::EvmConfig, ConfigureEvmEnv};
|
||||
use reth_node_api::{ConfigureEvm, ConfigureEvmEnv};
|
||||
use reth_primitives::{
|
||||
revm::{config::revm_spec, env::fill_tx_env},
|
||||
revm_primitives::{AnalysisKind, CfgEnvWithHandlerCfg, TxEnv},
|
||||
@ -44,8 +44,7 @@ impl ConfigureEvmEnv for EthEvmConfig {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO
|
||||
impl EvmConfig for EthEvmConfig {}
|
||||
impl ConfigureEvm for EthEvmConfig {}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
|
||||
@ -25,6 +25,7 @@ reth-tracing.workspace = true
|
||||
reth-provider.workspace = true
|
||||
reth-transaction-pool.workspace = true
|
||||
reth-network.workspace = true
|
||||
revm.workspace = true
|
||||
|
||||
# io
|
||||
serde.workspace = true
|
||||
|
||||
@ -1,9 +1,10 @@
|
||||
use reth_node_api::{evm::EvmConfig, ConfigureEvmEnv};
|
||||
use reth_node_api::{ConfigureEvm, ConfigureEvmEnv};
|
||||
use reth_primitives::{
|
||||
revm::{config::revm_spec, env::fill_op_tx_env},
|
||||
revm_primitives::{AnalysisKind, CfgEnvWithHandlerCfg, TxEnv},
|
||||
revm_primitives::{AnalysisKind, CfgEnvWithHandlerCfg, HandlerCfg, SpecId, TxEnv},
|
||||
Address, Bytes, ChainSpec, Head, Header, Transaction, U256,
|
||||
};
|
||||
use revm::{Database, Evm, EvmBuilder};
|
||||
|
||||
/// Optimism-related EVM configuration.
|
||||
#[derive(Debug, Default, Clone, Copy)]
|
||||
@ -45,13 +46,26 @@ impl ConfigureEvmEnv for OptimismEvmConfig {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO
|
||||
impl EvmConfig for OptimismEvmConfig {}
|
||||
impl ConfigureEvm for OptimismEvmConfig {
|
||||
fn evm<'a, DB: Database + 'a>(&self, db: DB) -> Evm<'a, (), DB> {
|
||||
let handler_cfg = HandlerCfg { spec_id: SpecId::LATEST, is_optimism: true };
|
||||
EvmBuilder::default().with_db(db).with_handler_cfg(handler_cfg).build()
|
||||
}
|
||||
|
||||
fn evm_with_inspector<'a, DB: Database + 'a, I>(&self, db: DB, inspector: I) -> Evm<'a, I, DB> {
|
||||
let handler_cfg = HandlerCfg { spec_id: SpecId::LATEST, is_optimism: true };
|
||||
EvmBuilder::default()
|
||||
.with_db(db)
|
||||
.with_external_context(inspector)
|
||||
.with_handler_cfg(handler_cfg)
|
||||
.build()
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use reth_primitives::revm_primitives::{BlockEnv, CfgEnv, SpecId};
|
||||
use reth_primitives::revm_primitives::{BlockEnv, CfgEnv};
|
||||
|
||||
#[test]
|
||||
#[ignore]
|
||||
|
||||
@ -3,7 +3,8 @@ use crate::{
|
||||
processor::EVMProcessor,
|
||||
stack::{InspectorStack, InspectorStackConfig},
|
||||
};
|
||||
use reth_node_api::ConfigureEvmEnv;
|
||||
use reth_interfaces::executor::BlockExecutionError;
|
||||
use reth_node_api::ConfigureEvm;
|
||||
use reth_primitives::ChainSpec;
|
||||
use reth_provider::{ExecutorFactory, PrunableBlockExecutor, StateProvider};
|
||||
use std::sync::Arc;
|
||||
@ -38,12 +39,12 @@ impl<EvmConfig> EvmProcessorFactory<EvmConfig> {
|
||||
|
||||
impl<EvmConfig> ExecutorFactory for EvmProcessorFactory<EvmConfig>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv + Send + Sync + Clone + 'static,
|
||||
EvmConfig: ConfigureEvm + Send + Sync + Clone + 'static,
|
||||
{
|
||||
fn with_state<'a, SP: StateProvider + 'a>(
|
||||
&'a self,
|
||||
sp: SP,
|
||||
) -> Box<dyn PrunableBlockExecutor + 'a> {
|
||||
) -> Box<dyn PrunableBlockExecutor<Error = BlockExecutionError> + 'a> {
|
||||
let database_state = StateProviderDatabase::new(sp);
|
||||
let mut evm = Box::new(EVMProcessor::new_with_db(
|
||||
self.chain_spec.clone(),
|
||||
|
||||
@ -2,12 +2,12 @@ use crate::processor::{compare_receipts_root_and_logs_bloom, EVMProcessor};
|
||||
use reth_interfaces::executor::{
|
||||
BlockExecutionError, BlockValidationError, OptimismBlockExecutionError,
|
||||
};
|
||||
use reth_node_api::ConfigureEvmEnv;
|
||||
use reth_node_api::ConfigureEvm;
|
||||
use reth_primitives::{
|
||||
proofs::calculate_receipt_root_optimism, revm_primitives::ResultAndState, BlockWithSenders,
|
||||
Bloom, ChainSpec, Hardfork, Receipt, ReceiptWithBloom, TxType, B256, U256,
|
||||
};
|
||||
use reth_provider::{BlockExecutor, BlockExecutorStats, BundleStateWithReceipts};
|
||||
use reth_provider::{BlockExecutor, BundleStateWithReceipts};
|
||||
use revm::DatabaseCommit;
|
||||
use std::time::Instant;
|
||||
use tracing::{debug, trace};
|
||||
@ -40,8 +40,10 @@ pub fn verify_receipt_optimism<'a>(
|
||||
|
||||
impl<'a, EvmConfig> BlockExecutor for EVMProcessor<'a, EvmConfig>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv,
|
||||
EvmConfig: ConfigureEvm,
|
||||
{
|
||||
type Error = BlockExecutionError;
|
||||
|
||||
fn execute(
|
||||
&mut self,
|
||||
block: &BlockWithSenders,
|
||||
@ -196,10 +198,6 @@ where
|
||||
)
|
||||
}
|
||||
|
||||
fn stats(&self) -> BlockExecutorStats {
|
||||
self.stats.clone()
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> Option<usize> {
|
||||
Some(self.evm.context.evm.db.bundle_size_hint())
|
||||
}
|
||||
|
||||
@ -5,7 +5,7 @@ use crate::{
|
||||
state_change::{apply_beacon_root_contract_call, post_block_balance_increments},
|
||||
};
|
||||
use reth_interfaces::executor::{BlockExecutionError, BlockValidationError};
|
||||
use reth_node_api::ConfigureEvmEnv;
|
||||
use reth_node_api::ConfigureEvm;
|
||||
use reth_primitives::{
|
||||
Address, Block, BlockNumber, BlockWithSenders, Bloom, ChainSpec, GotExpected, Hardfork, Header,
|
||||
PruneMode, PruneModes, PruneSegmentError, Receipt, ReceiptWithBloom, Receipts,
|
||||
@ -83,7 +83,7 @@ pub struct EVMProcessor<'a, EvmConfig> {
|
||||
|
||||
impl<'a, EvmConfig> EVMProcessor<'a, EvmConfig>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv,
|
||||
EvmConfig: ConfigureEvm,
|
||||
{
|
||||
/// Return chain spec.
|
||||
pub fn chain_spec(&self) -> &Arc<ChainSpec> {
|
||||
@ -93,17 +93,14 @@ where
|
||||
/// Create a new pocessor with the given chain spec.
|
||||
pub fn new(chain_spec: Arc<ChainSpec>, evm_config: EvmConfig) -> Self {
|
||||
// create evm with boxed empty db that is going to be set later.
|
||||
let evm = Evm::builder()
|
||||
.with_db(
|
||||
Box::new(
|
||||
StateBuilder::new()
|
||||
.with_database_boxed(Box::new(EmptyDBTyped::<ProviderError>::new())),
|
||||
)
|
||||
.build(),
|
||||
)
|
||||
// Hook and inspector stack that we want to invoke on that hook.
|
||||
.with_external_context(InspectorStack::new(InspectorStackConfig::default()))
|
||||
.build();
|
||||
let db = Box::new(
|
||||
StateBuilder::new().with_database_boxed(Box::new(EmptyDBTyped::<ProviderError>::new())),
|
||||
)
|
||||
.build();
|
||||
|
||||
// Hook and inspector stack that we want to invoke on that hook.
|
||||
let stack = InspectorStack::new(InspectorStackConfig::default());
|
||||
let evm = evm_config.evm_with_inspector(db, stack);
|
||||
EVMProcessor {
|
||||
chain_spec,
|
||||
evm,
|
||||
@ -137,10 +134,8 @@ where
|
||||
revm_state: StateDBBox<'a, ProviderError>,
|
||||
evm_config: EvmConfig,
|
||||
) -> Self {
|
||||
let evm = Evm::builder()
|
||||
.with_db(revm_state)
|
||||
.with_external_context(InspectorStack::new(InspectorStackConfig::default()))
|
||||
.build();
|
||||
let stack = InspectorStack::new(InspectorStackConfig::default());
|
||||
let evm = evm_config.evm_with_inspector(revm_state, stack);
|
||||
EVMProcessor {
|
||||
chain_spec,
|
||||
evm,
|
||||
@ -409,8 +404,10 @@ where
|
||||
#[cfg(not(feature = "optimism"))]
|
||||
impl<'a, EvmConfig> BlockExecutor for EVMProcessor<'a, EvmConfig>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv,
|
||||
EvmConfig: ConfigureEvm,
|
||||
{
|
||||
type Error = BlockExecutionError;
|
||||
|
||||
fn execute(
|
||||
&mut self,
|
||||
block: &BlockWithSenders,
|
||||
@ -505,6 +502,7 @@ where
|
||||
}
|
||||
|
||||
fn take_output_state(&mut self) -> BundleStateWithReceipts {
|
||||
self.stats.log_info();
|
||||
let receipts = std::mem::take(&mut self.receipts);
|
||||
BundleStateWithReceipts::new(
|
||||
self.evm.context.evm.db.take_bundle(),
|
||||
@ -513,10 +511,6 @@ where
|
||||
)
|
||||
}
|
||||
|
||||
fn stats(&self) -> BlockExecutorStats {
|
||||
self.stats.clone()
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> Option<usize> {
|
||||
Some(self.evm.context.evm.db.bundle_size_hint())
|
||||
}
|
||||
@ -524,7 +518,7 @@ where
|
||||
|
||||
impl<'a, EvmConfig> PrunableBlockExecutor for EVMProcessor<'a, EvmConfig>
|
||||
where
|
||||
EvmConfig: ConfigureEvmEnv,
|
||||
EvmConfig: ConfigureEvm,
|
||||
{
|
||||
fn set_tip(&mut self, tip: BlockNumber) {
|
||||
self.tip = Some(tip);
|
||||
|
||||
@ -206,8 +206,6 @@ impl<EF: ExecutorFactory> ExecutionStage<EF> {
|
||||
"Execution time"
|
||||
);
|
||||
|
||||
executor.stats().log_info();
|
||||
|
||||
let done = stage_progress == max_block;
|
||||
Ok(ExecOutput {
|
||||
checkpoint: StageCheckpoint::new(stage_progress)
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
use crate::{
|
||||
bundle_state::BundleStateWithReceipts, BlockExecutor, BlockExecutorStats, ExecutorFactory,
|
||||
PrunableBlockExecutor, StateProvider,
|
||||
bundle_state::BundleStateWithReceipts, BlockExecutor, ExecutorFactory, PrunableBlockExecutor,
|
||||
StateProvider,
|
||||
};
|
||||
use parking_lot::Mutex;
|
||||
use reth_interfaces::executor::BlockExecutionError;
|
||||
@ -11,6 +11,8 @@ use std::sync::Arc;
|
||||
pub struct TestExecutor(pub Option<BundleStateWithReceipts>);
|
||||
|
||||
impl BlockExecutor for TestExecutor {
|
||||
type Error = BlockExecutionError;
|
||||
|
||||
fn execute(
|
||||
&mut self,
|
||||
_block: &BlockWithSenders,
|
||||
@ -45,10 +47,6 @@ impl BlockExecutor for TestExecutor {
|
||||
self.0.clone().unwrap_or_default()
|
||||
}
|
||||
|
||||
fn stats(&self) -> BlockExecutorStats {
|
||||
BlockExecutorStats::default()
|
||||
}
|
||||
|
||||
fn size_hint(&self) -> Option<usize> {
|
||||
None
|
||||
}
|
||||
@ -77,7 +75,7 @@ impl ExecutorFactory for TestExecutorFactory {
|
||||
fn with_state<'a, SP: StateProvider + 'a>(
|
||||
&'a self,
|
||||
_sp: SP,
|
||||
) -> Box<dyn PrunableBlockExecutor + 'a> {
|
||||
) -> Box<dyn PrunableBlockExecutor<Error = <TestExecutor as BlockExecutor>::Error> + 'a> {
|
||||
let exec_res = self.exec_results.lock().pop();
|
||||
Box::new(TestExecutor(exec_res))
|
||||
}
|
||||
|
||||
@ -14,17 +14,20 @@ pub trait ExecutorFactory: Send + Sync + 'static {
|
||||
fn with_state<'a, SP: StateProvider + 'a>(
|
||||
&'a self,
|
||||
_sp: SP,
|
||||
) -> Box<dyn PrunableBlockExecutor + 'a>;
|
||||
) -> Box<dyn PrunableBlockExecutor<Error = BlockExecutionError> + 'a>;
|
||||
}
|
||||
|
||||
/// An executor capable of executing a block.
|
||||
pub trait BlockExecutor {
|
||||
/// The error type returned by the executor.
|
||||
type Error;
|
||||
|
||||
/// Execute a block.
|
||||
fn execute(
|
||||
&mut self,
|
||||
block: &BlockWithSenders,
|
||||
total_difficulty: U256,
|
||||
) -> Result<(), BlockExecutionError>;
|
||||
) -> Result<(), Self::Error>;
|
||||
|
||||
/// Executes the block and checks receipts.
|
||||
///
|
||||
@ -33,7 +36,7 @@ pub trait BlockExecutor {
|
||||
&mut self,
|
||||
block: &BlockWithSenders,
|
||||
total_difficulty: U256,
|
||||
) -> Result<(), BlockExecutionError>;
|
||||
) -> Result<(), Self::Error>;
|
||||
|
||||
/// Runs the provided transactions and commits their state to the run-time database.
|
||||
///
|
||||
@ -51,14 +54,11 @@ pub trait BlockExecutor {
|
||||
&mut self,
|
||||
block: &BlockWithSenders,
|
||||
total_difficulty: U256,
|
||||
) -> Result<(Vec<Receipt>, u64), BlockExecutionError>;
|
||||
) -> Result<(Vec<Receipt>, u64), Self::Error>;
|
||||
|
||||
/// Return bundle state. This is output of executed blocks.
|
||||
fn take_output_state(&mut self) -> BundleStateWithReceipts;
|
||||
|
||||
/// Internal statistics of execution.
|
||||
fn stats(&self) -> BlockExecutorStats;
|
||||
|
||||
/// Returns the size hint of current in-memory changes.
|
||||
fn size_hint(&self) -> Option<usize>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user