-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Expand file tree
/
Copy pathengine.rs
More file actions
85 lines (76 loc) · 3.02 KB
/
engine.rs
File metadata and controls
85 lines (76 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//! Validates execution payload wrt Ethereum Execution Engine API version.
use alloy_eips::eip7685::RequestsOrHash;
use alloy_rpc_types_engine::ExecutionData;
pub use alloy_rpc_types_engine::{
ExecutionPayloadEnvelopeV2, ExecutionPayloadEnvelopeV3, ExecutionPayloadEnvelopeV4,
ExecutionPayloadV1, PayloadAttributes as EthPayloadAttributes,
};
use reth_chainspec::ChainSpec;
use reth_engine_primitives::{EngineTypes, EngineValidator, PayloadValidator};
use reth_ethereum_payload_builder::EthereumExecutionPayloadValidator;
use reth_payload_primitives::{
validate_execution_requests, validate_version_specific_fields, EngineApiMessageVersion,
EngineObjectValidationError, NewPayloadError, PayloadOrAttributes,
};
use reth_primitives::{Block, RecoveredBlock};
use std::sync::Arc;
/// Validator for the ethereum engine API.
#[derive(Debug, Clone)]
pub struct EthereumEngineValidator {
inner: EthereumExecutionPayloadValidator<ChainSpec>,
}
impl EthereumEngineValidator {
/// Instantiates a new validator.
pub const fn new(chain_spec: Arc<ChainSpec>) -> Self {
Self { inner: EthereumExecutionPayloadValidator::new(chain_spec) }
}
/// Returns the chain spec used by the validator.
#[inline]
fn chain_spec(&self) -> &ChainSpec {
self.inner.chain_spec()
}
}
impl PayloadValidator for EthereumEngineValidator {
type Block = Block;
type ExecutionData = ExecutionData;
fn ensure_well_formed_payload(
&self,
payload: ExecutionData,
) -> Result<RecoveredBlock<Self::Block>, NewPayloadError> {
let sealed_block = self.inner.ensure_well_formed_payload(payload)?;
sealed_block.try_recover().map_err(|e| NewPayloadError::Other(e.into()))
}
}
impl<Types> EngineValidator<Types> for EthereumEngineValidator
where
Types: EngineTypes<PayloadAttributes = EthPayloadAttributes, ExecutionData = ExecutionData>,
{
fn validate_version_specific_fields(
&self,
version: EngineApiMessageVersion,
payload_or_attrs: PayloadOrAttributes<'_, Self::ExecutionData, EthPayloadAttributes>,
) -> Result<(), EngineObjectValidationError> {
if let PayloadOrAttributes::ExecutionPayload(payload) = &payload_or_attrs {
if let Some(prague_fields) = payload.sidecar.prague() {
if let RequestsOrHash::Requests(requests) = &prague_fields.requests {
validate_execution_requests(requests)?;
}
}
}
// Validate base fields using the existing function
validate_version_specific_fields(self.chain_spec(), version, payload_or_attrs)
}
fn ensure_well_formed_attributes(
&self,
version: EngineApiMessageVersion,
attributes: &EthPayloadAttributes,
) -> Result<(), EngineObjectValidationError> {
validate_version_specific_fields(
self.chain_spec(),
version,
PayloadOrAttributes::<Self::ExecutionData, EthPayloadAttributes>::PayloadAttributes(
attributes,
),
)
}
}