Add optimisation for epoch processing

This commit is contained in:
Paul Hauner 2019-03-10 17:49:06 +11:00
parent 9cc8e2598f
commit f27b62d410
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6
2 changed files with 24 additions and 2 deletions

View File

@ -1,5 +1,6 @@
use attester_sets::AttesterSets; use attester_sets::AttesterSets;
use errors::EpochProcessingError as Error; use errors::EpochProcessingError as Error;
use fnv::FnvHashMap;
use fnv::FnvHashSet; use fnv::FnvHashSet;
use inclusion_distance::{inclusion_distance, inclusion_slot}; use inclusion_distance::{inclusion_distance, inclusion_slot};
use integer_sqrt::IntegerSquareRoot; use integer_sqrt::IntegerSquareRoot;
@ -398,12 +399,28 @@ pub fn process_rewards_and_penalities(
} }
// Attestation inclusion // Attestation inclusion
let mut inclusion_slots: FnvHashMap<usize, (Slot, Slot)> = FnvHashMap::default();
for a in previous_epoch_attestations {
let participants =
state.get_attestation_participants(&a.data, &a.aggregation_bitfield, spec)?;
let inclusion_distance = (a.inclusion_slot - a.data.slot).as_u64();
for participant in participants {
if let Some((existing_distance, _)) = inclusion_slots.get(&participant) {
if *existing_distance <= inclusion_distance {
continue;
}
}
inclusion_slots.insert(participant, (Slot::from(inclusion_distance), a.data.slot));
}
}
for &index in &attesters.previous_epoch.indices { for &index in &attesters.previous_epoch.indices {
let inclusion_slot = inclusion_slot(state, &previous_epoch_attestations[..], index, spec)?; let (_, inclusion_slot) = inclusion_slots
.get(&index)
.ok_or_else(|| Error::InclusionSlotsInconsistent(index))?;
let proposer_index = state let proposer_index = state
.get_beacon_proposer_index(inclusion_slot, spec) .get_beacon_proposer_index(*inclusion_slot, spec)
.map_err(|_| Error::UnableToDetermineProducer)?; .map_err(|_| Error::UnableToDetermineProducer)?;
let base_reward = state.base_reward(proposer_index, base_reward_quotient, spec); let base_reward = state.base_reward(proposer_index, base_reward_quotient, spec);

View File

@ -8,6 +8,11 @@ pub enum EpochProcessingError {
NoRandaoSeed, NoRandaoSeed,
PreviousTotalBalanceIsZero, PreviousTotalBalanceIsZero,
InclusionDistanceZero, InclusionDistanceZero,
/// Unable to get the inclusion distance for a validator that should have an inclusion
/// distance. This indicates an internal inconsistency.
///
/// (validator_index)
InclusionSlotsInconsistent(usize),
BeaconStateError(BeaconStateError), BeaconStateError(BeaconStateError),
InclusionError(InclusionError), InclusionError(InclusionError),
} }