diff --git a/beacon_node/beacon_chain/src/beacon_chain.rs b/beacon_node/beacon_chain/src/beacon_chain.rs index e1d7a5cfc..6637b8fd5 100644 --- a/beacon_node/beacon_chain/src/beacon_chain.rs +++ b/beacon_node/beacon_chain/src/beacon_chain.rs @@ -3678,9 +3678,8 @@ impl BeaconChain { ) -> Result<(), Error> { debug!( self.log, - "Invalid execution payload in block"; - "latest_valid_ancestor" => ?op.latest_valid_ancestor(), - "block_root" => ?op.block_root(), + "Processing payload invalidation"; + "op" => ?op, ); // Update the execution status in fork choice. @@ -4160,8 +4159,18 @@ impl BeaconChain { Ok(()) } PayloadStatus::Invalid { - latest_valid_hash, .. + latest_valid_hash, + ref validation_error, } => { + debug!( + self.log, + "Invalid execution payload"; + "validation_error" => ?validation_error, + "latest_valid_hash" => ?latest_valid_hash, + "head_hash" => ?head_hash, + "head_block_root" => ?head_block_root, + "method" => "fcU", + ); warn!( self.log, "Fork choice update invalidated payload"; @@ -4192,7 +4201,17 @@ impl BeaconChain { Err(BeaconChainError::ExecutionForkChoiceUpdateInvalid { status }) } - PayloadStatus::InvalidBlockHash { .. } => { + PayloadStatus::InvalidBlockHash { + ref validation_error, + } => { + debug!( + self.log, + "Invalid execution payload block hash"; + "validation_error" => ?validation_error, + "head_hash" => ?head_hash, + "head_block_root" => ?head_block_root, + "method" => "fcU", + ); warn!( self.log, "Fork choice update invalidated payload"; diff --git a/beacon_node/beacon_chain/src/execution_payload.rs b/beacon_node/beacon_chain/src/execution_payload.rs index 7af171b79..2221d1fc7 100644 --- a/beacon_node/beacon_chain/src/execution_payload.rs +++ b/beacon_node/beacon_chain/src/execution_payload.rs @@ -23,6 +23,7 @@ use state_processing::per_block_processing::{ }; use std::sync::Arc; use tokio::task::JoinHandle; +use tree_hash::TreeHash; use types::*; pub type PreparePayloadResult = Result; @@ -112,8 +113,22 @@ async fn notify_new_payload<'a, T: BeaconChainTypes>( Ok(PayloadVerificationStatus::Optimistic) } PayloadStatus::Invalid { - latest_valid_hash, .. + latest_valid_hash, + ref validation_error, } => { + debug!( + chain.log, + "Invalid execution payload"; + "validation_error" => ?validation_error, + "latest_valid_hash" => ?latest_valid_hash, + "execution_block_hash" => ?execution_payload.execution_payload.block_hash, + "root" => ?block.tree_hash_root(), + "graffiti" => block.body().graffiti().as_utf8_lossy(), + "proposer_index" => block.proposer_index(), + "slot" => block.slot(), + "method" => "new_payload", + ); + // latest_valid_hash == 0 implies that this was the terminal block // Hence, we don't need to run `BeaconChain::process_invalid_execution_payload`. if latest_valid_hash == ExecutionBlockHash::zero() { @@ -132,7 +147,21 @@ async fn notify_new_payload<'a, T: BeaconChainTypes>( Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into()) } - PayloadStatus::InvalidBlockHash { .. } => { + PayloadStatus::InvalidBlockHash { + ref validation_error, + } => { + debug!( + chain.log, + "Invalid execution payload block hash"; + "validation_error" => ?validation_error, + "execution_block_hash" => ?execution_payload.execution_payload.block_hash, + "root" => ?block.tree_hash_root(), + "graffiti" => block.body().graffiti().as_utf8_lossy(), + "proposer_index" => block.proposer_index(), + "slot" => block.slot(), + "method" => "new_payload", + ); + // Returning an error here should be sufficient to invalidate the block. We have no // information to indicate its parent is invalid, so no need to run // `BeaconChain::process_invalid_execution_payload`. diff --git a/consensus/proto_array/src/proto_array.rs b/consensus/proto_array/src/proto_array.rs index 390eb902a..9486f0bfc 100644 --- a/consensus/proto_array/src/proto_array.rs +++ b/consensus/proto_array/src/proto_array.rs @@ -16,7 +16,7 @@ four_byte_option_impl!(four_byte_option_usize, usize); four_byte_option_impl!(four_byte_option_checkpoint, Checkpoint); /// Defines an operation which may invalidate the `execution_status` of some nodes. -#[derive(Clone)] +#[derive(Clone, Debug)] pub enum InvalidationOperation { /// Invalidate only `block_root` and it's descendants. Don't invalidate any ancestors. InvalidateOne { block_root: Hash256 },