Skip to content

Commit e536fbc

Browse files
authored
fix: call validate_execution_requests from validate_version_specific_fields for ethereum engine validator (#14932)
1 parent eaa45ab commit e536fbc

File tree

6 files changed

+33
-31
lines changed

6 files changed

+33
-31
lines changed

Cargo.lock

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/engine/primitives/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ reth-trie-common.workspace = true
2626
alloy-primitives.workspace = true
2727
alloy-consensus.workspace = true
2828
alloy-rpc-types-engine.workspace = true
29-
alloy-eips.workspace = true
3029

3130
# async
3231
tokio = { workspace = true, features = ["sync"] }
@@ -50,5 +49,4 @@ std = [
5049
"futures/std",
5150
"serde/std",
5251
"thiserror/std",
53-
"alloy-eips/std",
5452
]

crates/engine/primitives/src/lib.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@
1212
extern crate alloc;
1313

1414
use alloy_consensus::BlockHeader;
15-
use alloy_eips::eip7685::Requests;
1615
use reth_errors::ConsensusError;
1716
use reth_payload_primitives::{
18-
validate_execution_requests, BuiltPayload, EngineApiMessageVersion,
19-
EngineObjectValidationError, InvalidPayloadAttributesError, NewPayloadError, PayloadAttributes,
20-
PayloadOrAttributes, PayloadTypes,
17+
BuiltPayload, EngineApiMessageVersion, EngineObjectValidationError,
18+
InvalidPayloadAttributesError, NewPayloadError, PayloadAttributes, PayloadOrAttributes,
19+
PayloadTypes,
2120
};
2221
use reth_primitives::{NodePrimitives, RecoveredBlock, SealedBlock};
2322
use reth_primitives_traits::Block;
@@ -136,14 +135,6 @@ pub trait PayloadValidator: Send + Sync + Unpin + 'static {
136135
pub trait EngineValidator<Types: EngineTypes>:
137136
PayloadValidator<ExecutionData = Types::ExecutionData>
138137
{
139-
/// Validates the execution requests according to [EIP-7685](https://eips.ethereum.org/EIPS/eip-7685).
140-
fn validate_execution_requests(
141-
&self,
142-
requests: &Requests,
143-
) -> Result<(), EngineObjectValidationError> {
144-
validate_execution_requests(requests)
145-
}
146-
147138
/// Validates the presence or exclusion of fork-specific fields based on the payload attributes
148139
/// and the message version.
149140
fn validate_version_specific_fields(

crates/ethereum/node/src/engine.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ use reth_chainspec::ChainSpec;
99
use reth_engine_primitives::{EngineTypes, EngineValidator, PayloadValidator};
1010
use reth_ethereum_payload_builder::EthereumExecutionPayloadValidator;
1111
use reth_payload_primitives::{
12-
validate_version_specific_fields, EngineApiMessageVersion, EngineObjectValidationError,
13-
NewPayloadError, PayloadOrAttributes,
12+
validate_execution_requests, validate_version_specific_fields, EngineApiMessageVersion,
13+
EngineObjectValidationError, NewPayloadError, PayloadOrAttributes,
1414
};
1515
use reth_primitives::{Block, RecoveredBlock};
1616
use std::sync::Arc;
@@ -56,6 +56,11 @@ where
5656
version: EngineApiMessageVersion,
5757
payload_or_attrs: PayloadOrAttributes<'_, Self::ExecutionData, EthPayloadAttributes>,
5858
) -> Result<(), EngineObjectValidationError> {
59+
payload_or_attrs
60+
.execution_requests()
61+
.map(|requests| validate_execution_requests(requests))
62+
.transpose()?;
63+
5964
validate_version_specific_fields(self.chain_spec(), version, payload_or_attrs)
6065
}
6166

crates/optimism/node/src/engine.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -150,19 +150,6 @@ where
150150
Types: EngineTypes<PayloadAttributes = OpPayloadAttributes, ExecutionData = OpExecutionData>,
151151
P: StateProviderFactory + Unpin + 'static,
152152
{
153-
fn validate_execution_requests(
154-
&self,
155-
requests: &alloy_eips::eip7685::Requests,
156-
) -> Result<(), EngineObjectValidationError> {
157-
// according to op spec, execution requests must be empty
158-
if !requests.is_empty() {
159-
return Err(EngineObjectValidationError::InvalidParams(
160-
"NonEmptyExecutionRequests".to_string().into(),
161-
))
162-
}
163-
Ok(())
164-
}
165-
166153
fn validate_version_specific_fields(
167154
&self,
168155
version: EngineApiMessageVersion,

crates/payload/primitives/src/payload.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{MessageValidationKind, PayloadAttributes};
22
use alloc::vec::Vec;
3-
use alloy_eips::eip4895::Withdrawal;
3+
use alloy_eips::{eip4895::Withdrawal, eip7685::Requests};
44
use alloy_primitives::B256;
55
use alloy_rpc_types_engine::ExecutionData;
66
use core::fmt::Debug;
@@ -164,3 +164,25 @@ impl ExecutionPayload for op_alloy_rpc_types_engine::OpExecutionData {
164164
self.payload.as_v1().gas_used
165165
}
166166
}
167+
168+
/// Special implementation for Ethereum types that provides additional helper methods
169+
impl<'a, Attributes> PayloadOrAttributes<'a, ExecutionData, Attributes>
170+
where
171+
Attributes: PayloadAttributes,
172+
{
173+
/// Return the execution requests from the payload, if available.
174+
///
175+
/// This will return `Some(requests)` only if:
176+
/// - The payload is an `ExecutionData` (not `PayloadAttributes`)
177+
/// - The payload has Prague payload fields
178+
/// - The Prague fields contain requests (not a hash)
179+
///
180+
/// Returns `None` in all other cases.
181+
pub fn execution_requests(&self) -> Option<&Requests> {
182+
if let Self::ExecutionPayload(payload) = self {
183+
payload.sidecar.requests()
184+
} else {
185+
None
186+
}
187+
}
188+
}

0 commit comments

Comments
 (0)