mirror of
https://github.com/sigp/lighthouse.git
synced 2026-03-14 10:22:38 +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
45 lines
1.4 KiB
Rust
45 lines
1.4 KiB
Rust
//! The subnet predicate used for searching for a particular subnet.
|
|
use super::*;
|
|
use crate::types::{EnrAttestationBitfield, EnrSyncCommitteeBitfield};
|
|
use slog::trace;
|
|
use std::ops::Deref;
|
|
|
|
/// Returns the predicate for a given subnet.
|
|
pub fn subnet_predicate<E>(subnets: Vec<Subnet>, log: &slog::Logger) -> impl Fn(&Enr) -> bool + Send
|
|
where
|
|
E: EthSpec,
|
|
{
|
|
let log_clone = log.clone();
|
|
|
|
move |enr: &Enr| {
|
|
let attestation_bitfield: EnrAttestationBitfield<E> = match enr.attestation_bitfield::<E>()
|
|
{
|
|
Ok(b) => b,
|
|
Err(_e) => return false,
|
|
};
|
|
|
|
// Pre-fork/fork-boundary enrs may not contain a syncnets field.
|
|
// Don't return early here
|
|
let sync_committee_bitfield: Result<EnrSyncCommitteeBitfield<E>, _> =
|
|
enr.sync_committee_bitfield::<E>();
|
|
|
|
let predicate = subnets.iter().any(|subnet| match subnet {
|
|
Subnet::Attestation(s) => attestation_bitfield
|
|
.get(*s.deref() as usize)
|
|
.unwrap_or(false),
|
|
Subnet::SyncCommittee(s) => sync_committee_bitfield
|
|
.as_ref()
|
|
.map_or(false, |b| b.get(*s.deref() as usize).unwrap_or(false)),
|
|
});
|
|
|
|
if !predicate {
|
|
trace!(
|
|
log_clone,
|
|
"Peer found but not on any of the desired subnets";
|
|
"peer_id" => %enr.peer_id()
|
|
);
|
|
}
|
|
predicate
|
|
}
|
|
}
|