diff --git a/beacon_node/beacon_chain/src/block_verification.rs b/beacon_node/beacon_chain/src/block_verification.rs index 0f8f03e5fd..819b3e68cc 100644 --- a/beacon_node/beacon_chain/src/block_verification.rs +++ b/beacon_node/beacon_chain/src/block_verification.rs @@ -796,6 +796,40 @@ pub struct BlockImportData { pub consensus_context: ConsensusContext, } +pub trait IntoGossipVerifiedBlock: Sized { + fn into_gossip_verified_block( + self, + chain: &BeaconChain, + ) -> Result, BlockError>; + fn inner(&self) -> Arc>; +} + +impl IntoGossipVerifiedBlock for GossipVerifiedBlock { + fn into_gossip_verified_block( + self, + _chain: &BeaconChain, + ) -> Result, BlockError> { + Ok(self) + } + + fn inner(&self) -> Arc> { + self.block.clone() + } +} + +impl IntoGossipVerifiedBlock for Arc> { + fn into_gossip_verified_block( + self, + chain: &BeaconChain, + ) -> Result, BlockError> { + GossipVerifiedBlock::new(self, chain) + } + + fn inner(&self) -> Arc> { + self.clone() + } +} + /// Implemented on types that can be converted into a `ExecutionPendingBlock`. /// /// Used to allow functions to accept blocks at various stages of verification. diff --git a/beacon_node/beacon_chain/src/lib.rs b/beacon_node/beacon_chain/src/lib.rs index 94fb8c8551..9b4519f6fe 100644 --- a/beacon_node/beacon_chain/src/lib.rs +++ b/beacon_node/beacon_chain/src/lib.rs @@ -71,7 +71,7 @@ pub use beacon_fork_choice_store::{BeaconForkChoiceStore, Error as ForkChoiceSto pub use block_verification::{ get_block_root, AvailabilityPendingExecutedBlock, BlockError, ExecutedBlock, ExecutionPayloadError, ExecutionPendingBlock, GossipVerifiedBlock, IntoExecutionPendingBlock, - PayloadVerificationOutcome, PayloadVerificationStatus, + PayloadVerificationOutcome, PayloadVerificationStatus,IntoGossipVerifiedBlock, }; pub use canonical_head::{CachedHead, CanonicalHead, CanonicalHeadRwLock}; pub use eth1_chain::{Eth1Chain, Eth1ChainBackend}; diff --git a/beacon_node/http_api/src/publish_blocks.rs b/beacon_node/http_api/src/publish_blocks.rs index 0ddd72a726..569497aadc 100644 --- a/beacon_node/http_api/src/publish_blocks.rs +++ b/beacon_node/http_api/src/publish_blocks.rs @@ -3,7 +3,7 @@ use crate::metrics; use beacon_chain::blob_verification::BlockWrapper; use beacon_chain::validator_monitor::{get_block_delay_ms, timestamp_now}; use beacon_chain::{ - AvailabilityProcessingStatus, BeaconChain, BeaconChainError, BeaconChainTypes, BlockError, + AvailabilityProcessingStatus, BeaconChain, BeaconChainError, BeaconChainTypes, BlockError,IntoGossipVerifiedBlock, GossipVerifiedBlock, NotifyExecutionLayer, }; use eth2::types::BroadcastValidation; @@ -13,6 +13,7 @@ use lighthouse_network::PubsubMessage; use network::NetworkMessage; use slog::{debug, error, info, warn, Logger}; use slot_clock::SlotClock; +use std::marker::PhantomData; use std::sync::Arc; use std::time::Duration; use tokio::sync::mpsc::UnboundedSender; @@ -23,28 +24,28 @@ use types::{ }; use warp::Rejection; -pub enum ProvenancedBlock { +pub enum ProvenancedBlock> { /// The payload was built using a local EE. - Local(SignedBlockContents>), + Local(B, PhantomData), /// The payload was build using a remote builder (e.g., via a mev-boost /// compatible relay). - Builder(SignedBlockContents>), + Builder(B, PhantomData), } -impl ProvenancedBlock { - pub fn local(block: SignedBlockContents) -> Self { - Self::Local(block) +impl> ProvenancedBlock { + pub fn local(block: B) -> Self { + Self::Local(block, PhantomData) } - pub fn builder(block: SignedBlockContents) -> Self { - Self::Builder(block) + pub fn builder(block: B) -> Self { + Self::Builder(block, PhantomData) } } /// Handles a request from the HTTP API for full blocks. -pub async fn publish_block( +pub async fn publish_block>( block_root: Option, - provenanced_block: ProvenancedBlock, + provenanced_block: ProvenancedBlock, chain: Arc>, network_tx: &UnboundedSender>, log: Logger, @@ -53,11 +54,11 @@ pub async fn publish_block( let seen_timestamp = timestamp_now(); let (block, blobs_opt, is_locally_built_block) = match provenanced_block { - ProvenancedBlock::Local(block_contents) => { - let (block, maybe_blobs) = block_contents.deconstruct(); + ProvenancedBlock::Local(block_contents, _) => { + let (block, maybe_blobs, ) = block_contents.deconstruct(); (Arc::new(block), maybe_blobs, true) } - ProvenancedBlock::Builder(block_contents) => { + ProvenancedBlock::Builder(block_contents, _) => { let (block, maybe_blobs) = block_contents.deconstruct(); (Arc::new(block), maybe_blobs, false) } @@ -124,8 +125,8 @@ pub async fn publish_block( let log_clone = log.clone(); /* if we can form a `GossipVerifiedBlock`, we've passed our basic gossip checks */ - let gossip_verified_block = GossipVerifiedBlock::new( - BlockWrapper::new(block.clone(), mapped_blobs), + let gossip_verified_block = + BlockWrapper::new(block.clone(), mapped_blobs).into_gossip_verified_block( &chain, ) .map_err(|e| { @@ -270,8 +271,8 @@ pub async fn publish_blinded_block( validation_level: BroadcastValidation, ) -> Result<(), Rejection> { let block_root = block.signed_block().canonical_root(); - let full_block = reconstruct_block(chain.clone(), block_root, block, log.clone()).await?; - publish_block::( + let full_block: ProvenancedBlock> = reconstruct_block(chain.clone(), block_root, block, log.clone()).await?; + publish_block::( Some(block_root), full_block, chain, @@ -290,7 +291,7 @@ pub async fn reconstruct_block( block_root: Hash256, block: SignedBlockContents>, log: Logger, -) -> Result, Rejection> { +) -> Result>, Rejection> { let full_payload_opt = if let Ok(payload_header) = block.signed_block().message().body().execution_payload() {