diff --git a/crates/consensus/beacon/src/engine/error.rs b/crates/consensus/beacon/src/engine/error.rs index 0ee864a757..2f0f5a60c8 100644 --- a/crates/consensus/beacon/src/engine/error.rs +++ b/crates/consensus/beacon/src/engine/error.rs @@ -1,28 +1,23 @@ use reth_miner::error::PayloadBuilderError; -use reth_rpc_types::engine::PayloadError; +use reth_rpc_types::engine::{EngineRpcError, PayloadError}; use reth_stages::PipelineError; use thiserror::Error; /// Beacon engine result. pub type BeaconEngineResult = Result; -// TODO: add conversions to codes for engine spec compliance -// one notable variant would be UnknownPayload /// The error wrapper for the beacon consensus engine. #[derive(Error, Debug)] pub enum BeaconEngineError { /// Forkchoice zero hash head received. #[error("Received zero hash as forkchoice head")] ForkchoiceEmptyHead, - /// Invalid payload attributes. - #[error("Invalid payload attributes")] - InvalidPayloadAttributes, /// Pipeline channel closed. #[error("Pipeline channel closed")] PipelineChannelClosed, - /// Unknown payload - #[error("Unknown payload")] - UnknownPayload, + /// An error covered by the engine API standard error codes. + #[error(transparent)] + EngineApi(#[from] EngineRpcError), /// Encountered a payload error. #[error(transparent)] Payload(#[from] PayloadError), diff --git a/crates/consensus/beacon/src/engine/mod.rs b/crates/consensus/beacon/src/engine/mod.rs index bc433aa7de..13dfca2780 100644 --- a/crates/consensus/beacon/src/engine/mod.rs +++ b/crates/consensus/beacon/src/engine/mod.rs @@ -10,8 +10,8 @@ use reth_interfaces::{ use reth_miner::PayloadStore; use reth_primitives::{BlockHash, BlockNumber, Header, SealedBlock, H256}; use reth_rpc_types::engine::{ - ExecutionPayload, ExecutionPayloadEnvelope, ForkchoiceUpdated, PayloadAttributes, PayloadId, - PayloadStatus, PayloadStatusEnum, + EngineRpcError, ExecutionPayload, ExecutionPayloadEnvelope, ForkchoiceUpdated, + PayloadAttributes, PayloadId, PayloadStatus, PayloadStatusEnum, }; use reth_stages::{stages::FINISH, Pipeline}; use reth_tasks::TaskSpawner; @@ -225,7 +225,7 @@ where if attrs.timestamp <= header.timestamp.into() { return Ok(ForkchoiceUpdated::new(PayloadStatus::from_status( PayloadStatusEnum::Invalid { - validation_error: BeaconEngineError::InvalidPayloadAttributes.to_string(), + validation_error: EngineRpcError::InvalidPayloadAttributes.to_string(), }, ))) } @@ -268,7 +268,7 @@ where // for now just return the output from the payload store match self.payload_store.get_execution_payload(payload_id) { Some(payload) => Ok(payload), - None => Err(BeaconEngineError::UnknownPayload), + None => Err(EngineRpcError::UnknownPayload.into()), } } @@ -457,14 +457,21 @@ where let _ = tx.send(Ok(response)); } BeaconEngineMessage::GetPayload { payload_id, tx } => { - let response = match this.on_get_payload(payload_id) { - Ok(response) => response, + match this.on_get_payload(payload_id) { + Ok(response) => { + // good response, send it back + let _ = tx.send(Ok(response)); + } + Err(BeaconEngineError::EngineApi(error)) => { + // specific error that we should report back to the client + error!(target: "consensus::engine", ?error, "Sending engine api error response"); + let _ = tx.send(Err(BeaconEngineError::EngineApi(error))); + } Err(error) => { error!(target: "consensus::engine", ?error, "Error getting get payload response"); return Poll::Ready(Err(error)) } }; - let _ = tx.send(Ok(response)); } } }