begin the transition to using ValidatorStatus as a distinct type
This commit is contained in:
parent
d3681e876a
commit
fa3d9bdb07
@ -1,5 +1,6 @@
|
|||||||
use super::bls::{Keypair, PublicKey};
|
use super::bls::{Keypair, PublicKey};
|
||||||
use super::{Address, Hash256};
|
use super::{Address, Hash256};
|
||||||
|
use std::convert;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone, Copy)]
|
#[derive(Debug, PartialEq, Clone, Copy)]
|
||||||
pub enum ValidatorStatus {
|
pub enum ValidatorStatus {
|
||||||
@ -11,6 +12,20 @@ pub enum ValidatorStatus {
|
|||||||
Penalized = 127,
|
Penalized = 127,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl convert::From<u8> 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)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
pub struct ValidatorRecord {
|
pub struct ValidatorRecord {
|
||||||
pub pubkey: PublicKey,
|
pub pubkey: PublicKey,
|
||||||
@ -19,7 +34,7 @@ pub struct ValidatorRecord {
|
|||||||
pub randao_commitment: Hash256,
|
pub randao_commitment: Hash256,
|
||||||
pub randao_last_change: u64,
|
pub randao_last_change: u64,
|
||||||
pub balance: u64,
|
pub balance: u64,
|
||||||
pub status: u8,
|
pub status: ValidatorStatus,
|
||||||
pub exit_slot: u64,
|
pub exit_slot: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +52,7 @@ impl ValidatorRecord {
|
|||||||
randao_commitment: Hash256::zero(),
|
randao_commitment: Hash256::zero(),
|
||||||
randao_last_change: 0,
|
randao_last_change: 0,
|
||||||
balance: 0,
|
balance: 0,
|
||||||
status: 0,
|
status: From::from(0),
|
||||||
exit_slot: 0,
|
exit_slot: 0,
|
||||||
};
|
};
|
||||||
(s, keypair)
|
(s, keypair)
|
||||||
@ -60,7 +75,7 @@ mod tests {
|
|||||||
assert!(v.randao_commitment.is_zero());
|
assert!(v.randao_commitment.is_zero());
|
||||||
assert_eq!(v.randao_last_change, 0);
|
assert_eq!(v.randao_last_change, 0);
|
||||||
assert_eq!(v.balance, 0);
|
assert_eq!(v.balance, 0);
|
||||||
assert_eq!(v.status, 0);
|
assert_eq!(v.status, From::from(0));
|
||||||
assert_eq!(v.exit_slot, 0);
|
assert_eq!(v.exit_slot, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -30,32 +30,32 @@ mod tests {
|
|||||||
let mut validators = vec![];
|
let mut validators = vec![];
|
||||||
|
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Active as u8;
|
v.status = ValidatorStatus::Active;
|
||||||
assert!(validator_is_active(&v));
|
assert!(validator_is_active(&v));
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
|
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::PendingActivation as u8;
|
v.status = ValidatorStatus::PendingActivation;
|
||||||
assert!(!validator_is_active(&v));
|
assert!(!validator_is_active(&v));
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
|
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::PendingExit as u8;
|
v.status = ValidatorStatus::PendingExit;
|
||||||
assert!(!validator_is_active(&v));
|
assert!(!validator_is_active(&v));
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
|
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::PendingWithdraw as u8;
|
v.status = ValidatorStatus::PendingWithdraw;
|
||||||
assert!(!validator_is_active(&v));
|
assert!(!validator_is_active(&v));
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
|
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Withdrawn as u8;
|
v.status = ValidatorStatus::Withdrawn;
|
||||||
assert!(!validator_is_active(&v));
|
assert!(!validator_is_active(&v));
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
|
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Penalized as u8;
|
v.status = ValidatorStatus::Penalized;
|
||||||
assert!(!validator_is_active(&v));
|
assert!(!validator_is_active(&v));
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ pub fn update_validator_set(
|
|||||||
/*
|
/*
|
||||||
* Validator is pending activiation.
|
* Validator is pending activiation.
|
||||||
*/
|
*/
|
||||||
x if x == ValidatorStatus::PendingActivation as u8 => {
|
x if x == ValidatorStatus::PendingActivation => {
|
||||||
let new_total_changed = total_changed
|
let new_total_changed = total_changed
|
||||||
.checked_add(deposit_size_gwei)
|
.checked_add(deposit_size_gwei)
|
||||||
.ok_or(UpdateValidatorSetError::ArithmeticOverflow)?;
|
.ok_or(UpdateValidatorSetError::ArithmeticOverflow)?;
|
||||||
@ -71,7 +71,7 @@ pub fn update_validator_set(
|
|||||||
* activate the validator.
|
* activate the validator.
|
||||||
*/
|
*/
|
||||||
if new_total_changed <= max_allowable_change {
|
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);
|
hasher.extend(i, &v.pubkey.as_bytes(), VALIDATOR_FLAG_ENTRY);
|
||||||
total_changed = new_total_changed;
|
total_changed = new_total_changed;
|
||||||
} else {
|
} else {
|
||||||
@ -82,7 +82,7 @@ pub fn update_validator_set(
|
|||||||
/*
|
/*
|
||||||
* Validator is pending exit.
|
* Validator is pending exit.
|
||||||
*/
|
*/
|
||||||
x if x == ValidatorStatus::PendingExit as u8 => {
|
x if x == ValidatorStatus::PendingExit => {
|
||||||
let new_total_changed = total_changed
|
let new_total_changed = total_changed
|
||||||
.checked_add(v.balance)
|
.checked_add(v.balance)
|
||||||
.ok_or(UpdateValidatorSetError::ArithmeticOverflow)?;
|
.ok_or(UpdateValidatorSetError::ArithmeticOverflow)?;
|
||||||
@ -91,7 +91,7 @@ pub fn update_validator_set(
|
|||||||
* exit the validator
|
* exit the validator
|
||||||
*/
|
*/
|
||||||
if new_total_changed <= max_allowable_change {
|
if new_total_changed <= max_allowable_change {
|
||||||
v.status = ValidatorStatus::PendingWithdraw as u8;
|
v.status = ValidatorStatus::PendingWithdraw;
|
||||||
v.exit_slot = present_slot;
|
v.exit_slot = present_slot;
|
||||||
hasher.extend(i, &v.pubkey.as_bytes(), VALIDATOR_FLAG_EXIT);
|
hasher.extend(i, &v.pubkey.as_bytes(), VALIDATOR_FLAG_EXIT);
|
||||||
total_changed = new_total_changed;
|
total_changed = new_total_changed;
|
||||||
|
@ -68,7 +68,7 @@ impl ValidatorInductor {
|
|||||||
randao_commitment: r.randao_commitment,
|
randao_commitment: r.randao_commitment,
|
||||||
randao_last_change: self.current_slot,
|
randao_last_change: self.current_slot,
|
||||||
balance: DEPOSIT_GWEI,
|
balance: DEPOSIT_GWEI,
|
||||||
status: status as u8,
|
status: status,
|
||||||
exit_slot: 0,
|
exit_slot: 0,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ impl ValidatorInductor {
|
|||||||
/// `validator.status == Withdrawn`. If no such record exists, `None` is returned.
|
/// `validator.status == Withdrawn`. If no such record exists, `None` is returned.
|
||||||
fn first_withdrawn_validator(&mut self) -> Option<usize> {
|
fn first_withdrawn_validator(&mut self) -> Option<usize> {
|
||||||
for i in self.empty_validator_start..self.validators.len() {
|
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;
|
self.empty_validator_start = i + 1;
|
||||||
return Some(i);
|
return Some(i);
|
||||||
}
|
}
|
||||||
@ -166,8 +166,8 @@ mod tests {
|
|||||||
let _ = inductor.induct(&r, ValidatorStatus::Active);
|
let _ = inductor.induct(&r, ValidatorStatus::Active);
|
||||||
let validators = inductor.to_vec();
|
let validators = inductor.to_vec();
|
||||||
|
|
||||||
assert!(validators[0].status == ValidatorStatus::PendingActivation as u8);
|
assert!(validators[0].status == ValidatorStatus::PendingActivation);
|
||||||
assert!(validators[1].status == ValidatorStatus::Active as u8);
|
assert!(validators[1].status == ValidatorStatus::Active);
|
||||||
assert_eq!(validators.len(), 2);
|
assert_eq!(validators.len(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,7 +176,7 @@ mod tests {
|
|||||||
let mut validators = vec![];
|
let mut validators = vec![];
|
||||||
for _ in 0..5 {
|
for _ in 0..5 {
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Active as u8;
|
v.status = ValidatorStatus::Active;
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,11 +195,11 @@ mod tests {
|
|||||||
fn test_validator_inductor_valid_all_second_validator_withdrawn() {
|
fn test_validator_inductor_valid_all_second_validator_withdrawn() {
|
||||||
let mut validators = vec![];
|
let mut validators = vec![];
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Active as u8;
|
v.status = ValidatorStatus::Active;
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
for _ in 0..4 {
|
for _ in 0..4 {
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Withdrawn as u8;
|
v.status = ValidatorStatus::Withdrawn;
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ mod tests {
|
|||||||
let mut validators = vec![];
|
let mut validators = vec![];
|
||||||
for _ in 0..5 {
|
for _ in 0..5 {
|
||||||
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
let (mut v, _) = ValidatorRecord::zero_with_thread_rand_keypair();
|
||||||
v.status = ValidatorStatus::Withdrawn as u8;
|
v.status = ValidatorStatus::Withdrawn;
|
||||||
validators.push(v);
|
validators.push(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user