Return RecoveredBlock in ensure_well_formed_payload (#14625)

This commit is contained in:
Joseph Zhao
2025-02-21 18:42:54 +08:00
committed by GitHub
parent faa55d96bf
commit 86e8a2a245
6 changed files with 39 additions and 68 deletions

View File

@ -21,7 +21,7 @@ use reth_payload_primitives::{
EngineObjectValidationError, InvalidPayloadAttributesError, NewPayloadError, PayloadAttributes, EngineObjectValidationError, InvalidPayloadAttributesError, NewPayloadError, PayloadAttributes,
PayloadOrAttributes, PayloadTypes, PayloadOrAttributes, PayloadTypes,
}; };
use reth_primitives::{NodePrimitives, SealedBlock}; use reth_primitives::{NodePrimitives, RecoveredBlock, SealedBlock};
use reth_primitives_traits::Block; use reth_primitives_traits::Block;
use serde::{de::DeserializeOwned, Serialize}; use serde::{de::DeserializeOwned, Serialize};
@ -145,7 +145,7 @@ pub trait PayloadValidator: fmt::Debug + Send + Sync + Unpin + 'static {
fn ensure_well_formed_payload( fn ensure_well_formed_payload(
&self, &self,
payload: Self::ExecutionData, payload: Self::ExecutionData,
) -> Result<SealedBlock<Self::Block>, NewPayloadError>; ) -> Result<RecoveredBlock<Self::Block>, NewPayloadError>;
} }
/// Type that validates the payloads processed by the engine. /// Type that validates the payloads processed by the engine.

View File

