mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-22 22:34:45 +00:00
* Use `E` for `EthSpec` globally * Fix tests * Merge branch 'unstable' into e-ethspec * Merge branch 'unstable' into e-ethspec # Conflicts: # beacon_node/execution_layer/src/engine_api.rs # beacon_node/execution_layer/src/engine_api/http.rs # beacon_node/execution_layer/src/engine_api/json_structures.rs # beacon_node/execution_layer/src/test_utils/handle_rpc.rs # beacon_node/store/src/partial_beacon_state.rs # consensus/types/src/beacon_block.rs # consensus/types/src/beacon_block_body.rs # consensus/types/src/beacon_state.rs # consensus/types/src/config_and_preset.rs # consensus/types/src/execution_payload.rs # consensus/types/src/execution_payload_header.rs # consensus/types/src/light_client_optimistic_update.rs # consensus/types/src/payload.rs # lcli/src/parse_ssz.rs
33 lines
1.0 KiB
Rust
33 lines
1.0 KiB
Rust
use types::*;
|
|
|
|
/// Returns validator indices which participated in the attestation, sorted by increasing index.
|
|
pub fn get_attesting_indices<E: EthSpec>(
|
|
committee: &[usize],
|
|
bitlist: &BitList<E::MaxValidatorsPerCommittee>,
|
|
) -> Result<Vec<u64>, BeaconStateError> {
|
|
if bitlist.len() != committee.len() {
|
|
return Err(BeaconStateError::InvalidBitfield);
|
|
}
|
|
|
|
let mut indices = Vec::with_capacity(bitlist.num_set_bits());
|
|
|
|
for (i, validator_index) in committee.iter().enumerate() {
|
|
if let Ok(true) = bitlist.get(i) {
|
|
indices.push(*validator_index as u64)
|
|
}
|
|
}
|
|
|
|
indices.sort_unstable();
|
|
|
|
Ok(indices)
|
|
}
|
|
|
|
/// Shortcut for getting the attesting indices while fetching the committee from the state's cache.
|
|
pub fn get_attesting_indices_from_state<E: EthSpec>(
|
|
state: &BeaconState<E>,
|
|
att: &Attestation<E>,
|
|
) -> Result<Vec<u64>, BeaconStateError> {
|
|
let committee = state.get_beacon_committee(att.data.slot, att.data.index)?;
|
|
get_attesting_indices::<E>(committee.committee, &att.aggregation_bits)
|
|
}
|