mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 10:22:38 +00:00
Merge branch 'unstable' of https://github.com/sigp/lighthouse into gloas-payload-processing
This commit is contained in:
@@ -56,8 +56,7 @@ use crate::data_availability_checker::{
|
||||
};
|
||||
use crate::data_column_verification::GossipDataColumnError;
|
||||
use crate::execution_payload::{
|
||||
AllowOptimisticImport, NotifyExecutionLayer, PayloadNotifier,
|
||||
validate_execution_payload_for_gossip, validate_merge_block,
|
||||
NotifyExecutionLayer, PayloadNotifier, validate_execution_payload_for_gossip,
|
||||
};
|
||||
use crate::kzg_utils::blobs_to_data_column_sidecars;
|
||||
use crate::observed_block_producers::SeenBlock;
|
||||
@@ -80,7 +79,7 @@ use safe_arith::ArithError;
|
||||
use slot_clock::SlotClock;
|
||||
use ssz::Encode;
|
||||
use ssz_derive::{Decode, Encode};
|
||||
use state_processing::per_block_processing::{errors::IntoWithIndex, is_merge_transition_block};
|
||||
use state_processing::per_block_processing::errors::IntoWithIndex;
|
||||
use state_processing::{
|
||||
AllCaches, BlockProcessingError, BlockSignatureStrategy, ConsensusContext, SlotProcessingError,
|
||||
VerifyBlockRoot,
|
||||
@@ -99,34 +98,10 @@ use task_executor::JoinHandle;
|
||||
use tracing::{Instrument, Span, debug, debug_span, error, info_span, instrument};
|
||||
use types::{
|
||||
BeaconBlockRef, BeaconState, BeaconStateError, BlobsList, ChainSpec, DataColumnSidecarList,
|
||||
Epoch, EthSpec, ExecutionBlockHash, FullPayload, Hash256, InconsistentFork, KzgProofs,
|
||||
RelativeEpoch, SignedBeaconBlock, SignedBeaconBlockHeader, Slot, data::DataColumnSidecarError,
|
||||
Epoch, EthSpec, FullPayload, Hash256, InconsistentFork, KzgProofs, RelativeEpoch,
|
||||
SignedBeaconBlock, SignedBeaconBlockHeader, Slot, data::DataColumnSidecarError,
|
||||
};
|
||||
|
||||
pub const POS_PANDA_BANNER: &str = r#"
|
||||
,,, ,,, ,,, ,,,
|
||||
;" ^; ;' ", ;" ^; ;' ",
|
||||
; s$$$$$$$s ; ; s$$$$$$$s ;
|
||||
, ss$$$$$$$$$$s ,' ooooooooo. .oooooo. .oooooo..o , ss$$$$$$$$$$s ,'
|
||||
;s$$$$$$$$$$$$$$$ `888 `Y88. d8P' `Y8b d8P' `Y8 ;s$$$$$$$$$$$$$$$
|
||||
$$$$$$$$$$$$$$$$$$ 888 .d88'888 888Y88bo. $$$$$$$$$$$$$$$$$$
|
||||
$$$$P""Y$$$Y""W$$$$$ 888ooo88P' 888 888 `"Y8888o. $$$$P""Y$$$Y""W$$$$$
|
||||
$$$$ p"LFG"q $$$$$ 888 888 888 `"Y88b $$$$ p"LFG"q $$$$$
|
||||
$$$$ .$$$$$. $$$$ 888 `88b d88'oo .d8P $$$$ .$$$$$. $$$$
|
||||
$$DcaU$$$$$$$$$$ o888o `Y8bood8P' 8""88888P' $$DcaU$$$$$$$$$$
|
||||
"Y$$$"*"$$$Y" "Y$$$"*"$$$Y"
|
||||
"$b.$$" "$b.$$"
|
||||
|
||||
.o. . o8o . .o8
|
||||
.888. .o8 `"' .o8 "888
|
||||
.8"888. .ooooo. .o888oooooo oooo ooo .oooo. .o888oo .ooooo. .oooo888
|
||||
.8' `888. d88' `"Y8 888 `888 `88. .8' `P )88b 888 d88' `88bd88' `888
|
||||
.88ooo8888. 888 888 888 `88..8' .oP"888 888 888ooo888888 888
|
||||
.8' `888. 888 .o8 888 . 888 `888' d8( 888 888 .888 .o888 888
|
||||
o88o o8888o`Y8bod8P' "888"o888o `8' `Y888""8o "888"`Y8bod8P'`Y8bod88P"
|
||||
|
||||
"#;
|
||||
|
||||
/// Maximum block slot number. Block with slots bigger than this constant will NOT be processed.
|
||||
const MAXIMUM_BLOCK_SLOT_NUMBER: u64 = 4_294_967_296; // 2^32
|
||||
|
||||
@@ -392,13 +367,6 @@ pub enum ExecutionPayloadError {
|
||||
///
|
||||
/// The block is invalid and the peer is faulty
|
||||
InvalidPayloadTimestamp { expected: u64, found: u64 },
|
||||
/// The execution payload references an execution block that cannot trigger the merge.
|
||||
///
|
||||
/// ## Peer scoring
|
||||
///
|
||||
/// The block is invalid and the peer sent us a block that passes gossip propagation conditions,
|
||||
/// but is invalid upon further verification.
|
||||
InvalidTerminalPoWBlock { parent_hash: ExecutionBlockHash },
|
||||
/// The `TERMINAL_BLOCK_HASH` is set, but the block has not reached the
|
||||
/// `TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH`.
|
||||
///
|
||||
@@ -410,16 +378,6 @@ pub enum ExecutionPayloadError {
|
||||
activation_epoch: Epoch,
|
||||
epoch: Epoch,
|
||||
},
|
||||
/// The `TERMINAL_BLOCK_HASH` is set, but does not match the value specified by the block.
|
||||
///
|
||||
/// ## Peer scoring
|
||||
///
|
||||
/// The block is invalid and the peer sent us a block that passes gossip propagation conditions,
|
||||
/// but is invalid upon further verification.
|
||||
InvalidTerminalBlockHash {
|
||||
terminal_block_hash: ExecutionBlockHash,
|
||||
payload_parent_hash: ExecutionBlockHash,
|
||||
},
|
||||
/// The execution node is syncing but we fail the conditions for optimistic sync
|
||||
///
|
||||
/// ## Peer scoring
|
||||
@@ -444,16 +402,11 @@ impl ExecutionPayloadError {
|
||||
// This is a trivial gossip validation condition, there is no reason for an honest peer
|
||||
// to propagate a block with an invalid payload time stamp.
|
||||
ExecutionPayloadError::InvalidPayloadTimestamp { .. } => true,
|
||||
// An honest optimistic node may propagate blocks with an invalid terminal PoW block, we
|
||||
// should not penalized them.
|
||||
ExecutionPayloadError::InvalidTerminalPoWBlock { .. } => false,
|
||||
// This condition is checked *after* gossip propagation, therefore penalizing gossip
|
||||
// peers for this block would be unfair. There may be an argument to penalize RPC
|
||||
// blocks, since even an optimistic node shouldn't verify this block. We will remove the
|
||||
// penalties for all block imports to keep things simple.
|
||||
ExecutionPayloadError::InvalidActivationEpoch { .. } => false,
|
||||
// As per `Self::InvalidActivationEpoch`.
|
||||
ExecutionPayloadError::InvalidTerminalBlockHash { .. } => false,
|
||||
// Do not penalize the peer since it's not their fault that *we're* optimistic.
|
||||
ExecutionPayloadError::UnverifiedNonOptimisticCandidate => false,
|
||||
}
|
||||
@@ -537,7 +490,6 @@ impl From<ArithError> for BlockError {
|
||||
#[derive(Debug, PartialEq, Clone, Encode, Decode)]
|
||||
pub struct PayloadVerificationOutcome {
|
||||
pub payload_verification_status: PayloadVerificationStatus,
|
||||
pub is_valid_merge_transition_block: bool,
|
||||
}
|
||||
|
||||
/// Information about invalid blocks which might still be slashable despite being invalid.
|
||||
@@ -1470,27 +1422,10 @@ impl<T: BeaconChainTypes> ExecutionPendingBlock<T> {
|
||||
&parent.pre_state,
|
||||
notify_execution_layer,
|
||||
)?;
|
||||
let is_valid_merge_transition_block =
|
||||
is_merge_transition_block(&parent.pre_state, block.message().body());
|
||||
|
||||
let payload_verification_future = async move {
|
||||
let chain = payload_notifier.chain.clone();
|
||||
let block = payload_notifier.block.clone();
|
||||
|
||||
// If this block triggers the merge, check to ensure that it references valid execution
|
||||
// blocks.
|
||||
//
|
||||
// The specification defines this check inside `on_block` in the fork-choice specification,
|
||||
// however we perform the check here for two reasons:
|
||||
//
|
||||
// - There's no point in importing a block that will fail fork choice, so it's best to fail
|
||||
// early.
|
||||
// - Doing the check here means we can keep our fork-choice implementation "pure". I.e., no
|
||||
// calls to remote servers.
|
||||
if is_valid_merge_transition_block {
|
||||
validate_merge_block(&chain, block.message(), AllowOptimisticImport::Yes).await?;
|
||||
};
|
||||
|
||||
// The specification declares that this should be run *inside* `per_block_processing`,
|
||||
// however we run it here to keep `per_block_processing` pure (i.e., no calls to external
|
||||
// servers).
|
||||
@@ -1505,7 +1440,6 @@ impl<T: BeaconChainTypes> ExecutionPendingBlock<T> {
|
||||
|
||||
Ok(PayloadVerificationOutcome {
|
||||
payload_verification_status,
|
||||
is_valid_merge_transition_block,
|
||||
})
|
||||
};
|
||||
// Spawn the payload verification future as a new task, but don't wait for it to complete.
|
||||
|
||||
Reference in New Issue
Block a user