diff --git a/crates/optimism/node/src/engine.rs b/crates/optimism/node/src/engine.rs index 7513fc57d4..821e86ced6 100644 --- a/crates/optimism/node/src/engine.rs +++ b/crates/optimism/node/src/engine.rs @@ -5,7 +5,7 @@ use op_alloy_rpc_types_engine::{ OpExecutionData, OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4, OpPayloadAttributes, }; -use reth_chainspec::ChainSpec; +use reth_chainspec::{EthChainSpec, Hardforks}; use reth_consensus::ConsensusError; use reth_node_api::{ payload::{ @@ -16,7 +16,6 @@ use reth_node_api::{ validate_version_specific_fields, BuiltPayload, EngineTypes, EngineValidator, NodePrimitives, PayloadValidator, }; -use reth_optimism_chainspec::OpChainSpec; use reth_optimism_consensus::isthmus; use reth_optimism_forks::{OpHardfork, OpHardforks}; use reth_optimism_payload_builder::{OpExecutionPayloadValidator, OpPayloadTypes}; @@ -71,16 +70,16 @@ where /// Validator for Optimism engine API. #[derive(Debug, Clone)] -pub struct OpEngineValidator { - inner: OpExecutionPayloadValidator, +pub struct OpEngineValidator { + inner: OpExecutionPayloadValidator, provider: P, hashed_addr_l2tol1_msg_passer: B256, phantom: PhantomData, } -impl OpEngineValidator { +impl OpEngineValidator { /// Instantiates a new validator. - pub fn new(chain_spec: Arc, provider: P) -> Self { + pub fn new(chain_spec: Arc, provider: P) -> Self { let hashed_addr_l2tol1_msg_passer = KH::hash_key(ADDRESS_L2_TO_L1_MESSAGE_PASSER); Self { inner: OpExecutionPayloadValidator::new(chain_spec), @@ -89,18 +88,24 @@ impl OpEngineValidator { phantom: PhantomData, } } +} +impl OpEngineValidator +where + Chain: OpHardforks, +{ /// Returns the chain spec used by the validator. #[inline] - fn chain_spec(&self) -> &OpChainSpec { + fn chain_spec(&self) -> &Chain { self.inner.chain_spec() } } -impl PayloadValidator for OpEngineValidator +impl PayloadValidator for OpEngineValidator where P: StateProviderFactory + Unpin + 'static, Tx: SignedTransaction + Unpin + 'static, + Chain: EthChainSpec + OpHardforks + Hardforks + 'static, { type Block = alloy_consensus::Block; type ExecutionData = OpExecutionData; @@ -145,7 +150,7 @@ where } } -impl EngineValidator for OpEngineValidator +impl EngineValidator for OpEngineValidator where Types: PayloadTypes< PayloadAttributes = OpPayloadAttributes, @@ -154,6 +159,7 @@ where >, P: StateProviderFactory + Unpin + 'static, Tx: SignedTransaction + Unpin + 'static + Send + Sync, + Chain: EthChainSpec + OpHardforks + Hardforks + 'static, { fn validate_version_specific_fields( &self, @@ -196,7 +202,7 @@ where if attributes.gas_limit.is_none() { return Err(EngineObjectValidationError::InvalidParams( "MissingGasLimitInPayloadAttributes".to_string().into(), - )) + )); } if self @@ -212,7 +218,7 @@ where if elasticity != 0 && denominator == 0 { return Err(EngineObjectValidationError::InvalidParams( "Eip1559ParamsDenominatorZero".to_string().into(), - )) + )); } } @@ -228,7 +234,7 @@ where /// Canyon activates the Shanghai EIPs, see the Canyon specs for more details: /// pub fn validate_withdrawals_presence( - chain_spec: &ChainSpec, + chain_spec: &(impl EthChainSpec + OpHardforks + Hardforks), version: EngineApiMessageVersion, message_validation_kind: MessageValidationKind, timestamp: u64, @@ -240,11 +246,11 @@ pub fn validate_withdrawals_presence( EngineApiMessageVersion::V1 => { if has_withdrawals { return Err(message_validation_kind - .to_error(VersionSpecificValidationError::WithdrawalsNotSupportedInV1)) + .to_error(VersionSpecificValidationError::WithdrawalsNotSupportedInV1)); } if is_shanghai { return Err(message_validation_kind - .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai)) + .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai)); } } EngineApiMessageVersion::V2 | @@ -253,11 +259,11 @@ pub fn validate_withdrawals_presence( EngineApiMessageVersion::V5 => { if is_shanghai && !has_withdrawals { return Err(message_validation_kind - .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai)) + .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai)); } if !is_shanghai && has_withdrawals { return Err(message_validation_kind - .to_error(VersionSpecificValidationError::HasWithdrawalsPreShanghai)) + .to_error(VersionSpecificValidationError::HasWithdrawalsPreShanghai)); } } }; @@ -272,8 +278,9 @@ mod test { use crate::engine; use alloy_primitives::{b64, Address, B256, B64}; use alloy_rpc_types_engine::PayloadAttributes; + use reth_chainspec::ChainSpec; use reth_node_builder::EngineValidator; - use reth_optimism_chainspec::BASE_SEPOLIA; + use reth_optimism_chainspec::{OpChainSpec, BASE_SEPOLIA}; use reth_provider::noop::NoopProvider; use reth_trie_common::KeccakKeyHasher; @@ -316,10 +323,10 @@ mod test { OpEngineValidator::new::(get_chainspec(), NoopProvider::default()); let attributes = get_attributes(None, 1732633199); - let result = as EngineValidator< + let result = as EngineValidator< OpEngineTypes, >>::ensure_well_formed_attributes( - &validator, EngineApiMessageVersion::V3, &attributes + &validator, EngineApiMessageVersion::V3, &attributes, ); assert!(result.is_ok()); } @@ -330,10 +337,10 @@ mod test { OpEngineValidator::new::(get_chainspec(), NoopProvider::default()); let attributes = get_attributes(None, 1732633200); - let result = as EngineValidator< + let result = as EngineValidator< OpEngineTypes, >>::ensure_well_formed_attributes( - &validator, EngineApiMessageVersion::V3, &attributes + &validator, EngineApiMessageVersion::V3, &attributes, ); assert!(matches!(result, Err(EngineObjectValidationError::InvalidParams(_)))); } @@ -344,10 +351,10 @@ mod test { OpEngineValidator::new::(get_chainspec(), NoopProvider::default()); let attributes = get_attributes(Some(b64!("0000000000000008")), 1732633200); - let result = as EngineValidator< + let result = as EngineValidator< OpEngineTypes, >>::ensure_well_formed_attributes( - &validator, EngineApiMessageVersion::V3, &attributes + &validator, EngineApiMessageVersion::V3, &attributes, ); assert!(matches!(result, Err(EngineObjectValidationError::InvalidParams(_)))); } @@ -358,10 +365,10 @@ mod test { OpEngineValidator::new::(get_chainspec(), NoopProvider::default()); let attributes = get_attributes(Some(b64!("0000000800000008")), 1732633200); - let result = as EngineValidator< + let result = as EngineValidator< OpEngineTypes, >>::ensure_well_formed_attributes( - &validator, EngineApiMessageVersion::V3, &attributes + &validator, EngineApiMessageVersion::V3, &attributes, ); assert!(result.is_ok()); } @@ -372,10 +379,10 @@ mod test { OpEngineValidator::new::(get_chainspec(), NoopProvider::default()); let attributes = get_attributes(Some(b64!("0000000000000000")), 1732633200); - let result = as EngineValidator< + let result = as EngineValidator< OpEngineTypes, >>::ensure_well_formed_attributes( - &validator, EngineApiMessageVersion::V3, &attributes + &validator, EngineApiMessageVersion::V3, &attributes, ); assert!(result.is_ok()); } diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index 50d1500066..41c66ebf47 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -409,6 +409,7 @@ where type Validator = OpEngineValidator< N::Provider, <::Primitives as NodePrimitives>::SignedTx, + ::ChainSpec, >; async fn engine_validator(&self, ctx: &AddOnsContext<'_, N>) -> eyre::Result { @@ -957,6 +958,7 @@ where type Validator = OpEngineValidator< Node::Provider, <::Primitives as NodePrimitives>::SignedTx, + ::ChainSpec, >; async fn build(self, ctx: &AddOnsContext<'_, Node>) -> eyre::Result {