mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-10 20:22:02 +00:00
* some blob reprocessing work
* remove ForceBlockLookup
* reorder enum match arms in sync manager
* a lot more reprocessing work
* impl logic for triggerng blob lookups along with block lookups
* deal with rpc blobs in groups per block in the da checker. don't cache missing blob ids in the da checker.
* make single block lookup generic
* more work
* add delayed processing logic and combine some requests
* start fixing some compile errors
* fix compilation in main block lookup mod
* much work
* get things compiling
* parent blob lookups
* fix compile
* revert red/stevie changes
* fix up sync manager delay message logic
* add peer usefulness enum
* should remove lookup refactor
* consolidate retry error handling
* improve peer scoring during certain failures in parent lookups
* improve retry code
* drop parent lookup if either req has a peer disconnect during download
* refactor single block processed method
* processing peer refactor
* smol bugfix
* fix some todos
* fix lints
* fix lints
* fix compile in lookup tests
* fix lints
* fix lints
* fix existing block lookup tests
* renamings
* fix after merge
* cargo fmt
* compilation fix in beacon chain tests
* fix
* refactor lookup tests to work with multiple forks and response types
* make tests into macros
* wrap availability check error
* fix compile after merge
* add random blobs
* start fixing up lookup verify error handling
* some bug fixes and the start of deneb only tests
* make tests work for all forks
* track information about peer source
* error refactoring
* improve peer scoring
* fix test compilation
* make sure blobs are sent for processing after stream termination, delete copied tests
* add some tests and fix a bug
* smol bugfixes and moar tests
* add tests and fix some things
* compile after merge
* lots of refactoring
* retry on invalid block/blob
* merge unknown parent messages before current slot lookup
* get tests compiling
* penalize blob peer on invalid blobs
* Check disk on in-memory cache miss
* Update beacon_node/beacon_chain/src/data_availability_checker/overflow_lru_cache.rs
* Update beacon_node/network/src/sync/network_context.rs
Co-authored-by: Divma <26765164+divagant-martian@users.noreply.github.com>
* fix bug in matching blocks and blobs in range sync
* pr feedback
* fix conflicts
* upgrade logs from warn to crit when we receive incorrect response in range
* synced_and_connected_within_tolerance -> should_search_for_block
* remove todo
* add data gas used and update excess data gas to u64
* Fix Broken Overflow Tests
* payload verification with commitments
* fix merge conflicts
* restore payload file
* Restore payload file
* remove todo
* add max blob commitments per block
* c-kzg lib update
* Fix ef tests
* Abstract over minimal/mainnet spec in kzg crate
* Start integrating new KZG
* checkpoint sync without alignment
* checkpoint sync without alignment
* add import
* add import
* query for checkpoint state by slot rather than state root (teku doesn't serve by state root)
* query for checkpoint state by slot rather than state root (teku doesn't serve by state root)
* loosen check
* get state first and query by most recent block root
* Revert "loosen check"
This reverts commit 069d13dd63.
* get state first and query by most recent block root
* merge max blobs change
* simplify delay logic
* rename unknown parent sync message variants
* rename parameter, block_slot -> slot
* add some docs to the lookup module
* use interval instead of sleep
* drop request if blocks and blobs requests both return `None` for `Id`
* clean up `find_single_lookup` logic
* add lookup source enum
* clean up `find_single_lookup` logic
* add docs to find_single_lookup_request
* move LookupSource our of param where unnecessary
* remove unnecessary todo
* query for block by `state.latest_block_header.slot`
* fix lint
* fix merge transition ef tests
* fix test
* fix test
* fix observed blob sidecars test
* Add some metrics (#33)
* fix protocol limits for blobs by root
* Update Engine API for 1:1 Structure Method
* make beacon chain tests to fix devnet 6 changes
* get ckzg working and fix some tests
* fix remaining tests
* fix lints
* Fix KZG linking issues
* remove unused dep
* lockfile
* test fixes
* remove dbgs
* remove unwrap
* cleanup tx generator
* small fixes
* fixing fixes
* more self reivew
* more self review
* refactor genesis header initialization
* refactor mock el instantiations
* fix compile
* fix network test, make sure they run for each fork
* pr feedback
* fix last test (hopefully)
---------
Co-authored-by: Pawan Dhananjay <pawandhananjay@gmail.com>
Co-authored-by: Mark Mackey <mark@sigmaprime.io>
Co-authored-by: Divma <26765164+divagant-martian@users.noreply.github.com>
Co-authored-by: Michael Sproul <michael@sigmaprime.io>
442 lines
15 KiB
Rust
442 lines
15 KiB
Rust
use super::signature_sets::Error as SignatureSetError;
|
|
use crate::ContextError;
|
|
use merkle_proof::MerkleTreeError;
|
|
use safe_arith::ArithError;
|
|
use ssz::DecodeError;
|
|
use types::*;
|
|
|
|
/// The error returned from the `per_block_processing` function. Indicates that a block is either
|
|
/// invalid, or we were unable to determine its validity (we encountered an unexpected error).
|
|
///
|
|
/// Any of the `...Error` variants indicate that at some point during block (and block operation)
|
|
/// verification, there was an error. There is no indication as to _where_ that error happened
|
|
/// (e.g., when processing attestations instead of when processing deposits).
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum BlockProcessingError {
|
|
/// Logic error indicating that the wrong state type was provided.
|
|
IncorrectStateType,
|
|
RandaoSignatureInvalid,
|
|
BulkSignatureVerificationFailed,
|
|
StateRootMismatch,
|
|
DepositCountInvalid {
|
|
expected: usize,
|
|
found: usize,
|
|
},
|
|
HeaderInvalid {
|
|
reason: HeaderInvalid,
|
|
},
|
|
ProposerSlashingInvalid {
|
|
index: usize,
|
|
reason: ProposerSlashingInvalid,
|
|
},
|
|
AttesterSlashingInvalid {
|
|
index: usize,
|
|
reason: AttesterSlashingInvalid,
|
|
},
|
|
IndexedAttestationInvalid {
|
|
index: usize,
|
|
reason: IndexedAttestationInvalid,
|
|
},
|
|
AttestationInvalid {
|
|
index: usize,
|
|
reason: AttestationInvalid,
|
|
},
|
|
DepositInvalid {
|
|
index: usize,
|
|
reason: DepositInvalid,
|
|
},
|
|
ExitInvalid {
|
|
index: usize,
|
|
reason: ExitInvalid,
|
|
},
|
|
BlsExecutionChangeInvalid {
|
|
index: usize,
|
|
reason: BlsExecutionChangeInvalid,
|
|
},
|
|
SyncAggregateInvalid {
|
|
reason: SyncAggregateInvalid,
|
|
},
|
|
BeaconStateError(BeaconStateError),
|
|
SignatureSetError(SignatureSetError),
|
|
SszTypesError(ssz_types::Error),
|
|
SszDecodeError(DecodeError),
|
|
MerkleTreeError(MerkleTreeError),
|
|
ArithError(ArithError),
|
|
InconsistentBlockFork(InconsistentFork),
|
|
InconsistentStateFork(InconsistentFork),
|
|
ExecutionHashChainIncontiguous {
|
|
expected: ExecutionBlockHash,
|
|
found: ExecutionBlockHash,
|
|
},
|
|
ExecutionRandaoMismatch {
|
|
expected: Hash256,
|
|
found: Hash256,
|
|
},
|
|
ExecutionInvalidTimestamp {
|
|
expected: u64,
|
|
found: u64,
|
|
},
|
|
ExecutionInvalidBlobsLen {
|
|
max: usize,
|
|
actual: usize,
|
|
},
|
|
ExecutionInvalid,
|
|
ConsensusContext(ContextError),
|
|
WithdrawalsRootMismatch {
|
|
expected: Hash256,
|
|
found: Hash256,
|
|
},
|
|
BlobVersionHashMismatch,
|
|
/// The number of commitments in blob transactions in the payload does not match the number
|
|
/// of commitments in the block.
|
|
BlobNumCommitmentsMismatch {
|
|
commitments_processed_in_block: usize,
|
|
/// This number depic
|
|
commitments_processed_in_transactions: usize,
|
|
},
|
|
BlobVersionHashIndexOutOfBounds {
|
|
index: usize,
|
|
length: usize,
|
|
},
|
|
WithdrawalCredentialsInvalid,
|
|
}
|
|
|
|
impl From<BeaconStateError> for BlockProcessingError {
|
|
fn from(e: BeaconStateError) -> Self {
|
|
BlockProcessingError::BeaconStateError(e)
|
|
}
|
|
}
|
|
|
|
impl From<SignatureSetError> for BlockProcessingError {
|
|
fn from(e: SignatureSetError) -> Self {
|
|
BlockProcessingError::SignatureSetError(e)
|
|
}
|
|
}
|
|
|
|
impl From<ssz_types::Error> for BlockProcessingError {
|
|
fn from(error: ssz_types::Error) -> Self {
|
|
BlockProcessingError::SszTypesError(error)
|
|
}
|
|
}
|
|
|
|
impl From<DecodeError> for BlockProcessingError {
|
|
fn from(error: DecodeError) -> Self {
|
|
BlockProcessingError::SszDecodeError(error)
|
|
}
|
|
}
|
|
|
|
impl From<ArithError> for BlockProcessingError {
|
|
fn from(e: ArithError) -> Self {
|
|
BlockProcessingError::ArithError(e)
|
|
}
|
|
}
|
|
|
|
impl From<SyncAggregateInvalid> for BlockProcessingError {
|
|
fn from(reason: SyncAggregateInvalid) -> Self {
|
|
BlockProcessingError::SyncAggregateInvalid { reason }
|
|
}
|
|
}
|
|
|
|
impl From<ContextError> for BlockProcessingError {
|
|
fn from(e: ContextError) -> Self {
|
|
BlockProcessingError::ConsensusContext(e)
|
|
}
|
|
}
|
|
|
|
impl From<BlockOperationError<HeaderInvalid>> for BlockProcessingError {
|
|
fn from(e: BlockOperationError<HeaderInvalid>) -> BlockProcessingError {
|
|
match e {
|
|
BlockOperationError::Invalid(reason) => BlockProcessingError::HeaderInvalid { reason },
|
|
BlockOperationError::BeaconStateError(e) => BlockProcessingError::BeaconStateError(e),
|
|
BlockOperationError::SignatureSetError(e) => BlockProcessingError::SignatureSetError(e),
|
|
BlockOperationError::SszTypesError(e) => BlockProcessingError::SszTypesError(e),
|
|
BlockOperationError::ConsensusContext(e) => BlockProcessingError::ConsensusContext(e),
|
|
BlockOperationError::ArithError(e) => BlockProcessingError::ArithError(e),
|
|
}
|
|
}
|
|
}
|
|
|
|
/// A conversion that consumes `self` and adds an `index` variable to resulting struct.
|
|
///
|
|
/// Used here to allow converting an error into an upstream error that points to the object that
|
|
/// caused the error. For example, pointing to the index of an attestation that caused the
|
|
/// `AttestationInvalid` error.
|
|
pub trait IntoWithIndex<T>: Sized {
|
|
fn into_with_index(self, index: usize) -> T;
|
|
}
|
|
|
|
macro_rules! impl_into_block_processing_error_with_index {
|
|
($($type: ident),*) => {
|
|
$(
|
|
impl IntoWithIndex<BlockProcessingError> for BlockOperationError<$type> {
|
|
fn into_with_index(self, index: usize) -> BlockProcessingError {
|
|
match self {
|
|
BlockOperationError::Invalid(reason) => BlockProcessingError::$type {
|
|
index,
|
|
reason
|
|
},
|
|
BlockOperationError::BeaconStateError(e) => BlockProcessingError::BeaconStateError(e),
|
|
BlockOperationError::SignatureSetError(e) => BlockProcessingError::SignatureSetError(e),
|
|
BlockOperationError::SszTypesError(e) => BlockProcessingError::SszTypesError(e),
|
|
BlockOperationError::ConsensusContext(e) => BlockProcessingError::ConsensusContext(e),
|
|
BlockOperationError::ArithError(e) => BlockProcessingError::ArithError(e),
|
|
}
|
|
}
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
impl_into_block_processing_error_with_index!(
|
|
ProposerSlashingInvalid,
|
|
AttesterSlashingInvalid,
|
|
IndexedAttestationInvalid,
|
|
AttestationInvalid,
|
|
DepositInvalid,
|
|
ExitInvalid,
|
|
BlsExecutionChangeInvalid
|
|
);
|
|
|
|
pub type HeaderValidationError = BlockOperationError<HeaderInvalid>;
|
|
pub type AttesterSlashingValidationError = BlockOperationError<AttesterSlashingInvalid>;
|
|
pub type ProposerSlashingValidationError = BlockOperationError<ProposerSlashingInvalid>;
|
|
pub type AttestationValidationError = BlockOperationError<AttestationInvalid>;
|
|
pub type SyncCommitteeMessageValidationError = BlockOperationError<SyncAggregateInvalid>;
|
|
pub type DepositValidationError = BlockOperationError<DepositInvalid>;
|
|
pub type ExitValidationError = BlockOperationError<ExitInvalid>;
|
|
pub type BlsExecutionChangeValidationError = BlockOperationError<BlsExecutionChangeInvalid>;
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum BlockOperationError<T> {
|
|
Invalid(T),
|
|
BeaconStateError(BeaconStateError),
|
|
SignatureSetError(SignatureSetError),
|
|
SszTypesError(ssz_types::Error),
|
|
ConsensusContext(ContextError),
|
|
ArithError(ArithError),
|
|
}
|
|
|
|
impl<T> BlockOperationError<T> {
|
|
pub fn invalid(reason: T) -> BlockOperationError<T> {
|
|
BlockOperationError::Invalid(reason)
|
|
}
|
|
}
|
|
|
|
impl<T> From<BeaconStateError> for BlockOperationError<T> {
|
|
fn from(e: BeaconStateError) -> Self {
|
|
BlockOperationError::BeaconStateError(e)
|
|
}
|
|
}
|
|
impl<T> From<SignatureSetError> for BlockOperationError<T> {
|
|
fn from(e: SignatureSetError) -> Self {
|
|
BlockOperationError::SignatureSetError(e)
|
|
}
|
|
}
|
|
|
|
impl<T> From<ssz_types::Error> for BlockOperationError<T> {
|
|
fn from(error: ssz_types::Error) -> Self {
|
|
BlockOperationError::SszTypesError(error)
|
|
}
|
|
}
|
|
|
|
impl<T> From<ArithError> for BlockOperationError<T> {
|
|
fn from(e: ArithError) -> Self {
|
|
BlockOperationError::ArithError(e)
|
|
}
|
|
}
|
|
|
|
impl<T> From<ContextError> for BlockOperationError<T> {
|
|
fn from(e: ContextError) -> Self {
|
|
BlockOperationError::ConsensusContext(e)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum HeaderInvalid {
|
|
ProposalSignatureInvalid,
|
|
StateSlotMismatch,
|
|
OlderThanLatestBlockHeader {
|
|
latest_block_header_slot: Slot,
|
|
block_slot: Slot,
|
|
},
|
|
ProposerIndexMismatch {
|
|
block_proposer_index: u64,
|
|
state_proposer_index: u64,
|
|
},
|
|
ParentBlockRootMismatch {
|
|
state: Hash256,
|
|
block: Hash256,
|
|
},
|
|
ProposerSlashed(u64),
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum ProposerSlashingInvalid {
|
|
/// The proposer index is not a known validator.
|
|
ProposerUnknown(u64),
|
|
/// The two proposal have different slots.
|
|
///
|
|
/// (proposal_1_slot, proposal_2_slot)
|
|
ProposalSlotMismatch(Slot, Slot),
|
|
/// The two proposals have different proposer indices.
|
|
///
|
|
/// (proposer_index_1, proposer_index_2)
|
|
ProposerIndexMismatch(u64, u64),
|
|
/// The proposals are identical and therefore not slashable.
|
|
ProposalsIdentical,
|
|
/// The specified proposer cannot be slashed because they are already slashed, or not active.
|
|
ProposerNotSlashable(u64),
|
|
/// The first proposal signature was invalid.
|
|
BadProposal1Signature,
|
|
/// The second proposal signature was invalid.
|
|
BadProposal2Signature,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum AttesterSlashingInvalid {
|
|
/// The attestations were not in conflict.
|
|
NotSlashable,
|
|
/// The first `IndexedAttestation` was invalid.
|
|
IndexedAttestation1Invalid(BlockOperationError<IndexedAttestationInvalid>),
|
|
/// The second `IndexedAttestation` was invalid.
|
|
IndexedAttestation2Invalid(BlockOperationError<IndexedAttestationInvalid>),
|
|
/// The validator index is unknown. One cannot slash one who does not exist.
|
|
UnknownValidator(u64),
|
|
/// There were no indices able to be slashed.
|
|
NoSlashableIndices,
|
|
}
|
|
|
|
/// Describes why an object is invalid.
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum AttestationInvalid {
|
|
/// Committee index exceeds number of committees in that slot.
|
|
BadCommitteeIndex,
|
|
/// Attestation included before the inclusion delay.
|
|
IncludedTooEarly {
|
|
state: Slot,
|
|
delay: u64,
|
|
attestation: Slot,
|
|
},
|
|
/// Attestation slot is too far in the past to be included in a block.
|
|
IncludedTooLate { state: Slot, attestation: Slot },
|
|
/// Attestation target epoch does not match attestation slot.
|
|
TargetEpochSlotMismatch {
|
|
target_epoch: Epoch,
|
|
slot_epoch: Epoch,
|
|
},
|
|
/// Attestation target epoch does not match the current or previous epoch.
|
|
BadTargetEpoch,
|
|
/// Attestation justified checkpoint doesn't match the state's current or previous justified
|
|
/// checkpoint.
|
|
///
|
|
/// `is_current` is `true` if the attestation was compared to the
|
|
/// `state.current_justified_checkpoint`, `false` if compared to `state.previous_justified_checkpoint`.
|
|
WrongJustifiedCheckpoint {
|
|
state: Checkpoint,
|
|
attestation: Checkpoint,
|
|
is_current: bool,
|
|
},
|
|
/// The aggregation bitfield length is not the smallest possible size to represent the committee.
|
|
BadAggregationBitfieldLength {
|
|
committee_len: usize,
|
|
bitfield_len: usize,
|
|
},
|
|
/// The attestation was not disjoint compared to already seen attestations.
|
|
NotDisjoint,
|
|
/// The validator index was unknown.
|
|
UnknownValidator(u64),
|
|
/// The attestation signature verification failed.
|
|
BadSignature,
|
|
/// The indexed attestation created from this attestation was found to be invalid.
|
|
BadIndexedAttestation(IndexedAttestationInvalid),
|
|
}
|
|
|
|
impl From<BlockOperationError<IndexedAttestationInvalid>>
|
|
for BlockOperationError<AttestationInvalid>
|
|
{
|
|
fn from(e: BlockOperationError<IndexedAttestationInvalid>) -> Self {
|
|
match e {
|
|
BlockOperationError::Invalid(e) => {
|
|
BlockOperationError::invalid(AttestationInvalid::BadIndexedAttestation(e))
|
|
}
|
|
BlockOperationError::BeaconStateError(e) => BlockOperationError::BeaconStateError(e),
|
|
BlockOperationError::SignatureSetError(e) => BlockOperationError::SignatureSetError(e),
|
|
BlockOperationError::SszTypesError(e) => BlockOperationError::SszTypesError(e),
|
|
BlockOperationError::ConsensusContext(e) => BlockOperationError::ConsensusContext(e),
|
|
BlockOperationError::ArithError(e) => BlockOperationError::ArithError(e),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum IndexedAttestationInvalid {
|
|
/// The number of indices is 0.
|
|
IndicesEmpty,
|
|
/// The validator indices were not in increasing order.
|
|
///
|
|
/// The error occurred between the given `index` and `index + 1`
|
|
BadValidatorIndicesOrdering(usize),
|
|
/// The validator index is unknown. One cannot slash one who does not exist.
|
|
UnknownValidator(u64),
|
|
/// The indexed attestation aggregate signature was not valid.
|
|
BadSignature,
|
|
/// There was an error whilst attempting to get a set of signatures. The signatures may have
|
|
/// been invalid or an internal error occurred.
|
|
SignatureSetError(SignatureSetError),
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum DepositInvalid {
|
|
/// The signature (proof-of-possession) does not match the given pubkey.
|
|
BadSignature,
|
|
/// The signature or pubkey does not represent a valid BLS point.
|
|
BadBlsBytes,
|
|
/// The specified `branch` and `index` did not form a valid proof that the deposit is included
|
|
/// in the eth1 deposit root.
|
|
BadMerkleProof,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum ExitInvalid {
|
|
/// The specified validator is not active.
|
|
NotActive(u64),
|
|
/// The specified validator is not in the state's validator registry.
|
|
ValidatorUnknown(u64),
|
|
/// The specified validator has a non-maximum exit epoch.
|
|
AlreadyExited(u64),
|
|
/// The specified validator has already initiated exit.
|
|
AlreadyInitiatedExit(u64),
|
|
/// The exit is for a future epoch.
|
|
FutureEpoch { state: Epoch, exit: Epoch },
|
|
/// The validator has not been active for long enough.
|
|
TooYoungToExit {
|
|
current_epoch: Epoch,
|
|
earliest_exit_epoch: Epoch,
|
|
},
|
|
/// The exit signature was not signed by the validator.
|
|
BadSignature,
|
|
/// There was an error whilst attempting to get a set of signatures. The signatures may have
|
|
/// been invalid or an internal error occurred.
|
|
SignatureSetError(SignatureSetError),
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum BlsExecutionChangeInvalid {
|
|
/// The specified validator is not in the state's validator registry.
|
|
ValidatorUnknown(u64),
|
|
/// Validator does not have BLS Withdrawal credentials before this change.
|
|
NonBlsWithdrawalCredentials,
|
|
/// Provided BLS pubkey does not match withdrawal credentials.
|
|
WithdrawalCredentialsMismatch,
|
|
/// The signature is invalid.
|
|
BadSignature,
|
|
}
|
|
|
|
#[derive(Debug, PartialEq, Clone)]
|
|
pub enum SyncAggregateInvalid {
|
|
/// One or more of the aggregate public keys is invalid.
|
|
PubkeyInvalid,
|
|
/// The signature is invalid.
|
|
SignatureInvalid,
|
|
}
|