Add more logging for invalid payloads (#3515)
## Issue Addressed NA ## Proposed Changes Adds more `debug` logging to help troubleshoot invalid execution payload blocks. I was doing some of this recently and found it to be challenging. With this PR we should be able to grep `Invalid execution payload` and get one-liners that will show the block, slot and details about the proposer. I also changed the log in `process_invalid_execution_payload` since it was a little misleading; the `block_root` wasn't necessary the block which had an invalid payload. ## Additional Info NA
This commit is contained in:
parent
8609cced0e
commit
1a833ecc17
@ -3678,9 +3678,8 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
|||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
debug!(
|
debug!(
|
||||||
self.log,
|
self.log,
|
||||||
"Invalid execution payload in block";
|
"Processing payload invalidation";
|
||||||
"latest_valid_ancestor" => ?op.latest_valid_ancestor(),
|
"op" => ?op,
|
||||||
"block_root" => ?op.block_root(),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Update the execution status in fork choice.
|
// Update the execution status in fork choice.
|
||||||
@ -4160,8 +4159,18 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
PayloadStatus::Invalid {
|
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!(
|
warn!(
|
||||||
self.log,
|
self.log,
|
||||||
"Fork choice update invalidated payload";
|
"Fork choice update invalidated payload";
|
||||||
@ -4192,7 +4201,17 @@ impl<T: BeaconChainTypes> BeaconChain<T> {
|
|||||||
|
|
||||||
Err(BeaconChainError::ExecutionForkChoiceUpdateInvalid { status })
|
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!(
|
warn!(
|
||||||
self.log,
|
self.log,
|
||||||
"Fork choice update invalidated payload";
|
"Fork choice update invalidated payload";
|
||||||
|
@ -23,6 +23,7 @@ use state_processing::per_block_processing::{
|
|||||||
};
|
};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use tokio::task::JoinHandle;
|
use tokio::task::JoinHandle;
|
||||||
|
use tree_hash::TreeHash;
|
||||||
use types::*;
|
use types::*;
|
||||||
|
|
||||||
pub type PreparePayloadResult<Payload> = Result<Payload, BlockProductionError>;
|
pub type PreparePayloadResult<Payload> = Result<Payload, BlockProductionError>;
|
||||||
@ -112,8 +113,22 @@ async fn notify_new_payload<'a, T: BeaconChainTypes>(
|
|||||||
Ok(PayloadVerificationStatus::Optimistic)
|
Ok(PayloadVerificationStatus::Optimistic)
|
||||||
}
|
}
|
||||||
PayloadStatus::Invalid {
|
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
|
// latest_valid_hash == 0 implies that this was the terminal block
|
||||||
// Hence, we don't need to run `BeaconChain::process_invalid_execution_payload`.
|
// Hence, we don't need to run `BeaconChain::process_invalid_execution_payload`.
|
||||||
if latest_valid_hash == ExecutionBlockHash::zero() {
|
if latest_valid_hash == ExecutionBlockHash::zero() {
|
||||||
@ -132,7 +147,21 @@ async fn notify_new_payload<'a, T: BeaconChainTypes>(
|
|||||||
|
|
||||||
Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into())
|
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
|
// 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
|
// information to indicate its parent is invalid, so no need to run
|
||||||
// `BeaconChain::process_invalid_execution_payload`.
|
// `BeaconChain::process_invalid_execution_payload`.
|
||||||
|
@ -16,7 +16,7 @@ four_byte_option_impl!(four_byte_option_usize, usize);
|
|||||||
four_byte_option_impl!(four_byte_option_checkpoint, Checkpoint);
|
four_byte_option_impl!(four_byte_option_checkpoint, Checkpoint);
|
||||||
|
|
||||||
/// Defines an operation which may invalidate the `execution_status` of some nodes.
|
/// Defines an operation which may invalidate the `execution_status` of some nodes.
|
||||||
#[derive(Clone)]
|
#[derive(Clone, Debug)]
|
||||||
pub enum InvalidationOperation {
|
pub enum InvalidationOperation {
|
||||||
/// Invalidate only `block_root` and it's descendants. Don't invalidate any ancestors.
|
/// Invalidate only `block_root` and it's descendants. Don't invalidate any ancestors.
|
||||||
InvalidateOne { block_root: Hash256 },
|
InvalidateOne { block_root: Hash256 },
|
||||||
|
Loading…
Reference in New Issue
Block a user