mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-01-30 01:28:21 -05:00
67 lines
2.3 KiB
Rust
67 lines
2.3 KiB
Rust
use crate::message::NewBlockMessage;
|
|
use reth_primitives::PeerId;
|
|
use std::task::{Context, Poll};
|
|
|
|
/// Abstraction over block import.
|
|
pub trait BlockImport: Send + Sync {
|
|
/// Invoked for a received `NewBlock` broadcast message from the peer.
|
|
///
|
|
/// > When a `NewBlock` announcement message is received from a peer, the client first verifies
|
|
/// > the basic header validity of the block, checking whether the proof-of-work value is valid.
|
|
///
|
|
/// This is supposed to start verification. The results are then expected to be returned via
|
|
/// [`BlockImport::poll`].
|
|
fn on_new_block(&mut self, peer_id: PeerId, incoming_block: NewBlockMessage);
|
|
|
|
/// Returns the results of a [`BlockImport::on_new_block`]
|
|
fn poll(&mut self, cx: &mut Context<'_>) -> Poll<BlockImportOutcome>;
|
|
}
|
|
|
|
/// Outcome of the [`BlockImport`]'s block handling.
|
|
pub struct BlockImportOutcome {
|
|
/// Sender of the `NewBlock` message.
|
|
pub peer: PeerId,
|
|
/// The result after validating the block
|
|
pub result: Result<BlockValidation, BlockImportError>,
|
|
}
|
|
|
|
/// Represents the successful validation of a received `NewBlock` message.
|
|
#[derive(Debug)]
|
|
pub enum BlockValidation {
|
|
/// Basic Header validity check, after which the block should be relayed to peers via a
|
|
/// `NewBlock` message
|
|
ValidHeader {
|
|
/// received block
|
|
block: NewBlockMessage,
|
|
},
|
|
/// Successfully imported: state-root matches after execution. The block should be relayed via
|
|
/// `NewBlockHashes`
|
|
ValidBlock {
|
|
/// validated block.
|
|
block: NewBlockMessage,
|
|
},
|
|
}
|
|
|
|
/// Represents the error case of a failed block import
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub enum BlockImportError {
|
|
/// Consensus error
|
|
#[error(transparent)]
|
|
Consensus(#[from] reth_interfaces::consensus::Error),
|
|
}
|
|
|
|
/// An implementation of `BlockImport` used in Proof-of-Stake consensus that does nothing.
|
|
///
|
|
/// Block propagation over devp2p is invalid in POS: [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675#devp2p)
|
|
#[derive(Debug, Default)]
|
|
#[non_exhaustive]
|
|
pub struct ProofOfStakeBlockImport;
|
|
|
|
impl BlockImport for ProofOfStakeBlockImport {
|
|
fn on_new_block(&mut self, _peer_id: PeerId, _incoming_block: NewBlockMessage) {}
|
|
|
|
fn poll(&mut self, _cx: &mut Context<'_>) -> Poll<BlockImportOutcome> {
|
|
Poll::Pending
|
|
}
|
|
}
|