Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Merged by Bors] - Retrospective invalidation of exec. payloads for opt. sync #2837

Closed
wants to merge 101 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
074c5eb
Add invalid propagation
paulhauner Nov 30, 2021
a75d7b8
Adjust deltas for invalid blocks
paulhauner Nov 30, 2021
5add013
Avoid invalid blocks when finding the head
paulhauner Nov 30, 2021
4a22482
Invalidate descendants of invalid blocks too
paulhauner Nov 30, 2021
bf8bc8c
Pass latest_valid_hash from API
paulhauner Dec 1, 2021
e372e06
Add invalidation of payloads
paulhauner Dec 1, 2021
0922b17
Pass root to execute_payload
paulhauner Dec 2, 2021
1fe6376
Add FixedPayloadResponse
paulhauner Dec 2, 2021
9b28389
Add non-passing invalid payload tests
paulhauner Dec 2, 2021
06eebc2
Fix failing test
paulhauner Dec 2, 2021
e32d95e
Add simple invalidation test
paulhauner Dec 2, 2021
9aad031
Fix errors after rebase
paulhauner Dec 21, 2021
1e86e22
Unify invalid payload processing
paulhauner Feb 8, 2022
d4f67a8
Tidy, improve tests
paulhauner Feb 8, 2022
c98caad
Add test for shutdown
paulhauner Feb 8, 2022
6cd0ac1
Add test for pre-finalized invalid
paulhauner Feb 8, 2022
b6453f7
Add another test
paulhauner Feb 9, 2022
a88815f
Add handling for unknown latest valid hash
paulhauner Feb 10, 2022
679b8be
Fix failing test, tidy
paulhauner Feb 10, 2022
da4a54f
Fix compile error in tests
paulhauner Feb 10, 2022
4de63cb
Update Execution API to v1.0.0-alpha.6
ethDreamer Feb 11, 2022
e56dee8
Add test, address bug
paulhauner Feb 11, 2022
353dd1f
Remove dbgs
paulhauner Feb 14, 2022
4bc0c20
Fix failing tests by null-ing best child/desc
paulhauner Feb 14, 2022
a6d9ae4
Add another test
paulhauner Feb 14, 2022
b3d033d
Address clippy lint
paulhauner Feb 14, 2022
bcd74b8
Remove panic from beacon chain
paulhauner Feb 15, 2022
f7401c6
Handle errors on newPayload
paulhauner Feb 15, 2022
a2f9fba
Clean commented out code
paulhauner Feb 15, 2022
e9ece6c
Start adding merge_sim
paulhauner Feb 15, 2022
e4cb559
Fix pattern match on exec layer
paulhauner Feb 15, 2022
717d5f1
Rename merge_sim to execution_engine_integration
paulhauner Feb 15, 2022
09d02d0
Tidy, improve testing
paulhauner Feb 15, 2022
e2a09cc
Add comments, tidy
paulhauner Feb 15, 2022
9e36525
Add to Makefile and tests
paulhauner Feb 15, 2022
8416d59
Add to github actions
paulhauner Feb 15, 2022
6756023
Merge branch 'unstable' into exec-alpha6
paulhauner Feb 15, 2022
2094c7d
Remove github actions changes
paulhauner Feb 15, 2022
b7fa258
Add exec tests to github actions again
paulhauner Feb 15, 2022
6d38c37
Use serde_json instead of json
paulhauner Feb 15, 2022
0e5d072
Switch away from binary, suppress logs
paulhauner Feb 15, 2022
51b90d8
Update Makefile for tests
paulhauner Feb 15, 2022
16d9219
Tidy
paulhauner Feb 15, 2022
b3bac84
Add `unused_port` crate
paulhauner Feb 15, 2022
26809f8
Fix warnings and compile errors
paulhauner Feb 15, 2022
3676bc5
Merge branch 'exec-alpha6' into opt-sync
paulhauner Feb 16, 2022
6eb5b2b
Unify payload status parsing
paulhauner Feb 16, 2022
246a1b6
Use `PayloadStatus` in beacon chain
paulhauner Feb 16, 2022
2145591
Fix test compile errors
paulhauner Feb 16, 2022
09f4996
Tidy comments around fork choice response
paulhauner Feb 16, 2022
5e054ba
Don't panic in drop
paulhauner Feb 16, 2022
b461bf9
Partially add invalidation call to fork choice
paulhauner Feb 16, 2022
22439c2
Simplify forkchoice update method on beacon chain
paulhauner Feb 17, 2022
dd57c31
Add invalidation to fork choice
paulhauner Feb 17, 2022
e38e819
Bump `cc` version
paulhauner Feb 17, 2022
24eb69a
Merge branch 'exec-alpha6' into opt-sync
paulhauner Feb 17, 2022
3059f22
Update geth responses
paulhauner Feb 17, 2022
5c543a0
Use windows-2019 for CI
paulhauner Feb 17, 2022
d86bbd3
Use windows-2019 for CI
paulhauner Feb 17, 2022
d924c3d
Merge branch 'exec-alpha6' into opt-sync
paulhauner Feb 17, 2022
bbdec5c
Skip windows tests for exec payload tests
paulhauner Feb 17, 2022
903d03e
Update fork choice response
paulhauner Feb 17, 2022
ae1d54e
Handle payload import whilst syncing in tests
paulhauner Feb 17, 2022
24e1d5d
Log crit when a payload id can't be generated
paulhauner Feb 17, 2022
1b76147
Remove unused field
paulhauner Feb 17, 2022
0dce21f
Merge branch 'exec-alpha6' into opt-sync
paulhauner Feb 17, 2022
d54aa7d
Fix the mock EL FC response
paulhauner Feb 17, 2022
41b6ff5
Merge branch 'unstable' into opt-sync
paulhauner Feb 18, 2022
b8964c1
Update comment
paulhauner Feb 20, 2022
3730ba2
Merge branch 'unstable' into opt-sync
paulhauner Feb 20, 2022
3bdf1cc
Tidy, check justified epoch
paulhauner Feb 20, 2022
eb23e17
Add ExecutionBlockHash newtype
paulhauner Feb 21, 2022
a7cd957
Fix misc test compile issues
paulhauner Feb 22, 2022
d625860
Ensure default payload exec status
paulhauner Feb 22, 2022
6dfabb0
Add mock EL to store tests
paulhauner Feb 22, 2022
0a152cf
Fix failing test
paulhauner Feb 22, 2022
be3e2e3
Un-comment release-only flag in test
paulhauner Feb 22, 2022
fe35997
Tidy, add comment
paulhauner Feb 22, 2022
031d71f
Check for finalized desc
paulhauner Feb 22, 2022
a915ce6
Avoid reading finalized block from DB
paulhauner Feb 23, 2022
0a77253
Remove todo about payload ids
paulhauner Feb 23, 2022
6366e94
Get justified root atomically
paulhauner Feb 23, 2022
70a10e1
Fix clippy lint
paulhauner Feb 23, 2022
d74b96c
Apply suggestions from code review
paulhauner Feb 25, 2022
2ae6d78
Add merge to makefile
paulhauner Feb 25, 2022
63c3ff0
Merge branch 'unstable' into opt-sync
paulhauner Feb 25, 2022
2562fb5
Merge branch 'unstable' into opt-sync
paulhauner Feb 25, 2022
1ed7431
Add just/fin block getters to fork choice
paulhauner Feb 25, 2022
43e7b59
Add execution block hashes to errors
paulhauner Feb 26, 2022
c39a1d9
Update beacon_node/beacon_chain/src/execution_payload.rs
paulhauner Feb 26, 2022
5142db0
Lower log level
paulhauner Feb 26, 2022
ae29684
Add test for just/fin block getter
paulhauner Feb 26, 2022
7eed122
Log errors whilst processing payload status
paulhauner Feb 26, 2022
8da2668
Remove unused struct
paulhauner Feb 26, 2022
c7d0c6c
Simplify best child/desc code
paulhauner Feb 26, 2022
4e3a078
Adjust weights
paulhauner Feb 26, 2022
b3be437
Add error for irrelevant descendant
paulhauner Feb 26, 2022
e9905aa
Invalidate more payloads
paulhauner Feb 26, 2022
031ab86
Update consensus/proto_array/src/proto_array.rs
paulhauner Feb 27, 2022
6dee54c
Update fork choice docs
paulhauner Feb 28, 2022
1ab1c43
Add execution_status FC tests
paulhauner Feb 27, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ PINNED_NIGHTLY ?= nightly

