fix(engine): future payload handling (#2124)

This commit is contained in:
Roman Krasiuk
2023-04-05 14:03:10 +03:00
committed by GitHub
parent cfff7b3e60
commit 9a011b4900
2 changed files with 33 additions and 10 deletions

View File

@ -193,7 +193,10 @@ where
///
/// These responses should adhere to the [Engine API Spec for
/// `engine_newPayload`](https://github.com/ethereum/execution-apis/blob/main/src/engine/paris.md#specification).
fn on_new_payload(&mut self, payload: ExecutionPayload) -> PayloadStatus {
fn on_new_payload(
&mut self,
payload: ExecutionPayload,
) -> Result<PayloadStatus, reth_interfaces::Error> {
let block_number = payload.block_number.as_u64();
let block_hash = payload.block_hash;
trace!(target: "consensus::engine", ?block_hash, block_number, "Received new payload");
@ -201,9 +204,9 @@ where
Ok(block) => block,
Err(error) => {
error!(target: "consensus::engine", ?block_hash, block_number, ?error, "Invalid payload");
return PayloadStatus::from_status(PayloadStatusEnum::InvalidBlockHash {
return Ok(PayloadStatus::from_status(PayloadStatusEnum::InvalidBlockHash {
validation_error: error.to_string(),
})
}))
}
};
@ -224,17 +227,31 @@ where
let latest_valid_hash =
matches!(error, Error::Execution(ExecutorError::BlockPreMerge { .. }))
.then_some(H256::zero());
PayloadStatus::new(
PayloadStatusEnum::Invalid { validation_error: error.to_string() },
latest_valid_hash,
)
let status = match error {
Error::Execution(ExecutorError::PendingBlockIsInFuture { .. }) => {
if let Some(ForkchoiceState { head_block_hash, .. }) =
self.forkchoice_state
{
if self
.db
.view(|tx| tx.get::<tables::HeaderNumbers>(head_block_hash))??
.is_none()
{
self.require_pipeline_run(PipelineTarget::Head);
}
}
PayloadStatusEnum::Syncing
}
error => PayloadStatusEnum::Invalid { validation_error: error.to_string() },
};
PayloadStatus::new(status, latest_valid_hash)
}
}
} else {
PayloadStatus::from_status(PayloadStatusEnum::Syncing)
};
trace!(target: "consensus::engine", ?block_hash, block_number, ?status, "Returning payload status");
status
Ok(status)
}
/// Returns the next pipeline state depending on the current value of the next action.
@ -341,7 +358,13 @@ where
}
}
BeaconEngineMessage::NewPayload { payload, tx } => {
let response = this.on_new_payload(payload);
let response = match this.on_new_payload(payload) {
Ok(response) => response,
Err(error) => {
error!(target: "consensus::engine", ?error, "Error getting new payload response");
return Poll::Ready(Err(error.into()))
}
};
let _ = tx.send(Ok(response));
}
}

View File

@ -48,7 +48,7 @@ pub enum Error {
block_number: BlockNumber,
last_finalized: BlockNumber,
},
#[error("Can't insert block #{block_number} {block_hash} to far in future, as last finalized block number is {last_finalized}")]
#[error("Block #{block_number} ({block_hash:?}) too far into the future. Last finalized block is #{last_finalized}")]
PendingBlockIsInFuture {
block_hash: BlockHash,
block_number: BlockNumber,