Skip to content

Commit 1fd7ead

Browse files
authored
Do not filter validators by status if filter is an empty list (#7884)
https://github.com/ethereum/beacon-APIs/blob/69d2feb12a6047c4f21e628dea8b0135b7e9013a/apis/beacon/states/validators.yaml#L128-L130 says we need to not filter if the filter is an empty list. Add a check for `statuses.is_empty()`.
1 parent 836c39e commit 1fd7ead

File tree

3 files changed

+39
-14
lines changed

3 files changed

+39
-14
lines changed

beacon_node/http_api/src/validators.rs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,18 @@ pub fn get_beacon_state_validators<T: BeaconChainTypes>(
1818
|state, execution_optimistic, finalized| {
1919
let epoch = state.current_epoch();
2020
let far_future_epoch = chain.spec.far_future_epoch;
21-
let ids_filter_set: Option<HashSet<&ValidatorId>> =
22-
query_ids.as_ref().map(HashSet::from_iter);
21+
22+
// Map [] to None, indicating that no filtering should be applied (return all
23+
// validators).
24+
let ids_filter_set: Option<HashSet<&ValidatorId>> = query_ids
25+
.as_ref()
26+
.filter(|list| !list.is_empty())
27+
.map(HashSet::from_iter);
28+
29+
let statuses_filter_set: Option<HashSet<&ValidatorStatus>> = query_statuses
30+
.as_ref()
31+
.filter(|list| !list.is_empty())
32+
.map(HashSet::from_iter);
2333

2434
Ok((
2535
state
@@ -42,10 +52,11 @@ pub fn get_beacon_state_validators<T: BeaconChainTypes>(
4252
far_future_epoch,
4353
);
4454

45-
let status_matches = query_statuses.as_ref().is_none_or(|statuses| {
46-
statuses.contains(&status)
47-
|| statuses.contains(&status.superstatus())
48-
});
55+
let status_matches =
56+
statuses_filter_set.as_ref().is_none_or(|statuses| {
57+
statuses.contains(&status)
58+
|| statuses.contains(&status.superstatus())
59+
});
4960

5061
if status_matches {
5162
Some(ValidatorData {

beacon_node/http_api/tests/tests.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ impl ApiTester {
10791079
.get_beacon_states_validators(
10801080
state_id.0,
10811081
Some(validator_index_ids.as_slice()),
1082-
None,
1082+
Some(statuses.as_slice()),
10831083
)
10841084
.await
10851085
.unwrap()
@@ -1089,20 +1089,28 @@ impl ApiTester {
10891089
.get_beacon_states_validators(
10901090
state_id.0,
10911091
Some(validator_pubkey_ids.as_slice()),
1092-
None,
1092+
Some(statuses.as_slice()),
10931093
)
10941094
.await
10951095
.unwrap()
10961096
.map(|res| res.data);
10971097
let post_result_index_ids = self
10981098
.client
1099-
.post_beacon_states_validators(state_id.0, Some(validator_index_ids), None)
1099+
.post_beacon_states_validators(
1100+
state_id.0,
1101+
Some(validator_index_ids),
1102+
Some(statuses.clone()),
1103+
)
11001104
.await
11011105
.unwrap()
11021106
.map(|res| res.data);
11031107
let post_result_pubkey_ids = self
11041108
.client
1105-
.post_beacon_states_validators(state_id.0, Some(validator_pubkey_ids), None)
1109+
.post_beacon_states_validators(
1110+
state_id.0,
1111+
Some(validator_pubkey_ids),
1112+
Some(statuses.clone()),
1113+
)
11061114
.await
11071115
.unwrap()
11081116
.map(|res| res.data);
@@ -1113,7 +1121,13 @@ impl ApiTester {
11131121

11141122
let mut validators = Vec::with_capacity(validator_indices.len());
11151123

1116-
for i in validator_indices {
1124+
let expected_indices = if validator_indices.is_empty() {
1125+
(0..state.validators().len() as u64).collect()
1126+
} else {
1127+
validator_indices.clone()
1128+
};
1129+
1130+
for i in expected_indices {
11171131
if i >= state.validators().len() as u64 {
11181132
continue;
11191133
}
@@ -1123,8 +1137,8 @@ impl ApiTester {
11231137
epoch,
11241138
far_future_epoch,
11251139
);
1126-
if statuses.contains(&status)
1127-
|| statuses.is_empty()
1140+
if statuses.is_empty()
1141+
|| statuses.contains(&status)
11281142
|| statuses.contains(&status.superstatus())
11291143
{
11301144
validators.push(ValidatorData {

common/eth2/src/types.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ pub struct ValidatorIdentityData {
366366
// this proposal:
367367
//
368368
// https://hackmd.io/bQxMDRt1RbS1TLno8K4NPg?view
369-
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
369+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
370370
#[serde(rename_all = "snake_case")]
371371
pub enum ValidatorStatus {
372372
PendingInitialized,

0 commit comments

Comments
 (0)