# List of all hard forks. This list is used to set env variables for several tests so that
# they run for different forks.
FORKS=phase0 altair
FORKS=phase0 altair merge

# Builds the Lighthouse binary in release (optimized).
#
Expand Down
317 changes: 217 additions & 100 deletions beacon_node/beacon_chain/src/beacon_chain.rs

Large diffs are not rendered by default.

21 changes: 9 additions & 12 deletions beacon_node/beacon_chain/src/block_verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ use crate::{
metrics, BeaconChain, BeaconChainError, BeaconChainTypes,
};
use eth2::types::EventKind;
use execution_layer::PayloadStatusV1Status;
use execution_layer::PayloadStatus;
use fork_choice::{ForkChoice, ForkChoiceStore, PayloadVerificationStatus};
use parking_lot::RwLockReadGuard;
use proto_array::Block as ProtoBlock;
Expand All @@ -76,9 +76,9 @@ use std::time::Duration;
use store::{Error as DBError, HotColdDB, HotStateSummary, KeyValueStore, StoreOp};
use tree_hash::TreeHash;
use types::{
BeaconBlockRef, BeaconState, BeaconStateError, ChainSpec, CloneConfig, Epoch, EthSpec, Hash256,
InconsistentFork, PublicKey, PublicKeyBytes, RelativeEpoch, SignedBeaconBlock,
SignedBeaconBlockHeader, Slot,
BeaconBlockRef, BeaconState, BeaconStateError, ChainSpec, CloneConfig, Epoch, EthSpec,
ExecutionBlockHash, Hash256, InconsistentFork, PublicKey, PublicKeyBytes, RelativeEpoch,
SignedBeaconBlock, SignedBeaconBlockHeader, Slot,
};