@ -919,7 +919,7 @@ where
let status = if self.backfill_sync_state.is_idle() { let status = if self.backfill_sync_state.is_idle() {
let mut latest_valid_hash = None; let mut latest_valid_hash = None;
let num_hash = block.num_hash(); let num_hash = block.num_hash();
match self.insert_block_without_senders(block) { match self.insert_block(block) {
Ok(status) => { Ok(status) => {
let status = match status { let status = match status {
InsertPayloadOk::Inserted(BlockStatus::Valid) => { InsertPayloadOk::Inserted(BlockStatus::Valid) => {
@ -942,7 +942,7 @@ where
} }
Err(error) => self.on_insert_block_error(error)?, Err(error) => self.on_insert_block_error(error)?,
} }
} else if let Err(error) = self.buffer_block_without_senders(block) { } else if let Err(error) = self.buffer_block(block) {
self.on_insert_block_error(error)? self.on_insert_block_error(error)?
} else { } else {
PayloadStatus::from_status(PayloadStatusEnum::Syncing) PayloadStatus::from_status(PayloadStatusEnum::Syncing)
@ -1991,19 +1991,6 @@ where
Ok(()) Ok(())
} }
/// Attempts to recover the block's senders and then buffers it.
///
/// Returns an error if sender recovery failed or inserting into the buffer failed.
fn buffer_block_without_senders(
&mut self,
block: SealedBlock<N::Block>,
) -> Result<(), InsertBlockError<N::Block>> {
match block.try_recover() {
Ok(block) => self.buffer_block(block),
Err(err) => Err(InsertBlockError::sender_recovery_error(err.into_inner())),
}
}
/// Pre-validates the block and inserts it into the buffer. /// Pre-validates the block and inserts it into the buffer.
fn buffer_block( fn buffer_block(
&mut self, &mut self,
@ -2350,16 +2337,6 @@ where
self.most_recent_cache.take_if(|cache| cache.executed_block_hash() == parent_hash) self.most_recent_cache.take_if(|cache| cache.executed_block_hash() == parent_hash)
} }
fn insert_block_without_senders(
&mut self,
block: SealedBlock<N::Block>,
) -> Result<InsertPayloadOk, InsertBlockError<N::Block>> {
match block.try_recover() {
Ok(block) => self.insert_block(block),
Err(err) => Err(InsertBlockError::sender_recovery_error(err.into_inner())),
}
}
fn insert_block( fn insert_block(
&mut self, &mut self,
block: RecoveredBlock<N::Block>, block: RecoveredBlock<N::Block>,
@ -3833,11 +3810,11 @@ mod tests {
let s = include_str!("../../test-data/holesky/2.rlp"); let s = include_str!("../../test-data/holesky/2.rlp");
let data = Bytes::from_str(s).unwrap(); let data = Bytes::from_str(s).unwrap();
let block = Block::decode(&mut data.as_ref()).unwrap(); let block = Block::decode(&mut data.as_ref()).unwrap();
let sealed = block.seal_slow(); let sealed = block.seal_slow().try_recover().unwrap();
let mut test_harness = TestHarness::new(HOLESKY.clone()); let mut test_harness = TestHarness::new(HOLESKY.clone());
let outcome = test_harness.tree.insert_block_without_senders(sealed.clone()).unwrap(); let outcome = test_harness.tree.insert_block(sealed.clone()).unwrap();
assert_eq!( assert_eq!(
outcome, outcome,
InsertPayloadOk::Inserted(BlockStatus::Disconnected { InsertPayloadOk::Inserted(BlockStatus::Disconnected {

View File

@ -26,7 +26,7 @@ use reth_payload_primitives::{
EngineObjectValidationError, NewPayloadError, PayloadOrAttributes, PayloadTypes, EngineObjectValidationError, NewPayloadError, PayloadOrAttributes, PayloadTypes,
}; };
use reth_payload_validator::ExecutionPayloadValidator; use reth_payload_validator::ExecutionPayloadValidator;
use reth_primitives::{Block, NodePrimitives, SealedBlock}; use reth_primitives::{Block, NodePrimitives, RecoveredBlock, SealedBlock};
/// The types used in the default mainnet ethereum beacon consensus engine. /// The types used in the default mainnet ethereum beacon consensus engine.
#[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)] #[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)]
@ -104,8 +104,9 @@ impl PayloadValidator for EthereumEngineValidator {
fn ensure_well_formed_payload( fn ensure_well_formed_payload(
&self, &self,
payload: ExecutionData, payload: ExecutionData,
) -> Result<SealedBlock, NewPayloadError> { ) -> Result<RecoveredBlock<Self::Block>, NewPayloadError> {
Ok(self.inner.ensure_well_formed_payload(payload)?) let sealed_block = self.inner.ensure_well_formed_payload(payload)?;
sealed_block.try_recover().map_err(|e| NewPayloadError::Other(e.into()))
} }
} }

View File

@ -19,7 +19,7 @@ use reth_optimism_forks::{OpHardfork, OpHardforks};
use reth_optimism_payload_builder::{OpBuiltPayload, OpPayloadBuilderAttributes}; use reth_optimism_payload_builder::{OpBuiltPayload, OpPayloadBuilderAttributes};
use reth_optimism_primitives::{OpBlock, OpPrimitives}; use reth_optimism_primitives::{OpBlock, OpPrimitives};
use reth_payload_validator::ExecutionPayloadValidator; use reth_payload_validator::ExecutionPayloadValidator;
use reth_primitives::SealedBlock; use reth_primitives::{RecoveredBlock, SealedBlock};
use std::sync::Arc; use std::sync::Arc;
/// The types used in the optimism beacon consensus engine. /// The types used in the optimism beacon consensus engine.
@ -97,8 +97,9 @@ impl PayloadValidator for OpEngineValidator {
fn ensure_well_formed_payload( fn ensure_well_formed_payload(
&self, &self,
payload: ExecutionData, payload: ExecutionData,
) -> Result<SealedBlock<Self::Block>, NewPayloadError> { ) -> Result<RecoveredBlock<Self::Block>, NewPayloadError> {
Ok(self.inner.ensure_well_formed_payload(payload)?) let sealed_block = self.inner.ensure_well_formed_payload(payload)?;
sealed_block.try_recover().map_err(|e| NewPayloadError::Other(e.into()))
} }
} }

View File

@ -356,17 +356,13 @@ where
&self, &self,
request: BuilderBlockValidationRequestV3, request: BuilderBlockValidationRequestV3,
) -> Result<(), ValidationApiError> { ) -> Result<(), ValidationApiError> {
let block = self let block = self.payload_validator.ensure_well_formed_payload(ExecutionData {
.payload_validator
.ensure_well_formed_payload(ExecutionData {
payload: ExecutionPayload::V3(request.request.execution_payload), payload: ExecutionPayload::V3(request.request.execution_payload),
sidecar: ExecutionPayloadSidecar::v3(CancunPayloadFields { sidecar: ExecutionPayloadSidecar::v3(CancunPayloadFields {
parent_beacon_block_root: request.parent_beacon_block_root, parent_beacon_block_root: request.parent_beacon_block_root,
versioned_hashes: self.validate_blobs_bundle(request.request.blobs_bundle)?, versioned_hashes: self.validate_blobs_bundle(request.request.blobs_bundle)?,
}), }),
})? })?;
.try_recover()
.map_err(|_| ValidationApiError::InvalidTransactionSignature)?;
self.validate_message_against_block( self.validate_message_against_block(
block, block,
@ -381,15 +377,12 @@ where
&self, &self,
request: BuilderBlockValidationRequestV4, request: BuilderBlockValidationRequestV4,
) -> Result<(), ValidationApiError> { ) -> Result<(), ValidationApiError> {
let block = self let block = self.payload_validator.ensure_well_formed_payload(ExecutionData {
.payload_validator
.ensure_well_formed_payload(ExecutionData {
payload: ExecutionPayload::V3(request.request.execution_payload), payload: ExecutionPayload::V3(request.request.execution_payload),
sidecar: ExecutionPayloadSidecar::v4( sidecar: ExecutionPayloadSidecar::v4(
CancunPayloadFields { CancunPayloadFields {
parent_beacon_block_root: request.parent_beacon_block_root, parent_beacon_block_root: request.parent_beacon_block_root,
versioned_hashes: self versioned_hashes: self.validate_blobs_bundle(request.request.blobs_bundle)?,
.validate_blobs_bundle(request.request.blobs_bundle)?,
}, },
PraguePayloadFields { PraguePayloadFields {
requests: RequestsOrHash::Requests( requests: RequestsOrHash::Requests(
@ -397,9 +390,7 @@ where
), ),
}, },
), ),
})? })?;
.try_recover()
.map_err(|_| ValidationApiError::InvalidTransactionSignature)?;
self.validate_message_against_block( self.validate_message_against_block(
block, block,

View File

@ -38,7 +38,7 @@ use reth::{
}, },
network::NetworkHandle, network::NetworkHandle,
payload::ExecutionPayloadValidator, payload::ExecutionPayloadValidator,
primitives::{Block, EthPrimitives, SealedBlock, TransactionSigned}, primitives::{Block, EthPrimitives, RecoveredBlock, SealedBlock, TransactionSigned},
providers::{EthStorage, StateProviderFactory}, providers::{EthStorage, StateProviderFactory},
rpc::{eth::EthApi, types::engine::ExecutionPayload}, rpc::{eth::EthApi, types::engine::ExecutionPayload},
tasks::TaskManager, tasks::TaskManager,
@ -205,8 +205,9 @@ impl PayloadValidator for CustomEngineValidator {
fn ensure_well_formed_payload( fn ensure_well_formed_payload(
&self, &self,
payload: ExecutionData, payload: ExecutionData,
) -> Result<SealedBlock<Self::Block>, NewPayloadError> { ) -> Result<RecoveredBlock<Self::Block>, NewPayloadError> {
Ok(self.inner.ensure_well_formed_payload(payload)?) let sealed_block = self.inner.ensure_well_formed_payload(payload)?;
sealed_block.try_recover().map_err(|e| NewPayloadError::Other(e.into()))
} }
} }