From ca73fb72da36712b994ae9ae96f7f70b0c6847eb Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Mon, 13 May 2019 17:15:30 +1000 Subject: [PATCH] state_processing: get_attesting_indices --- .../get_attestation_participants.rs | 38 ------------------- .../get_attesting_indices.rs | 32 ++++++++++++++++ 2 files changed, 32 insertions(+), 38 deletions(-) delete mode 100644 eth2/state_processing/src/per_epoch_processing/get_attestation_participants.rs create mode 100644 eth2/state_processing/src/per_epoch_processing/get_attesting_indices.rs diff --git a/eth2/state_processing/src/per_epoch_processing/get_attestation_participants.rs b/eth2/state_processing/src/per_epoch_processing/get_attestation_participants.rs deleted file mode 100644 index bea772204c..0000000000 --- a/eth2/state_processing/src/per_epoch_processing/get_attestation_participants.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::common::verify_bitfield_length; -use types::*; - -/// Returns validator indices which participated in the attestation. -/// -/// Spec v0.5.1 -pub fn get_attestation_participants( - state: &BeaconState, - attestation_data: &AttestationData, - bitfield: &Bitfield, - spec: &ChainSpec, -) -> Result, BeaconStateError> { - let epoch = attestation_data.slot.epoch(spec.slots_per_epoch); - - let crosslink_committee = - state.get_crosslink_committee_for_shard(epoch, attestation_data.shard, spec)?; - - if crosslink_committee.slot != attestation_data.slot { - return Err(BeaconStateError::NoCommitteeForShard); - } - - let committee = &crosslink_committee.committee; - - if !verify_bitfield_length(&bitfield, committee.len()) { - return Err(BeaconStateError::InvalidBitfield); - } - - let mut participants = Vec::with_capacity(committee.len()); - for (i, validator_index) in committee.iter().enumerate() { - match bitfield.get(i) { - Ok(bit) if bit => participants.push(*validator_index), - _ => {} - } - } - participants.shrink_to_fit(); - - Ok(participants) -} diff --git a/eth2/state_processing/src/per_epoch_processing/get_attesting_indices.rs b/eth2/state_processing/src/per_epoch_processing/get_attesting_indices.rs new file mode 100644 index 0000000000..181aedae1b --- /dev/null +++ b/eth2/state_processing/src/per_epoch_processing/get_attesting_indices.rs @@ -0,0 +1,32 @@ +use crate::common::verify_bitfield_length; +use types::*; + +/// Returns validator indices which participated in the attestation. +/// +/// Spec v0.6.1 +pub fn get_attesting_indices_unsorted( + state: &BeaconState, + attestation_data: &AttestationData, + bitfield: &Bitfield, + spec: &ChainSpec, +) -> Result, BeaconStateError> { + let committee = state.get_crosslink_committee( + attestation_data.target_epoch, + attestation_data.shard, + spec, + )?; + + if !verify_bitfield_length(&bitfield, committee.committee.len()) { + return Err(BeaconStateError::InvalidBitfield); + } + + Ok(committee + .committee + .iter() + .enumerate() + .filter_map(|(i, validator_index)| match bitfield.get(i) { + Ok(true) => Some(*validator_index), + _ => None, + }) + .collect()) +}