diff --git a/Cargo.toml b/Cargo.toml index 856c2dae3..069e697a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,7 +38,6 @@ members = [ "beacon_chain/spec", "beacon_chain/state-transition", "beacon_chain/types", - "beacon_chain/utils/active-validators", "beacon_chain/utils/bls", "beacon_chain/utils/boolean-bitfield", "beacon_chain/utils/hashing", diff --git a/beacon_chain/types/src/validator_record.rs b/beacon_chain/types/src/validator_record.rs index b1110c855..c4e57d335 100644 --- a/beacon_chain/types/src/validator_record.rs +++ b/beacon_chain/types/src/validator_record.rs @@ -1,14 +1,29 @@ use super::bls::{Keypair, PublicKey}; use super::{Hash256}; +use std::convert; -#[derive(Debug, PartialEq, Clone, Copy)] +#[derive(Debug, PartialEq, Clone)] pub enum ValidatorStatus { - PendingActivation = 0, - Active = 1, - PendingExit = 2, - PendingWithdraw = 3, - Withdrawn = 5, - Penalized = 127, + PendingActivation, + Active, + PendingExit, + PendingWithdraw, + Withdrawn, + Penalized, +} + +impl convert::From for ValidatorStatus { + fn from(status: u8) -> Self { + match status { + 0 => ValidatorStatus::PendingActivation, + 1 => ValidatorStatus::Active, + 2 => ValidatorStatus::PendingExit, + 3 => ValidatorStatus::PendingWithdraw, + 5 => ValidatorStatus::Withdrawn, + 127 => ValidatorStatus::Penalized, + _ => unreachable!(), + } + } } #[derive(Debug, Clone, PartialEq)] @@ -42,6 +57,10 @@ impl ValidatorRecord { }; (s, keypair) } + + pub fn status_is(&self, status: ValidatorStatus) -> bool { + self.status == status + } } #[cfg(test)] diff --git a/beacon_chain/utils/active-validators/Cargo.toml b/beacon_chain/utils/active-validators/Cargo.toml deleted file mode 100644 index 4729747d9..000000000 --- a/beacon_chain/utils/active-validators/Cargo.toml +++ /dev/null @@ -1,7 +0,0 @@ -[package] -name = "active-validators" -version = "0.1.0" -authors = ["Paul Hauner "] - -[dependencies] -types = { path = "../../types" } diff --git a/beacon_chain/utils/active-validators/src/lib.rs b/beacon_chain/utils/active-validators/src/lib.rs deleted file mode 100644 index 75ad2daac..000000000 --- a/beacon_chain/utils/active-validators/src/lib.rs +++ /dev/null @@ -1,63 +0,0 @@ -extern crate types; - -use types::{ValidatorRecord, ValidatorStatus}; - -pub fn validator_is_active(v: &ValidatorRecord) -> bool { - v.status == ValidatorStatus::Active as u8 -} - -/// Returns the indicies of each active validator in a given vec of validators. -pub fn active_validator_indices(validators: &[ValidatorRecord]) -> Vec { - validators - .iter() - .enumerate() - .filter_map(|(i, validator)| { - if validator_is_active(&validator) { - Some(i) - } else { - None - } - }).collect() -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn test_active_validator() { - let mut validators = vec![]; - - let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Active as u8; - assert!(validator_is_active(&v)); - validators.push(v); - - let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::PendingActivation as u8; - assert!(!validator_is_active(&v)); - validators.push(v); - - let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::PendingExit as u8; - assert!(!validator_is_active(&v)); - validators.push(v); - - let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::PendingWithdraw as u8; - assert!(!validator_is_active(&v)); - validators.push(v); - - let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Withdrawn as u8; - assert!(!validator_is_active(&v)); - validators.push(v); - - let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Penalized as u8; - assert!(!validator_is_active(&v)); - validators.push(v); - - assert_eq!(active_validator_indices(&validators), vec![0]); - } -} diff --git a/beacon_chain/validator_change/Cargo.toml b/beacon_chain/validator_change/Cargo.toml index 88e78c9f8..0705033dc 100644 --- a/beacon_chain/validator_change/Cargo.toml +++ b/beacon_chain/validator_change/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" authors = ["Paul Hauner "] [dependencies] -active-validators = { path = "../utils/active-validators" } bytes = "0.4.10" hashing = { path = "../utils/hashing" } types = { path = "../types" } diff --git a/beacon_chain/validator_change/src/lib.rs b/beacon_chain/validator_change/src/lib.rs index 99226debb..99687e30a 100644 --- a/beacon_chain/validator_change/src/lib.rs +++ b/beacon_chain/validator_change/src/lib.rs @@ -1,9 +1,7 @@ -extern crate active_validators; extern crate bytes; extern crate hashing; extern crate types; -use active_validators::validator_is_active; use bytes::{BufMut, BytesMut}; use hashing::canonical_hash; use std::cmp::max; @@ -31,7 +29,7 @@ pub fn update_validator_set( let total_balance = { let mut bal: u64 = 0; for v in validators.iter() { - if validator_is_active(&v) { + if v.status_is(ValidatorStatus::Active) { bal = bal .checked_add(v.balance) .ok_or(UpdateValidatorSetError::ArithmeticOverflow)?; @@ -62,7 +60,7 @@ pub fn update_validator_set( /* * Validator is pending activiation. */ - x if x == ValidatorStatus::PendingActivation as u8 => { + ValidatorStatus::PendingActivation => { let new_total_changed = total_changed .checked_add(deposit_size_gwei) .ok_or(UpdateValidatorSetError::ArithmeticOverflow)?; @@ -71,7 +69,7 @@ pub fn update_validator_set( * activate the validator. */ if new_total_changed <= max_allowable_change { - v.status = ValidatorStatus::Active as u8; + v.status = ValidatorStatus::Active; hasher.extend(i, &v.pubkey.as_bytes(), VALIDATOR_FLAG_ENTRY); total_changed = new_total_changed; } else { @@ -82,7 +80,7 @@ pub fn update_validator_set( /* * Validator is pending exit. */ - x if x == ValidatorStatus::PendingExit as u8 => { + ValidatorStatus::PendingExit => { let new_total_changed = total_changed .checked_add(v.balance) .ok_or(UpdateValidatorSetError::ArithmeticOverflow)?; @@ -91,7 +89,7 @@ pub fn update_validator_set( * exit the validator */ if new_total_changed <= max_allowable_change { - v.status = ValidatorStatus::PendingWithdraw as u8; + v.status = ValidatorStatus::PendingWithdraw; v.exit_slot = present_slot; hasher.extend(i, &v.pubkey.as_bytes(), VALIDATOR_FLAG_EXIT); total_changed = new_total_changed; diff --git a/beacon_chain/validator_induction/src/inductor.rs b/beacon_chain/validator_induction/src/inductor.rs index c86fce9e6..816d8e356 100644 --- a/beacon_chain/validator_induction/src/inductor.rs +++ b/beacon_chain/validator_induction/src/inductor.rs @@ -68,7 +68,7 @@ impl ValidatorInductor { randao_commitment: r.randao_commitment, randao_last_change: self.current_slot, balance: DEPOSIT_GWEI, - status: status as u8, + status: status, exit_slot: 0, }) } @@ -77,7 +77,7 @@ impl ValidatorInductor { /// `validator.status == Withdrawn`. If no such record exists, `None` is returned. fn first_withdrawn_validator(&mut self) -> Option { for i in self.empty_validator_start..self.validators.len() { - if self.validators[i].status == ValidatorStatus::Withdrawn as u8 { + if self.validators[i].status == ValidatorStatus::Withdrawn { self.empty_validator_start = i + 1; return Some(i); } @@ -166,8 +166,8 @@ mod tests { let _ = inductor.induct(&r, ValidatorStatus::Active); let validators = inductor.to_vec(); - assert!(validators[0].status == ValidatorStatus::PendingActivation as u8); - assert!(validators[1].status == ValidatorStatus::Active as u8); + assert!(validators[0].status == ValidatorStatus::PendingActivation); + assert!(validators[1].status == ValidatorStatus::Active); assert_eq!(validators.len(), 2); } @@ -176,7 +176,7 @@ mod tests { let mut validators = vec![]; for _ in 0..5 { let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Active as u8; + v.status = ValidatorStatus::Active; validators.push(v); } @@ -195,11 +195,11 @@ mod tests { fn test_validator_inductor_valid_all_second_validator_withdrawn() { let mut validators = vec![]; let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Active as u8; + v.status = ValidatorStatus::Active; validators.push(v); for _ in 0..4 { let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Withdrawn as u8; + v.status = ValidatorStatus::Withdrawn; validators.push(v); } @@ -219,7 +219,7 @@ mod tests { let mut validators = vec![]; for _ in 0..5 { let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair(); - v.status = ValidatorStatus::Withdrawn as u8; + v.status = ValidatorStatus::Withdrawn; validators.push(v); } diff --git a/beacon_chain/validator_shuffling/Cargo.toml b/beacon_chain/validator_shuffling/Cargo.toml index 269b5c557..ba99841b8 100644 --- a/beacon_chain/validator_shuffling/Cargo.toml +++ b/beacon_chain/validator_shuffling/Cargo.toml @@ -4,7 +4,6 @@ version = "0.1.0" authors = ["Paul Hauner "] [dependencies] -active-validators = { path = "../utils/active-validators" } honey-badger-split = { path = "../utils/honey-badger-split" } types = { path = "../types" } vec_shuffle = { path = "../utils/vec_shuffle" } diff --git a/beacon_chain/validator_shuffling/src/lib.rs b/beacon_chain/validator_shuffling/src/lib.rs index fe2447fc0..90077279f 100644 --- a/beacon_chain/validator_shuffling/src/lib.rs +++ b/beacon_chain/validator_shuffling/src/lib.rs @@ -1,4 +1,3 @@ -extern crate active_validators; extern crate honey_badger_split; extern crate types; extern crate vec_shuffle; diff --git a/beacon_chain/validator_shuffling/src/shuffle.rs b/beacon_chain/validator_shuffling/src/shuffle.rs index 3009f4cbd..577668a8f 100644 --- a/beacon_chain/validator_shuffling/src/shuffle.rs +++ b/beacon_chain/validator_shuffling/src/shuffle.rs @@ -1,8 +1,7 @@ use std::cmp::min; -use active_validators::active_validator_indices; use honey_badger_split::SplitExt; -use types::{ChainConfig, ShardAndCommittee, ValidatorRecord}; +use types::{ChainConfig, ShardAndCommittee, ValidatorRecord, ValidatorStatus}; use vec_shuffle::{shuffle, ShuffleErr}; type DelegatedCycle = Vec>; @@ -24,7 +23,17 @@ pub fn shard_and_committees_for_cycle( config: &ChainConfig, ) -> Result { let shuffled_validator_indices = { - let mut validator_indices = active_validator_indices(validators); + let mut validator_indices = validators + .iter() + .enumerate() + .filter_map(|(i, validator)| { + if validator.status_is(ValidatorStatus::Active) { + Some(i) + } else { + None + } + }) + .collect(); shuffle(seed, validator_indices)? }; let shard_indices: Vec = (0_usize..config.shard_count as usize).into_iter().collect(); @@ -87,8 +96,10 @@ fn generate_cycle( .map(|(j, shard_indices)| ShardAndCommittee { shard: ((shard_start + j) % shard_count) as u16, committee: shard_indices.to_vec(), - }).collect() - }).collect(); + }) + .collect() + }) + .collect(); Ok(cycle) }