/// Maximum block slot number. Block with slots bigger than this constant will NOT be processed.
Expand Down Expand Up @@ -270,10 +270,7 @@ pub enum ExecutionPayloadError {
/// ## Peer scoring
///
/// The block is invalid and the peer is faulty
RejectedByExecutionEngine {
status: PayloadStatusV1Status,
latest_valid_hash: Option<Vec<Hash256>>,
},
RejectedByExecutionEngine { status: PayloadStatus },
/// The execution payload timestamp does not match the slot
///
/// ## Peer scoring
Expand All @@ -286,7 +283,7 @@ pub enum ExecutionPayloadError {
///
/// 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: Hash256 },
InvalidTerminalPoWBlock { parent_hash: ExecutionBlockHash },
/// The `TERMINAL_BLOCK_HASH` is set, but the block has not reached the
/// `TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH`.
///
Expand All @@ -305,16 +302,16 @@ pub enum ExecutionPayloadError {
/// 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: Hash256,
payload_parent_hash: Hash256,
terminal_block_hash: ExecutionBlockHash,
payload_parent_hash: ExecutionBlockHash,
},
/// The execution node failed to provide a parent block to a known block. This indicates an
/// issue with the execution node.
///
/// ## Peer scoring
///
/// The peer is not necessarily invalid.
PoWParentMissing(Hash256),
PoWParentMissing(ExecutionBlockHash),
}

impl From<execution_layer::Error> for ExecutionPayloadError {
Expand Down
18 changes: 15 additions & 3 deletions beacon_node/beacon_chain/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crate::naive_aggregation_pool::Error as NaiveAggregationError;
use crate::observed_aggregates::Error as ObservedAttestationsError;
use crate::observed_attesters::Error as ObservedAttestersError;
use crate::observed_block_producers::Error as ObservedBlockProducersError;
use execution_layer::PayloadStatusV1Status;
use execution_layer::PayloadStatus;
use futures::channel::mpsc::TrySendError;
use operation_pool::OpPoolError;
use safe_arith::ArithError;
Expand Down Expand Up @@ -139,15 +139,27 @@ pub enum BeaconChainError {
ExecutionLayerMissing,
ExecutionForkChoiceUpdateFailed(execution_layer::Error),
ExecutionForkChoiceUpdateInvalid {
status: PayloadStatusV1Status,
latest_valid_hash: Option<Vec<Hash256>>,
status: PayloadStatus,
},
BlockRewardSlotError,
BlockRewardAttestationError,
BlockRewardSyncError,
HeadMissingFromForkChoice(Hash256),
FinalizedBlockMissingFromForkChoice(Hash256),
InvalidFinalizedPayload {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we want to include the ExecutionBlockHash in this error as well as the JustifiedPayloadInvalid variant ? Should be available when each are thrown.

Copy link
Member Author

@paulhauner paulhauner Feb 26, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea, added in 1ed7431

finalized_root: Hash256,
execution_block_hash: ExecutionBlockHash,
},
InvalidFinalizedPayloadShutdownError(TrySendError<ShutdownReason>),
JustifiedPayloadInvalid {
justified_root: Hash256,
execution_block_hash: Option<ExecutionBlockHash>,
},
ForkchoiceUpdate(execution_layer::Error),
FinalizedCheckpointMismatch {
head_state: Checkpoint,
fork_choice: Hash256,
},
}

easy_from_to!(SlotProcessingError, BeaconChainError);
Expand Down
40 changes: 22 additions & 18 deletions beacon_node/beacon_chain/src/execution_payload.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use crate::{
BeaconChain, BeaconChainError, BeaconChainTypes, BlockError, BlockProductionError,
ExecutionPayloadError,
};
use execution_layer::PayloadStatusV1Status;
use execution_layer::PayloadStatus;
use fork_choice::PayloadVerificationStatus;
use proto_array::{Block as ProtoBlock, ExecutionStatus};
use slog::debug;
Expand Down Expand Up @@ -57,22 +57,26 @@ pub fn notify_new_payload<T: BeaconChainTypes>(
.block_on(|execution_layer| execution_layer.notify_new_payload(execution_payload));

match new_payload_response {
Ok((status, latest_valid_hash)) => match status {
PayloadStatusV1Status::Valid => Ok(PayloadVerificationStatus::Verified),
PayloadStatusV1Status::Syncing | PayloadStatusV1Status::Accepted => {
Ok(status) => match status {
PayloadStatus::Valid => Ok(PayloadVerificationStatus::Verified),
PayloadStatus::Syncing | PayloadStatus::Accepted => {
Ok(PayloadVerificationStatus::NotVerified)
}
PayloadStatusV1Status::Invalid
| PayloadStatusV1Status::InvalidTerminalBlock
| PayloadStatusV1Status::InvalidBlockHash => {
// TODO(bellatrix): process the invalid payload.
//
// See: https://github.com/sigp/lighthouse/pull/2837
Err(ExecutionPayloadError::RejectedByExecutionEngine {
status,
latest_valid_hash,
}
.into())
PayloadStatus::Invalid {
latest_valid_hash, ..
} => {
// This block has not yet been applied to fork choice, so the latest block that was
// imported to fork choice was the parent.
let latest_root = block.parent_root();
chain.process_invalid_execution_payload(latest_root, Some(latest_valid_hash))?;
michaelsproul marked this conversation as resolved.
Show resolved Hide resolved

Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into())
}
PayloadStatus::InvalidTerminalBlock { .. } | PayloadStatus::InvalidBlockHash { .. } => {
// Returning an error here should be sufficient to invalidate the block. We have no
// information to indicate its parent is invalid, so no need to run
// `BeaconChain::process_invalid_execution_payload`.
Err(ExecutionPayloadError::RejectedByExecutionEngine { status }.into())
}
},
Err(e) => Err(ExecutionPayloadError::RequestFailed(e).into()),
Expand All @@ -99,7 +103,7 @@ pub fn validate_merge_block<T: BeaconChainTypes>(
let block_epoch = block.slot().epoch(T::EthSpec::slots_per_epoch());
let execution_payload = block.execution_payload()?;

if spec.terminal_block_hash != Hash256::zero() {
if spec.terminal_block_hash != ExecutionBlockHash::zero() {
if block_epoch < spec.terminal_block_hash_activation_epoch {
return Err(ExecutionPayloadError::InvalidActivationEpoch {
activation_epoch: spec.terminal_block_hash_activation_epoch,
Expand Down Expand Up @@ -263,7 +267,7 @@ pub async fn prepare_execution_payload<T: BeaconChainTypes>(
.ok_or(BlockProductionError::ExecutionLayerMissing)?;

let parent_hash = if !is_merge_transition_complete(state) {
let is_terminal_block_hash_set = spec.terminal_block_hash != Hash256::zero();
let is_terminal_block_hash_set = spec.terminal_block_hash != ExecutionBlockHash::zero();
let is_activation_epoch_reached =
state.current_epoch() >= spec.terminal_block_hash_activation_epoch;

Expand Down Expand Up @@ -314,7 +318,7 @@ pub async fn prepare_execution_payload<T: BeaconChainTypes>(
parent_hash,
timestamp,
random,
finalized_block_hash.unwrap_or_else(Hash256::zero),
finalized_block_hash.unwrap_or_else(ExecutionBlockHash::zero),
proposer_index,
)
.await
Expand Down
2 changes: 1 addition & 1 deletion beacon_node/beacon_chain/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ mod validator_pubkey_cache;
pub use self::beacon_chain::{
AttestationProcessingOutcome, BeaconChain, BeaconChainTypes, BeaconStore, ChainSegmentResult,
ForkChoiceError, HeadInfo, HeadSafetyStatus, StateSkipConfig, WhenSlotSkipped,
MAXIMUM_GOSSIP_CLOCK_DISPARITY,
INVALID_JUSTIFIED_PAYLOAD_SHUTDOWN_REASON, MAXIMUM_GOSSIP_CLOCK_DISPARITY,
};
pub use self::beacon_snapshot::BeaconSnapshot;
pub use self::chain_config::ChainConfig;
Expand Down
15 changes: 13 additions & 2 deletions beacon_node/beacon_chain/src/test_utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,7 @@ where
spec: chain.spec.clone(),
chain: Arc::new(chain),
validator_keypairs,
shutdown_receiver,
shutdown_receiver: Arc::new(Mutex::new(shutdown_receiver)),
mock_execution_layer: self.mock_execution_layer,
execution_layer_runtime: self.execution_layer_runtime,
rng: make_rng(),
Expand All @@ -449,7 +449,7 @@ pub struct BeaconChainHarness<T: BeaconChainTypes> {

pub chain: Arc<BeaconChain<T>>,
pub spec: ChainSpec,
pub shutdown_receiver: Receiver<ShutdownReason>,
pub shutdown_receiver: Arc<Mutex<Receiver<ShutdownReason>>>,

pub mock_execution_layer: Option<MockExecutionLayer<T::EthSpec>>,
pub execution_layer_runtime: Option<ExecutionLayerRuntime>,
Expand Down Expand Up @@ -502,6 +502,17 @@ where
epoch.start_slot(E::slots_per_epoch()).into()
}

pub fn shutdown_reasons(&self) -> Vec<ShutdownReason> {
let mutex = self.shutdown_receiver.clone();
let mut receiver = mutex.lock();
std::iter::from_fn(move || match receiver.try_next() {
Ok(Some(s)) => Some(s),
Ok(None) => panic!("shutdown sender dropped"),
Err(_) => None,
})
.collect()
}

pub fn get_current_state(&self) -> BeaconState<E> {
self.chain.head().unwrap().beacon_state
}
Expand Down
1 change: 1 addition & 0 deletions beacon_node/beacon_chain/tests/attestation_production.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ fn produces_attestations() {
.default_spec()
.keypairs(KEYPAIRS[..].to_vec())
.fresh_ephemeral_store()
.mock_execution_layer()
.build();

let chain = &harness.chain;
Expand Down
1 change: 1 addition & 0 deletions beacon_node/beacon_chain/tests/attestation_verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ fn get_harness(validator_count: usize) -> BeaconChainHarness<EphemeralHarnessTyp
.spec(spec)
.keypairs(KEYPAIRS[0..validator_count].to_vec())
.fresh_ephemeral_store()
.mock_execution_layer()
.build();

harness.advance_slot();
Expand Down
4 changes: 4 additions & 0 deletions beacon_node/beacon_chain/tests/block_verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ fn get_harness(validator_count: usize) -> BeaconChainHarness<EphemeralHarnessTyp
.default_spec()
.keypairs(KEYPAIRS[0..validator_count].to_vec())
.fresh_ephemeral_store()
.mock_execution_layer()
.build();

harness.advance_slot();
Expand Down Expand Up @@ -839,6 +840,7 @@ fn verify_block_for_gossip_slashing_detection() {
.keypairs(KEYPAIRS.to_vec())
.fresh_ephemeral_store()
.initial_mutator(Box::new(move |builder| builder.slasher(inner_slasher)))
.mock_execution_layer()
.build();
harness.advance_slot();

Expand Down Expand Up @@ -918,6 +920,7 @@ fn add_base_block_to_altair_chain() {
.spec(spec)
.keypairs(KEYPAIRS[..].to_vec())
.fresh_ephemeral_store()
.mock_execution_layer()
.build();

// Move out of the genesis slot.
Expand Down Expand Up @@ -1036,6 +1039,7 @@ fn add_altair_block_to_base_chain() {
.spec(spec)
.keypairs(KEYPAIRS[..].to_vec())
.fresh_ephemeral_store()
.mock_execution_layer()
.build();

// Move out of the genesis slot.
Expand Down
1 change: 1 addition & 0 deletions beacon_node/beacon_chain/tests/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ mod attestation_verification;
mod block_verification;
mod merge;
mod op_verification;
mod payload_invalidation;
mod store_tests;
mod sync_committee_verification;
mod tests;
4 changes: 2 additions & 2 deletions beacon_node/beacon_chain/tests/merge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ fn verify_execution_payload_chain<T: EthSpec>(chain: &[ExecutionPayload<T>]) {

for ep in chain {
assert!(*ep != ExecutionPayload::default());
assert!(ep.block_hash != Hash256::zero());
assert!(ep.block_hash != ExecutionBlockHash::zero());

// Check against previous `ExecutionPayload`.
if let Some(prev_ep) = prev_ep {
Expand All @@ -40,7 +40,7 @@ fn merge_with_terminal_block_hash_override() {
spec.terminal_total_difficulty,
DEFAULT_TERMINAL_BLOCK,
0,
Hash256::zero(),
ExecutionBlockHash::zero(),
)
.unwrap()
.block_hash;
Expand Down
1 change: 1 addition & 0 deletions beacon_node/beacon_chain/tests/op_verification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ fn get_harness(store: Arc<HotColdDB>, validator_count: usize) -> TestHarness {
.default_spec()
.keypairs(KEYPAIRS[0..validator_count].to_vec())
.fresh_disk_store(store)
.mock_execution_layer()
.build();
harness.advance_slot();
harness
Expand Down
Loading