Use hashset to filter validators ids in http_api (#5468)

* Use hashset to filter validators ids in http_api

* Update beacon_node/http_api/src/validators.rs
This commit is contained in:
0xalex88
2024-04-08 20:49:03 -07:00
committed by GitHub
parent 06eb181b42
commit 1b88d29807
2 changed files with 13 additions and 16 deletions

View File

@@ -4,7 +4,7 @@ use eth2::types::{
self as api_types, ExecutionOptimisticFinalizedResponse, ValidatorBalanceData, ValidatorData, self as api_types, ExecutionOptimisticFinalizedResponse, ValidatorBalanceData, ValidatorData,
ValidatorId, ValidatorStatus, ValidatorId, ValidatorStatus,
}; };
use std::sync::Arc; use std::{collections::HashSet, sync::Arc};
pub fn get_beacon_state_validators<T: BeaconChainTypes>( pub fn get_beacon_state_validators<T: BeaconChainTypes>(
state_id: StateId, state_id: StateId,
@@ -18,6 +18,8 @@ pub fn get_beacon_state_validators<T: BeaconChainTypes>(
|state, execution_optimistic, finalized| { |state, execution_optimistic, finalized| {
let epoch = state.current_epoch(); let epoch = state.current_epoch();
let far_future_epoch = chain.spec.far_future_epoch; let far_future_epoch = chain.spec.far_future_epoch;
let ids_filter_set: Option<HashSet<&ValidatorId>> =
query_ids.as_ref().map(HashSet::from_iter);
Ok(( Ok((
state state
@@ -27,13 +29,9 @@ pub fn get_beacon_state_validators<T: BeaconChainTypes>(
.enumerate() .enumerate()
// filter by validator id(s) if provided // filter by validator id(s) if provided
.filter(|(index, (validator, _))| { .filter(|(index, (validator, _))| {
query_ids.as_ref().map_or(true, |ids| { ids_filter_set.as_ref().map_or(true, |ids_set| {
ids.iter().any(|id| match id { ids_set.contains(&ValidatorId::PublicKey(validator.pubkey))
ValidatorId::PublicKey(pubkey) => &validator.pubkey == pubkey, || ids_set.contains(&ValidatorId::Index(*index as u64))
ValidatorId::Index(param_index) => {
*param_index == *index as u64
}
})
}) })
}) })
// filter by status(es) if provided and map the result // filter by status(es) if provided and map the result
@@ -83,6 +81,9 @@ pub fn get_beacon_state_validator_balances<T: BeaconChainTypes>(
.map_state_and_execution_optimistic_and_finalized( .map_state_and_execution_optimistic_and_finalized(
&chain, &chain,
|state, execution_optimistic, finalized| { |state, execution_optimistic, finalized| {
let ids_filter_set: Option<HashSet<&ValidatorId>> =
optional_ids.map(|f| HashSet::from_iter(f.iter()));
Ok(( Ok((
state state
.validators() .validators()
@@ -91,13 +92,9 @@ pub fn get_beacon_state_validator_balances<T: BeaconChainTypes>(
.enumerate() .enumerate()
// filter by validator id(s) if provided // filter by validator id(s) if provided
.filter(|(index, (validator, _))| { .filter(|(index, (validator, _))| {
optional_ids.map_or(true, |ids| { ids_filter_set.as_ref().map_or(true, |ids_set| {
ids.iter().any(|id| match id { ids_set.contains(&ValidatorId::PublicKey(validator.pubkey))
ValidatorId::PublicKey(pubkey) => &validator.pubkey == pubkey, || ids_set.contains(&ValidatorId::Index(*index as u64))
ValidatorId::Index(param_index) => {
*param_index == *index as u64
}
})
}) })
}) })
.map(|(index, (_, balance))| ValidatorBalanceData { .map(|(index, (_, balance))| ValidatorBalanceData {

View File

@@ -281,7 +281,7 @@ pub struct FinalityCheckpointsData {
pub finalized: Checkpoint, pub finalized: Checkpoint,
} }
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(into = "String")] #[serde(into = "String")]
#[serde(try_from = "std::borrow::Cow<str>")] #[serde(try_from = "std::borrow::Cow<str>")]
pub enum ValidatorId { pub enum ValidatorId {