diff --git a/Cargo.lock b/Cargo.lock index 152116fe8761..2f2d83dfedc2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7109,6 +7109,7 @@ name = "reth-engine-primitives" version = "1.1.5" dependencies = [ "alloy-consensus", + "alloy-eips", "alloy-primitives", "alloy-rpc-types-engine", "futures", @@ -7228,6 +7229,7 @@ dependencies = [ "reth-ethereum-forks", "reth-evm", "reth-fs-util", + "reth-payload-primitives", "reth-payload-validator", "reth-primitives", "reth-primitives-traits", @@ -8129,6 +8131,7 @@ dependencies = [ "reth-chainspec", "reth-db-api", "reth-engine-primitives", + "reth-payload-primitives", "reth-primitives-traits", "reth-trie-db", ] diff --git a/crates/engine/local/src/miner.rs b/crates/engine/local/src/miner.rs index 447e89a00e2b..48cf735b87e2 100644 --- a/crates/engine/local/src/miner.rs +++ b/crates/engine/local/src/miner.rs @@ -5,10 +5,12 @@ use alloy_primitives::{TxHash, B256}; use alloy_rpc_types_engine::ForkchoiceState; use eyre::OptionExt; use futures_util::{stream::Fuse, StreamExt}; -use reth_engine_primitives::{BeaconEngineMessage, EngineApiMessageVersion, EngineTypes}; +use reth_engine_primitives::{BeaconEngineMessage, EngineTypes}; use reth_payload_builder::PayloadBuilderHandle; use reth_payload_builder_primitives::PayloadBuilder; -use reth_payload_primitives::{BuiltPayload, PayloadAttributesBuilder, PayloadKind, PayloadTypes}; +use reth_payload_primitives::{ + BuiltPayload, EngineApiMessageVersion, PayloadAttributesBuilder, PayloadKind, PayloadTypes, +}; use reth_provider::BlockReader; use reth_transaction_pool::TransactionPool; use std::{ diff --git a/crates/engine/primitives/Cargo.toml b/crates/engine/primitives/Cargo.toml index 66ed2c991e70..4a475c558b60 100644 --- a/crates/engine/primitives/Cargo.toml +++ b/crates/engine/primitives/Cargo.toml @@ -24,6 +24,7 @@ reth-errors.workspace = true alloy-primitives.workspace = true alloy-consensus.workspace = true alloy-rpc-types-engine.workspace = true +alloy-eips.workspace = true # async tokio = { workspace = true, features = ["sync"] } @@ -36,13 +37,14 @@ thiserror.workspace = true [features] default = ["std"] std = [ - "reth-execution-types/std", - "reth-primitives/std", - "reth-primitives-traits/std", - "alloy-primitives/std", - "alloy-consensus/std", - "alloy-rpc-types-engine/std", - "futures/std", - "serde/std", - "thiserror/std", + "reth-execution-types/std", + "reth-primitives/std", + "reth-primitives-traits/std", + "alloy-primitives/std", + "alloy-consensus/std", + "alloy-rpc-types-engine/std", + "futures/std", + "serde/std", + "thiserror/std", + "alloy-eips/std" ] diff --git a/crates/engine/primitives/src/lib.rs b/crates/engine/primitives/src/lib.rs index 714b410afb3e..edf4896ad4a0 100644 --- a/crates/engine/primitives/src/lib.rs +++ b/crates/engine/primitives/src/lib.rs @@ -11,6 +11,7 @@ extern crate alloc; +use reth_payload_primitives::{BuiltPayload, PayloadAttributes}; mod error; use core::fmt; @@ -31,15 +32,16 @@ pub use event::*; mod invalid_block_hook; pub use invalid_block_hook::InvalidBlockHook; -pub use reth_payload_primitives::{ - BuiltPayload, EngineApiMessageVersion, EngineObjectValidationError, PayloadOrAttributes, - PayloadTypes, +use reth_payload_primitives::{ + validate_execution_requests, EngineApiMessageVersion, EngineObjectValidationError, + InvalidPayloadAttributesError, PayloadOrAttributes, PayloadTypes, }; -use reth_payload_primitives::{InvalidPayloadAttributesError, PayloadAttributes}; use reth_primitives::{NodePrimitives, SealedBlock}; use reth_primitives_traits::Block; use serde::{de::DeserializeOwned, ser::Serialize}; +use alloy_eips::eip7685::Requests; + /// This type defines the versioned types of the engine API. /// /// This includes the execution payload types and payload attributes that are used to trigger a @@ -117,6 +119,14 @@ pub trait PayloadValidator: fmt::Debug + Send + Sync + Unpin + 'static { /// Type that validates the payloads processed by the engine. pub trait EngineValidator: PayloadValidator { + /// Validates the execution requests according to [EIP-7685](https://eips.ethereum.org/EIPS/eip-7685). + fn validate_execution_requests( + &self, + requests: &Requests, + ) -> Result<(), EngineObjectValidationError> { + validate_execution_requests(requests) + } + /// Validates the presence or exclusion of fork-specific fields based on the payload attributes /// and the message version. fn validate_version_specific_fields( diff --git a/crates/engine/tree/src/tree/mod.rs b/crates/engine/tree/src/tree/mod.rs index eeed8afa9e3f..140542813558 100644 --- a/crates/engine/tree/src/tree/mod.rs +++ b/crates/engine/tree/src/tree/mod.rs @@ -26,9 +26,8 @@ use reth_chain_state::{ use reth_consensus::{Consensus, FullConsensus, PostExecutionInput}; pub use reth_engine_primitives::InvalidBlockHook; use reth_engine_primitives::{ - BeaconConsensusEngineEvent, BeaconEngineMessage, BeaconOnNewPayloadError, - EngineApiMessageVersion, EngineTypes, EngineValidator, ForkchoiceStateTracker, - OnForkChoiceUpdated, + BeaconConsensusEngineEvent, BeaconEngineMessage, BeaconOnNewPayloadError, EngineTypes, + EngineValidator, ForkchoiceStateTracker, OnForkChoiceUpdated, }; use reth_errors::{ConsensusError, ProviderResult}; use reth_evm::{ @@ -37,7 +36,7 @@ use reth_evm::{ }; use reth_payload_builder::PayloadBuilderHandle; use reth_payload_builder_primitives::PayloadBuilder; -use reth_payload_primitives::PayloadBuilderAttributes; +use reth_payload_primitives::{EngineApiMessageVersion, PayloadBuilderAttributes}; use reth_primitives::{ EthPrimitives, GotExpected, NodePrimitives, RecoveredBlock, SealedBlock, SealedHeader, }; diff --git a/crates/engine/util/Cargo.toml b/crates/engine/util/Cargo.toml index 3e5f333e8d1f..d98e51ace225 100644 --- a/crates/engine/util/Cargo.toml +++ b/crates/engine/util/Cargo.toml @@ -26,6 +26,7 @@ reth-provider.workspace = true reth-ethereum-forks.workspace = true revm-primitives.workspace = true reth-trie.workspace = true +reth-payload-primitives.workspace = true # alloy alloy-eips.workspace = true diff --git a/crates/engine/util/src/reorg.rs b/crates/engine/util/src/reorg.rs index 75d9b9f13f9e..90c69bfcde32 100644 --- a/crates/engine/util/src/reorg.rs +++ b/crates/engine/util/src/reorg.rs @@ -8,8 +8,7 @@ use alloy_rpc_types_engine::{ use futures::{stream::FuturesUnordered, Stream, StreamExt, TryFutureExt}; use itertools::Either; use reth_engine_primitives::{ - BeaconEngineMessage, BeaconOnNewPayloadError, EngineApiMessageVersion, EngineTypes, - OnForkChoiceUpdated, + BeaconEngineMessage, BeaconOnNewPayloadError, EngineTypes, OnForkChoiceUpdated, }; use reth_errors::{BlockExecutionError, BlockValidationError, RethError, RethResult}; use reth_ethereum_forks::EthereumHardforks; @@ -17,6 +16,7 @@ use reth_evm::{ state_change::post_block_withdrawals_balance_increments, system_calls::SystemCaller, ConfigureEvm, Evm, }; +use reth_payload_primitives::EngineApiMessageVersion; use reth_payload_validator::ExecutionPayloadValidator; use reth_primitives::{ transaction::SignedTransactionIntoRecoveredExt, Block, BlockBody, Receipt, Receipts, diff --git a/crates/ethereum/engine-primitives/src/lib.rs b/crates/ethereum/engine-primitives/src/lib.rs index 502c80a8529c..d58e7ff1ca96 100644 --- a/crates/ethereum/engine-primitives/src/lib.rs +++ b/crates/ethereum/engine-primitives/src/lib.rs @@ -20,10 +20,10 @@ pub use alloy_rpc_types_engine::{ }; pub use payload::{EthBuiltPayload, EthPayloadBuilderAttributes}; use reth_chainspec::ChainSpec; -use reth_engine_primitives::{BuiltPayload, EngineTypes, EngineValidator, PayloadValidator}; +use reth_engine_primitives::{EngineTypes, EngineValidator, PayloadValidator}; use reth_payload_primitives::{ - validate_version_specific_fields, EngineApiMessageVersion, EngineObjectValidationError, - PayloadOrAttributes, PayloadTypes, + validate_version_specific_fields, BuiltPayload, EngineApiMessageVersion, + EngineObjectValidationError, PayloadOrAttributes, PayloadTypes, }; use reth_payload_validator::ExecutionPayloadValidator; use reth_primitives::{Block, NodePrimitives, SealedBlock}; diff --git a/crates/node/types/Cargo.toml b/crates/node/types/Cargo.toml index a4b285f32482..fefe98a2cc17 100644 --- a/crates/node/types/Cargo.toml +++ b/crates/node/types/Cargo.toml @@ -17,6 +17,7 @@ reth-db-api.workspace = true reth-engine-primitives.workspace = true reth-primitives-traits.workspace = true reth-trie-db.workspace = true +reth-payload-primitives.workspace = true [features] default = ["std"] diff --git a/crates/node/types/src/lib.rs b/crates/node/types/src/lib.rs index a63257582283..cfc66cf3ce9c 100644 --- a/crates/node/types/src/lib.rs +++ b/crates/node/types/src/lib.rs @@ -19,7 +19,8 @@ use reth_db_api::{ database_metrics::{DatabaseMetadata, DatabaseMetrics}, Database, }; -use reth_engine_primitives::{BuiltPayload, EngineTypes}; +use reth_engine_primitives::EngineTypes; +use reth_payload_primitives::BuiltPayload; use reth_trie_db::StateCommitment; /// The type that configures the essential types of an Ethereum-like node. diff --git a/crates/rpc/rpc-engine-api/src/engine_api.rs b/crates/rpc/rpc-engine-api/src/engine_api.rs index 50177199cb41..a092bdbdc705 100644 --- a/crates/rpc/rpc-engine-api/src/engine_api.rs +++ b/crates/rpc/rpc-engine-api/src/engine_api.rs @@ -20,8 +20,8 @@ use reth_chainspec::{EthereumHardfork, EthereumHardforks}; use reth_engine_primitives::{BeaconConsensusEngineHandle, EngineTypes, EngineValidator}; use reth_payload_builder::PayloadStore; use reth_payload_primitives::{ - validate_execution_requests, validate_payload_timestamp, EngineApiMessageVersion, - PayloadBuilderAttributes, PayloadOrAttributes, + validate_payload_timestamp, EngineApiMessageVersion, PayloadBuilderAttributes, + PayloadOrAttributes, }; use reth_rpc_api::EngineApiServer; use reth_rpc_types_compat::engine::payload::convert_to_payload_body_v1; @@ -268,8 +268,7 @@ where .validator .validate_version_specific_fields(EngineApiMessageVersion::V4, payload_or_attrs)?; - validate_execution_requests(&execution_requests)?; - + self.inner.validator.validate_execution_requests(&execution_requests)?; Ok(self .inner .beacon_consensus