From 34a13ce240e0d803ca58e58ff64e09af4a1bf41c Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 2 May 2023 17:46:41 +0200 Subject: [PATCH] fix: dont include latest valid hash on block hash error (#2523) --- crates/consensus/beacon/src/engine/mod.rs | 14 +++++++++--- .../rpc/rpc-types/src/eth/engine/payload.rs | 22 +++++++++++++------ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/crates/consensus/beacon/src/engine/mod.rs b/crates/consensus/beacon/src/engine/mod.rs index b9a09133c3..1b31cf55a7 100644 --- a/crates/consensus/beacon/src/engine/mod.rs +++ b/crates/consensus/beacon/src/engine/mod.rs @@ -485,9 +485,17 @@ where Ok(block) => block, Err(error) => { error!(target: "consensus::engine", ?block_hash, block_number, ?error, "Invalid payload"); - let latest_valid_hash = - self.latest_valid_hash_for_invalid_payload(parent_hash, None); - return PayloadStatus::from(error).maybe_latest_valid_hash(latest_valid_hash) + + let mut latest_valid_hash = None; + if !error.is_block_hash_mismatch() { + // Engine-API rule: + // > `latestValidHash: null` if the blockHash validation has failed + latest_valid_hash = + self.latest_valid_hash_for_invalid_payload(parent_hash, None); + } + let status = PayloadStatusEnum::from(error); + + return PayloadStatus::new(status, latest_valid_hash) } }; diff --git a/crates/rpc/rpc-types/src/eth/engine/payload.rs b/crates/rpc/rpc-types/src/eth/engine/payload.rs index 9fdc948a4a..35b050f108 100644 --- a/crates/rpc/rpc-types/src/eth/engine/payload.rs +++ b/crates/rpc/rpc-types/src/eth/engine/payload.rs @@ -208,6 +208,13 @@ pub enum PayloadError { Decode(#[from] reth_rlp::DecodeError), } +impl PayloadError { + /// Returns `true` if the error is caused by invalid extra data. + pub fn is_block_hash_mismatch(&self) -> bool { + matches!(self, PayloadError::BlockHash { .. }) + } +} + /// This structure contains a body of an execution payload. /// /// See also: @@ -303,17 +310,13 @@ impl Serialize for PayloadStatus { } } -impl From for PayloadStatus { +impl From for PayloadStatusEnum { fn from(error: PayloadError) -> Self { match error { error @ PayloadError::BlockHash { .. } => { - PayloadStatus::from_status(PayloadStatusEnum::InvalidBlockHash { - validation_error: error.to_string(), - }) + PayloadStatusEnum::InvalidBlockHash { validation_error: error.to_string() } } - _ => PayloadStatus::from_status(PayloadStatusEnum::Invalid { - validation_error: error.to_string(), - }), + _ => PayloadStatusEnum::Invalid { validation_error: error.to_string() }, } } } @@ -383,6 +386,11 @@ impl PayloadStatusEnum { pub fn is_invalid(&self) -> bool { matches!(self, PayloadStatusEnum::Invalid { .. }) } + + /// Returns true if the payload status is invalid block hash. + pub fn is_invalid_block_hash(&self) -> bool { + matches!(self, PayloadStatusEnum::InvalidBlockHash { .. }) + } } /// Various validation errors