mirror of
https://github.com/sigp/lighthouse.git
synced 2026-04-18 13:28:33 +00:00
Optimize validator duties (#2243)
## Issue Addressed Closes #2052 ## Proposed Changes - Refactor the attester/proposer duties endpoints in the BN - Performance improvements - Fixes some potential inconsistencies with the dependent root fields. - Removes `http_api::beacon_proposer_cache` and just uses the one on the `BeaconChain` instead. - Move the code for the proposer/attester duties endpoints into separate files, for readability. - Refactor the `DutiesService` in the VC - Required to reduce the delay on broadcasting new blocks. - Gets rid of the `ValidatorDuty` shim struct that came about when we adopted the standard API. - Separate block/attestation duty tasks so that they don't block each other when one is slow. - In the VC, use `PublicKeyBytes` to represent validators instead of `PublicKey`. `PublicKey` is a legit crypto object whilst `PublicKeyBytes` is just a byte-array, it's much faster to clone/hash `PublicKeyBytes` and this change has had a significant impact on runtimes. - Unfortunately this has created lots of dust changes. - In the BN, store `PublicKeyBytes` in the `beacon_proposer_cache` and allow access to them. The HTTP API always sends `PublicKeyBytes` over the wire and the conversion from `PublicKey` -> `PublickeyBytes` is non-trivial, especially when queries have 100s/1000s of validators (like Pyrmont). - Add the `state_processing::state_advance` mod which dedups a lot of the "apply `n` skip slots to the state" code. - This also fixes a bug with some functions which were failing to include a state root as per [this comment](072695284f/consensus/state_processing/src/state_advance.rs (L69-L74)). I couldn't find any instance of this bug that resulted in anything more severe than keying a shuffling cache by the wrong block root. - Swap the VC block service to use `mpsc` from `tokio` instead of `futures`. This is consistent with the rest of the code base. ~~This PR *reduces* the size of the codebase 🎉~~ It *used* to reduce the size of the code base before I added more comments. ## Observations on Prymont - Proposer duties times down from peaks of 450ms to consistent <1ms. - Current epoch attester duties times down from >1s peaks to a consistent 20-30ms. - Block production down from +600ms to 100-200ms. ## Additional Info - ~~Blocked on #2241~~ - ~~Blocked on #2234~~ ## TODO - [x] ~~Refactor this into some smaller PRs?~~ Leaving this as-is for now. - [x] Address `per_slot_processing` roots. - [x] Investigate slow next epoch times. Not getting added to cache on block processing? - [x] Consider [this](072695284f/beacon_node/store/src/hot_cold_store.rs (L811-L812)) in the scenario of replacing the state roots Co-authored-by: pawan <pawandhananjay@gmail.com> Co-authored-by: Michael Sproul <michael@sigmaprime.io>
This commit is contained in:
@@ -909,10 +909,13 @@ fn attestation_that_skips_epochs() {
|
||||
per_slot_processing(&mut state, None, &harness.spec).expect("should process slot");
|
||||
}
|
||||
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
|
||||
let (attestation, subnet_id) = harness
|
||||
.get_unaggregated_attestations(
|
||||
&AttestationStrategy::AllValidators,
|
||||
&state,
|
||||
state_root,
|
||||
earlier_block.canonical_root(),
|
||||
current_slot,
|
||||
)
|
||||
|
||||
@@ -276,6 +276,7 @@ fn epoch_boundary_state_attestation_processing() {
|
||||
late_attestations.extend(harness.get_unaggregated_attestations(
|
||||
&AttestationStrategy::SomeValidators(late_validators.clone()),
|
||||
&head.beacon_state,
|
||||
head.beacon_state_root(),
|
||||
head.beacon_block_root,
|
||||
head.beacon_block.slot(),
|
||||
));
|
||||
@@ -353,9 +354,9 @@ fn delete_blocks_and_states() {
|
||||
|
||||
// Finalize an initial portion of the chain.
|
||||
let initial_slots: Vec<Slot> = (1..=unforked_blocks).map(Into::into).collect();
|
||||
let state = harness.get_current_state();
|
||||
let (state, state_root) = harness.get_current_state_and_root();
|
||||
let all_validators = harness.get_all_validators();
|
||||
harness.add_attested_blocks_at_slots(state, &initial_slots, &all_validators);
|
||||
harness.add_attested_blocks_at_slots(state, state_root, &initial_slots, &all_validators);
|
||||
|
||||
// Create a fork post-finalization.
|
||||
let two_thirds = (LOW_VALIDATOR_COUNT / 3) * 2;
|
||||
@@ -478,9 +479,9 @@ fn multi_epoch_fork_valid_blocks_test(
|
||||
// Create the initial portion of the chain
|
||||
if initial_blocks > 0 {
|
||||
let initial_slots: Vec<Slot> = (1..=initial_blocks).map(Into::into).collect();
|
||||
let state = harness.get_current_state();
|
||||
let (state, state_root) = harness.get_current_state_and_root();
|
||||
let all_validators = harness.get_all_validators();
|
||||
harness.add_attested_blocks_at_slots(state, &initial_slots, &all_validators);
|
||||
harness.add_attested_blocks_at_slots(state, state_root, &initial_slots, &all_validators);
|
||||
}
|
||||
|
||||
assert!(num_fork1_validators <= LOW_VALIDATOR_COUNT);
|
||||
@@ -759,19 +760,26 @@ fn prunes_abandoned_fork_between_two_finalized_checkpoints() {
|
||||
let adversarial_validators: Vec<usize> = (HONEST_VALIDATOR_COUNT..VALIDATOR_COUNT).collect();
|
||||
let rig = BeaconChainHarness::new(MinimalEthSpec, validators_keypairs);
|
||||
let slots_per_epoch = rig.slots_per_epoch();
|
||||
let mut state = rig.get_current_state();
|
||||
let (mut state, state_root) = rig.get_current_state_and_root();
|
||||
|
||||
let canonical_chain_slots: Vec<Slot> = (1..=rig.epoch_start_slot(1)).map(Slot::new).collect();
|
||||
let (canonical_chain_blocks_pre_finalization, _, _, new_state) =
|
||||
rig.add_attested_blocks_at_slots(state, &canonical_chain_slots, &honest_validators);
|
||||
let (canonical_chain_blocks_pre_finalization, _, _, new_state) = rig
|
||||
.add_attested_blocks_at_slots(
|
||||
state,
|
||||
state_root,
|
||||
&canonical_chain_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
state = new_state;
|
||||
let canonical_chain_slot: u64 = rig.get_current_slot().into();
|
||||
|
||||
let stray_slots: Vec<Slot> = (canonical_chain_slot + 1..rig.epoch_start_slot(2))
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let (current_state, current_state_root) = rig.get_current_state_and_root();
|
||||
let (stray_blocks, stray_states, stray_head, _) = rig.add_attested_blocks_at_slots(
|
||||
rig.get_current_state(),
|
||||
current_state,
|
||||
current_state_root,
|
||||
&stray_slots,
|
||||
&adversarial_validators,
|
||||
);
|
||||
@@ -803,8 +811,13 @@ fn prunes_abandoned_fork_between_two_finalized_checkpoints() {
|
||||
..=(canonical_chain_slot + slots_per_epoch * 5))
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let (canonical_chain_blocks_post_finalization, _, _, _) =
|
||||
rig.add_attested_blocks_at_slots(state, &finalization_slots, &honest_validators);
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (canonical_chain_blocks_post_finalization, _, _, _) = rig.add_attested_blocks_at_slots(
|
||||
state,
|
||||
state_root,
|
||||
&finalization_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
// Postcondition: New blocks got finalized
|
||||
assert_eq!(
|
||||
@@ -852,13 +865,14 @@ fn pruning_does_not_touch_abandoned_block_shared_with_canonical_chain() {
|
||||
let adversarial_validators: Vec<usize> = (HONEST_VALIDATOR_COUNT..VALIDATOR_COUNT).collect();
|
||||
let rig = BeaconChainHarness::new(MinimalEthSpec, validators_keypairs);
|
||||
let slots_per_epoch = rig.slots_per_epoch();
|
||||
let state = rig.get_current_state();
|
||||
let (state, state_root) = rig.get_current_state_and_root();
|
||||
|
||||
// Fill up 0th epoch
|
||||
let canonical_chain_slots_zeroth_epoch: Vec<Slot> =
|
||||
(1..rig.epoch_start_slot(1)).map(Slot::new).collect();
|
||||
let (_, _, _, state) = rig.add_attested_blocks_at_slots(
|
||||
let (_, _, _, mut state) = rig.add_attested_blocks_at_slots(
|
||||
state,
|
||||
state_root,
|
||||
&canonical_chain_slots_zeroth_epoch,
|
||||
&honest_validators,
|
||||
);
|
||||
@@ -868,9 +882,11 @@ fn pruning_does_not_touch_abandoned_block_shared_with_canonical_chain() {
|
||||
..=rig.epoch_start_slot(1) + 1)
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let (canonical_chain_blocks_first_epoch, _, shared_head, state) = rig
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (canonical_chain_blocks_first_epoch, _, shared_head, mut state) = rig
|
||||
.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
state_root,
|
||||
&canonical_chain_slots_first_epoch,
|
||||
&honest_validators,
|
||||
);
|
||||
@@ -880,8 +896,10 @@ fn pruning_does_not_touch_abandoned_block_shared_with_canonical_chain() {
|
||||
..=rig.epoch_start_slot(1) + 2)
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (stray_blocks, stray_states, stray_head, _) = rig.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
state_root,
|
||||
&stray_chain_slots_first_epoch,
|
||||
&adversarial_validators,
|
||||
);
|
||||
@@ -917,8 +935,13 @@ fn pruning_does_not_touch_abandoned_block_shared_with_canonical_chain() {
|
||||
..=(canonical_chain_slot + slots_per_epoch * 5))
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let (canonical_chain_blocks, _, _, _) =
|
||||
rig.add_attested_blocks_at_slots(state, &finalization_slots, &honest_validators);
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (canonical_chain_blocks, _, _, _) = rig.add_attested_blocks_at_slots(
|
||||
state,
|
||||
state_root,
|
||||
&finalization_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
// Postconditions
|
||||
assert_eq!(
|
||||
@@ -967,12 +990,16 @@ fn pruning_does_not_touch_blocks_prior_to_finalization() {
|
||||
let adversarial_validators: Vec<usize> = (HONEST_VALIDATOR_COUNT..VALIDATOR_COUNT).collect();
|
||||
let rig = BeaconChainHarness::new(MinimalEthSpec, validators_keypairs);
|
||||
let slots_per_epoch = rig.slots_per_epoch();
|
||||
let mut state = rig.get_current_state();
|
||||
let (mut state, state_root) = rig.get_current_state_and_root();
|
||||
|
||||
// Fill up 0th epoch with canonical chain blocks
|
||||
let zeroth_epoch_slots: Vec<Slot> = (1..=rig.epoch_start_slot(1)).map(Slot::new).collect();
|
||||
let (canonical_chain_blocks, _, _, new_state) =
|
||||
rig.add_attested_blocks_at_slots(state, &zeroth_epoch_slots, &honest_validators);
|
||||
let (canonical_chain_blocks, _, _, new_state) = rig.add_attested_blocks_at_slots(
|
||||
state,
|
||||
state_root,
|
||||
&zeroth_epoch_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
state = new_state;
|
||||
let canonical_chain_slot: u64 = rig.get_current_slot().into();
|
||||
|
||||
@@ -980,8 +1007,10 @@ fn pruning_does_not_touch_blocks_prior_to_finalization() {
|
||||
let first_epoch_slots: Vec<Slot> = ((rig.epoch_start_slot(1) + 1)..(rig.epoch_start_slot(2)))
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (stray_blocks, stray_states, stray_head, _) = rig.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
state_root,
|
||||
&first_epoch_slots,
|
||||
&adversarial_validators,
|
||||
);
|
||||
@@ -1011,7 +1040,9 @@ fn pruning_does_not_touch_blocks_prior_to_finalization() {
|
||||
..=(canonical_chain_slot + slots_per_epoch * 4))
|
||||
.map(Slot::new)
|
||||
.collect();
|
||||
let (_, _, _, _) = rig.add_attested_blocks_at_slots(state, &slots, &honest_validators);
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (_, _, _, _) =
|
||||
rig.add_attested_blocks_at_slots(state, state_root, &slots, &honest_validators);
|
||||
|
||||
// Postconditions
|
||||
assert_eq!(
|
||||
@@ -1048,30 +1079,42 @@ fn prunes_fork_growing_past_youngest_finalized_checkpoint() {
|
||||
let honest_validators: Vec<usize> = (0..HONEST_VALIDATOR_COUNT).collect();
|
||||
let adversarial_validators: Vec<usize> = (HONEST_VALIDATOR_COUNT..VALIDATOR_COUNT).collect();
|
||||
let rig = BeaconChainHarness::new(MinimalEthSpec, validators_keypairs);
|
||||
let state = rig.get_current_state();
|
||||
let (state, state_root) = rig.get_current_state_and_root();
|
||||
|
||||
// Fill up 0th epoch with canonical chain blocks
|
||||
let zeroth_epoch_slots: Vec<Slot> = (1..=rig.epoch_start_slot(1)).map(Slot::new).collect();
|
||||
let (canonical_blocks_zeroth_epoch, _, _, state) =
|
||||
rig.add_attested_blocks_at_slots(state, &zeroth_epoch_slots, &honest_validators);
|
||||
let (canonical_blocks_zeroth_epoch, _, _, mut state) = rig.add_attested_blocks_at_slots(
|
||||
state,
|
||||
state_root,
|
||||
&zeroth_epoch_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
// Fill up 1st epoch. Contains a fork.
|
||||
let slots_first_epoch: Vec<Slot> = (rig.epoch_start_slot(1) + 1..rig.epoch_start_slot(2))
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let (stray_blocks_first_epoch, stray_states_first_epoch, _, stray_state) = rig
|
||||
.add_attested_blocks_at_slots(state.clone(), &slots_first_epoch, &adversarial_validators);
|
||||
let (canonical_blocks_first_epoch, _, _, canonical_state) =
|
||||
rig.add_attested_blocks_at_slots(state, &slots_first_epoch, &honest_validators);
|
||||
let state_root = state.update_tree_hash_cache().unwrap();
|
||||
let (stray_blocks_first_epoch, stray_states_first_epoch, _, mut stray_state) = rig
|
||||
.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
state_root,
|
||||
&slots_first_epoch,
|
||||
&adversarial_validators,
|
||||
);
|
||||
let (canonical_blocks_first_epoch, _, _, mut canonical_state) =
|
||||
rig.add_attested_blocks_at_slots(state, state_root, &slots_first_epoch, &honest_validators);
|
||||
|
||||
// Fill up 2nd epoch. Extends both the canonical chain and the fork.
|
||||
let stray_slots_second_epoch: Vec<Slot> = (rig.epoch_start_slot(2)
|
||||
..=rig.epoch_start_slot(2) + 1)
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let stray_state_root = stray_state.update_tree_hash_cache().unwrap();
|
||||
let (stray_blocks_second_epoch, stray_states_second_epoch, stray_head, _) = rig
|
||||
.add_attested_blocks_at_slots(
|
||||
stray_state,
|
||||
stray_state_root,
|
||||
&stray_slots_second_epoch,
|
||||
&adversarial_validators,
|
||||
);
|
||||
@@ -1113,8 +1156,13 @@ fn prunes_fork_growing_past_youngest_finalized_checkpoint() {
|
||||
let canonical_slots: Vec<Slot> = (rig.epoch_start_slot(2)..=rig.epoch_start_slot(6))
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let (canonical_blocks, _, _, _) =
|
||||
rig.add_attested_blocks_at_slots(canonical_state, &canonical_slots, &honest_validators);
|
||||
let canonical_state_root = canonical_state.update_tree_hash_cache().unwrap();
|
||||
let (canonical_blocks, _, _, _) = rig.add_attested_blocks_at_slots(
|
||||
canonical_state,
|
||||
canonical_state_root,
|
||||
&canonical_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
// Postconditions
|
||||
let canonical_blocks: HashMap<Slot, SignedBeaconBlockHash> = canonical_blocks_zeroth_epoch
|
||||
@@ -1169,23 +1217,27 @@ fn prunes_skipped_slots_states() {
|
||||
let honest_validators: Vec<usize> = (0..HONEST_VALIDATOR_COUNT).collect();
|
||||
let adversarial_validators: Vec<usize> = (HONEST_VALIDATOR_COUNT..VALIDATOR_COUNT).collect();
|
||||
let rig = BeaconChainHarness::new(MinimalEthSpec, validators_keypairs);
|
||||
let state = rig.get_current_state();
|
||||
let (state, state_root) = rig.get_current_state_and_root();
|
||||
|
||||
let canonical_slots_zeroth_epoch: Vec<Slot> =
|
||||
(1..=rig.epoch_start_slot(1)).map(Into::into).collect();
|
||||
let (canonical_blocks_zeroth_epoch, _, _, canonical_state) = rig.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
&canonical_slots_zeroth_epoch,
|
||||
&honest_validators,
|
||||
);
|
||||
let (canonical_blocks_zeroth_epoch, _, _, mut canonical_state) = rig
|
||||
.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
state_root,
|
||||
&canonical_slots_zeroth_epoch,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
let skipped_slot: Slot = (rig.epoch_start_slot(1) + 1).into();
|
||||
|
||||
let stray_slots: Vec<Slot> = ((skipped_slot + 1).into()..rig.epoch_start_slot(2))
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let canonical_state_root = canonical_state.update_tree_hash_cache().unwrap();
|
||||
let (stray_blocks, stray_states, _, stray_state) = rig.add_attested_blocks_at_slots(
|
||||
canonical_state.clone(),
|
||||
canonical_state_root,
|
||||
&stray_slots,
|
||||
&adversarial_validators,
|
||||
);
|
||||
@@ -1225,8 +1277,13 @@ fn prunes_skipped_slots_states() {
|
||||
let canonical_slots: Vec<Slot> = ((skipped_slot + 1).into()..rig.epoch_start_slot(7))
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let (canonical_blocks_post_finalization, _, _, _) =
|
||||
rig.add_attested_blocks_at_slots(canonical_state, &canonical_slots, &honest_validators);
|
||||
let canonical_state_root = canonical_state.update_tree_hash_cache().unwrap();
|
||||
let (canonical_blocks_post_finalization, _, _, _) = rig.add_attested_blocks_at_slots(
|
||||
canonical_state,
|
||||
canonical_state_root,
|
||||
&canonical_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
// Postconditions
|
||||
let canonical_blocks: HashMap<Slot, SignedBeaconBlockHash> = canonical_blocks_zeroth_epoch
|
||||
@@ -1279,23 +1336,27 @@ fn finalizes_non_epoch_start_slot() {
|
||||
let honest_validators: Vec<usize> = (0..HONEST_VALIDATOR_COUNT).collect();
|
||||
let adversarial_validators: Vec<usize> = (HONEST_VALIDATOR_COUNT..VALIDATOR_COUNT).collect();
|
||||
let rig = BeaconChainHarness::new(MinimalEthSpec, validators_keypairs);
|
||||
let state = rig.get_current_state();
|
||||
let (state, state_root) = rig.get_current_state_and_root();
|
||||
|
||||
let canonical_slots_zeroth_epoch: Vec<Slot> =
|
||||
(1..rig.epoch_start_slot(1)).map(Into::into).collect();
|
||||
let (canonical_blocks_zeroth_epoch, _, _, canonical_state) = rig.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
&canonical_slots_zeroth_epoch,
|
||||
&honest_validators,
|
||||
);
|
||||
let (canonical_blocks_zeroth_epoch, _, _, mut canonical_state) = rig
|
||||
.add_attested_blocks_at_slots(
|
||||
state.clone(),
|
||||
state_root,
|
||||
&canonical_slots_zeroth_epoch,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
let skipped_slot: Slot = rig.epoch_start_slot(1).into();
|
||||
|
||||
let stray_slots: Vec<Slot> = ((skipped_slot + 1).into()..rig.epoch_start_slot(2))
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let canonical_state_root = canonical_state.update_tree_hash_cache().unwrap();
|
||||
let (stray_blocks, stray_states, _, stray_state) = rig.add_attested_blocks_at_slots(
|
||||
canonical_state.clone(),
|
||||
canonical_state_root,
|
||||
&stray_slots,
|
||||
&adversarial_validators,
|
||||
);
|
||||
@@ -1335,8 +1396,13 @@ fn finalizes_non_epoch_start_slot() {
|
||||
let canonical_slots: Vec<Slot> = ((skipped_slot + 1).into()..rig.epoch_start_slot(7))
|
||||
.map(Into::into)
|
||||
.collect();
|
||||
let (canonical_blocks_post_finalization, _, _, _) =
|
||||
rig.add_attested_blocks_at_slots(canonical_state, &canonical_slots, &honest_validators);
|
||||
let canonical_state_root = canonical_state.update_tree_hash_cache().unwrap();
|
||||
let (canonical_blocks_post_finalization, _, _, _) = rig.add_attested_blocks_at_slots(
|
||||
canonical_state,
|
||||
canonical_state_root,
|
||||
&canonical_slots,
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
// Postconditions
|
||||
let canonical_blocks: HashMap<Slot, SignedBeaconBlockHash> = canonical_blocks_zeroth_epoch
|
||||
@@ -1530,8 +1596,10 @@ fn pruning_test(
|
||||
|
||||
let start_slot = Slot::new(1);
|
||||
let divergence_slot = start_slot + num_initial_blocks;
|
||||
let (state, state_root) = harness.get_current_state_and_root();
|
||||
let (_, _, _, divergence_state) = harness.add_attested_blocks_at_slots(
|
||||
harness.get_current_state(),
|
||||
state,
|
||||
state_root,
|
||||
&slots(start_slot, num_initial_blocks)[..],
|
||||
&honest_validators,
|
||||
);
|
||||
@@ -1553,7 +1621,7 @@ fn pruning_test(
|
||||
faulty_validators,
|
||||
),
|
||||
]);
|
||||
let (_, _, _, canonical_state) = chains.remove(0);
|
||||
let (_, _, _, mut canonical_state) = chains.remove(0);
|
||||
let (stray_blocks, stray_states, _, stray_head_state) = chains.remove(0);
|
||||
|
||||
let stray_head_slot = divergence_slot + num_fork_skips + num_fork_blocks - 1;
|
||||
@@ -1577,8 +1645,10 @@ fn pruning_test(
|
||||
// Trigger finalization
|
||||
let num_finalization_blocks = 4 * E::slots_per_epoch();
|
||||
let canonical_slot = divergence_slot + num_canonical_skips + num_canonical_middle_blocks;
|
||||
let canonical_state_root = canonical_state.update_tree_hash_cache().unwrap();
|
||||
harness.add_attested_blocks_at_slots(
|
||||
canonical_state,
|
||||
canonical_state_root,
|
||||
&slots(canonical_slot, num_finalization_blocks),
|
||||
&honest_validators,
|
||||
);
|
||||
|
||||
@@ -436,23 +436,16 @@ fn attestations_with_increasing_slots() {
|
||||
AttestationStrategy::SomeValidators(vec![]),
|
||||
);
|
||||
|
||||
attestations.extend(
|
||||
harness.get_unaggregated_attestations(
|
||||
&AttestationStrategy::AllValidators,
|
||||
&harness.chain.head().expect("should get head").beacon_state,
|
||||
harness
|
||||
.chain
|
||||
.head()
|
||||
.expect("should get head")
|
||||
.beacon_block_root,
|
||||
harness
|
||||
.chain
|
||||
.head()
|
||||
.expect("should get head")
|
||||
.beacon_block
|
||||
.slot(),
|
||||
),
|
||||
);
|
||||
let head = harness.chain.head().unwrap();
|
||||
let head_state_root = head.beacon_state_root();
|
||||
|
||||
attestations.extend(harness.get_unaggregated_attestations(
|
||||
&AttestationStrategy::AllValidators,
|
||||
&head.beacon_state,
|
||||
head_state_root,
|
||||
head.beacon_block_root,
|
||||
head.beacon_block.slot(),
|
||||
));
|
||||
|
||||
harness.advance_slot();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user