mirror of
https://github.com/sigp/lighthouse.git
synced 2026-05-07 00:42:42 +00:00
Blacklist invalid block root in block verification and blacklist invalid finalized epochs in sync.
This commit is contained in:
@@ -90,6 +90,7 @@ use std::borrow::Cow;
|
|||||||
use std::fmt::Debug;
|
use std::fmt::Debug;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
use std::str::FromStr;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use store::{Error as DBError, HotStateSummary, KeyValueStore, StoreOp};
|
use store::{Error as DBError, HotStateSummary, KeyValueStore, StoreOp};
|
||||||
use strum::AsRefStr;
|
use strum::AsRefStr;
|
||||||
@@ -146,7 +147,9 @@ pub enum BlockError {
|
|||||||
///
|
///
|
||||||
/// It's unclear if this block is valid, but it cannot be processed without already knowing
|
/// It's unclear if this block is valid, but it cannot be processed without already knowing
|
||||||
/// its parent.
|
/// its parent.
|
||||||
ParentUnknown { parent_root: Hash256 },
|
ParentUnknown {
|
||||||
|
parent_root: Hash256,
|
||||||
|
},
|
||||||
/// The block slot is greater than the present slot.
|
/// The block slot is greater than the present slot.
|
||||||
///
|
///
|
||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
@@ -161,7 +164,10 @@ pub enum BlockError {
|
|||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
///
|
///
|
||||||
/// The peer has incompatible state transition logic and is faulty.
|
/// The peer has incompatible state transition logic and is faulty.
|
||||||
StateRootMismatch { block: Hash256, local: Hash256 },
|
StateRootMismatch {
|
||||||
|
block: Hash256,
|
||||||
|
local: Hash256,
|
||||||
|
},
|
||||||
/// The block was a genesis block, these blocks cannot be re-imported.
|
/// The block was a genesis block, these blocks cannot be re-imported.
|
||||||
GenesisBlock,
|
GenesisBlock,
|
||||||
/// The slot is finalized, no need to import.
|
/// The slot is finalized, no need to import.
|
||||||
@@ -180,7 +186,9 @@ pub enum BlockError {
|
|||||||
///
|
///
|
||||||
/// It's unclear if this block is valid, but it conflicts with finality and shouldn't be
|
/// It's unclear if this block is valid, but it conflicts with finality and shouldn't be
|
||||||
/// imported.
|
/// imported.
|
||||||
NotFinalizedDescendant { block_parent_root: Hash256 },
|
NotFinalizedDescendant {
|
||||||
|
block_parent_root: Hash256,
|
||||||
|
},
|
||||||
/// Block is already known and valid, no need to re-import.
|
/// Block is already known and valid, no need to re-import.
|
||||||
///
|
///
|
||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
@@ -207,7 +215,10 @@ pub enum BlockError {
|
|||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
///
|
///
|
||||||
/// The block is invalid and the peer is faulty.
|
/// The block is invalid and the peer is faulty.
|
||||||
IncorrectBlockProposer { block: u64, local_shuffling: u64 },
|
IncorrectBlockProposer {
|
||||||
|
block: u64,
|
||||||
|
local_shuffling: u64,
|
||||||
|
},
|
||||||
/// The `block.proposal_index` is not known.
|
/// The `block.proposal_index` is not known.
|
||||||
///
|
///
|
||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
@@ -225,7 +236,10 @@ pub enum BlockError {
|
|||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
///
|
///
|
||||||
/// The block is invalid and the peer is faulty.
|
/// The block is invalid and the peer is faulty.
|
||||||
BlockIsNotLaterThanParent { block_slot: Slot, parent_slot: Slot },
|
BlockIsNotLaterThanParent {
|
||||||
|
block_slot: Slot,
|
||||||
|
parent_slot: Slot,
|
||||||
|
},
|
||||||
/// At least one block in the chain segment did not have it's parent root set to the root of
|
/// At least one block in the chain segment did not have it's parent root set to the root of
|
||||||
/// the prior block.
|
/// the prior block.
|
||||||
///
|
///
|
||||||
@@ -281,7 +295,10 @@ pub enum BlockError {
|
|||||||
/// If it's actually our fault (e.g. our execution node database is corrupt) we have bigger
|
/// If it's actually our fault (e.g. our execution node database is corrupt) we have bigger
|
||||||
/// problems to worry about than losing peers, and we're doing the network a favour by
|
/// problems to worry about than losing peers, and we're doing the network a favour by
|
||||||
/// disconnecting.
|
/// disconnecting.
|
||||||
ParentExecutionPayloadInvalid { parent_root: Hash256 },
|
ParentExecutionPayloadInvalid {
|
||||||
|
parent_root: Hash256,
|
||||||
|
},
|
||||||
|
KnownInvalidExecutionPayload(Hash256),
|
||||||
/// The block is a slashable equivocation from the proposer.
|
/// The block is a slashable equivocation from the proposer.
|
||||||
///
|
///
|
||||||
/// ## Peer scoring
|
/// ## Peer scoring
|
||||||
@@ -1326,6 +1343,13 @@ impl<T: BeaconChainTypes> ExecutionPendingBlock<T> {
|
|||||||
chain: &Arc<BeaconChain<T>>,
|
chain: &Arc<BeaconChain<T>>,
|
||||||
notify_execution_layer: NotifyExecutionLayer,
|
notify_execution_layer: NotifyExecutionLayer,
|
||||||
) -> Result<Self, BlockError> {
|
) -> Result<Self, BlockError> {
|
||||||
|
if block_root
|
||||||
|
== Hash256::from_str("2db899881ed8546476d0b92c6aa9110bea9a4cd0dbeb5519eb0ea69575f1f359")
|
||||||
|
.expect("valid hash")
|
||||||
|
{
|
||||||
|
return Err(BlockError::KnownInvalidExecutionPayload(block_root));
|
||||||
|
}
|
||||||
|
|
||||||
chain
|
chain
|
||||||
.observed_slashable
|
.observed_slashable
|
||||||
.write()
|
.write()
|
||||||
|
|||||||
@@ -120,6 +120,19 @@ where
|
|||||||
.finalized_epoch
|
.finalized_epoch
|
||||||
.start_slot(T::EthSpec::slots_per_epoch());
|
.start_slot(T::EthSpec::slots_per_epoch());
|
||||||
|
|
||||||
|
// Prevent syncing from peers that had finalized an invalid chain on Holesky.
|
||||||
|
let non_finality_start_epoch = Epoch::new(115969);
|
||||||
|
let possible_finality_start_epoch = Epoch::new(116052);
|
||||||
|
if remote_info.finalized_epoch >= non_finality_start_epoch
|
||||||
|
&& remote_info.finalized_epoch <= possible_finality_start_epoch
|
||||||
|
{
|
||||||
|
if !self.failed_chains.contains(&remote_info.finalized_root) {
|
||||||
|
self.failed_chains.insert(remote_info.finalized_root);
|
||||||
|
}
|
||||||
|
network.goodbye_peer(peer_id, GoodbyeReason::IrrelevantNetwork);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// NOTE: A peer that has been re-status'd may now exist in multiple finalized chains. This
|
// NOTE: A peer that has been re-status'd may now exist in multiple finalized chains. This
|
||||||
// is OK since we since only one finalized chain at a time.
|
// is OK since we since only one finalized chain at a time.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user