Change ValidatorInductor to own instead of borrow

This commit is contained in:
Paul Hauner 2018-10-20 21:28:57 +11:00
parent a8179897a9
commit f495ed845b
No known key found for this signature in database
GPG Key ID: 303E4494BB28068C

View File

@ -10,10 +10,10 @@ use super::registration::ValidatorRegistration;
pub const DEPOSIT_GWEI: u64 = 32_000_000_000; pub const DEPOSIT_GWEI: u64 = 32_000_000_000;
/// Inducts validators into a `CrystallizedState`. /// Inducts validators into a `CrystallizedState`.
pub struct ValidatorInductor<'a> { pub struct ValidatorInductor {
pub current_slot: u64, pub current_slot: u64,
pub shard_count: u16, pub shard_count: u16,
validators: &'a mut Vec<ValidatorRecord>, validators: Vec<ValidatorRecord>,
empty_validator_start: usize, empty_validator_start: usize,
} }
@ -23,8 +23,8 @@ pub enum ValidatorInductionError {
InvaidProofOfPossession, InvaidProofOfPossession,
} }
impl<'a> ValidatorInductor<'a> { impl ValidatorInductor {
pub fn new(current_slot: u64, shard_count: u16, validators: &'a mut Vec<ValidatorRecord>) pub fn new(current_slot: u64, shard_count: u16, validators: Vec<ValidatorRecord>)
-> Self -> Self
{ {
Self { Self {
@ -108,8 +108,8 @@ impl<'a> ValidatorInductor<'a> {
} }
} }
fn to_ref(self) pub fn to_vec(self)
-> &'a Vec<ValidatorRecord> -> Vec<ValidatorRecord>
{ {
self.validators self.validators
} }
@ -148,27 +148,15 @@ mod tests {
} }
} }
/// Induct a validator using the ValidatorInductor, return the result.
fn do_induction(validator_rego: &ValidatorRegistration,
validators: &mut Vec<ValidatorRecord>,
current_slot: u64,
shard_count: u16)
-> Result<usize, ValidatorInductionError>
{
let mut inductor = ValidatorInductor::new(
current_slot,
shard_count,
validators);
inductor.induct(&validator_rego)
}
#[test] #[test]
fn test_validator_inductor_valid_empty_validators() { fn test_validator_inductor_valid_empty_validators() {
let mut validators = vec![]; let validators = vec![];
let r = get_registration(); let r = get_registration();
let result = do_induction(&r, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result.unwrap(), 0); assert_eq!(result.unwrap(), 0);
assert_eq!(r, validators[0]); assert_eq!(r, validators[0]);
@ -186,7 +174,9 @@ mod tests {
let r = get_registration(); let r = get_registration();
let result = do_induction(&r, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result.unwrap(), 5); assert_eq!(result.unwrap(), 5);
assert_eq!(r, validators[5]); assert_eq!(r, validators[5]);
@ -207,7 +197,9 @@ mod tests {
let r = get_registration(); let r = get_registration();
let result = do_induction(&r, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result.unwrap(), 1); assert_eq!(result.unwrap(), 1);
assert_eq!(r, validators[1]); assert_eq!(r, validators[1]);
@ -227,7 +219,9 @@ mod tests {
* Ensure the first validator gets the 0'th slot * Ensure the first validator gets the 0'th slot
*/ */
let r = get_registration(); let r = get_registration();
let result = do_induction(&r, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result.unwrap(), 0); assert_eq!(result.unwrap(), 0);
assert_eq!(r, validators[0]); assert_eq!(r, validators[0]);
assert_eq!(validators.len(), 5); assert_eq!(validators.len(), 5);
@ -236,7 +230,9 @@ mod tests {
* Ensure the second validator gets the 1'st slot * Ensure the second validator gets the 1'st slot
*/ */
let r_two = get_registration(); let r_two = get_registration();
let result = do_induction(&r_two, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result.unwrap(), 1); assert_eq!(result.unwrap(), 1);
assert_eq!(r_two, validators[1]); assert_eq!(r_two, validators[1]);
assert_eq!(validators.len(), 5); assert_eq!(validators.len(), 5);
@ -244,12 +240,14 @@ mod tests {
#[test] #[test]
fn test_validator_inductor_shard_too_high() { fn test_validator_inductor_shard_too_high() {
let mut validators = vec![]; let validators = vec![];
let mut r = get_registration(); let mut r = get_registration();
r.withdrawal_shard = 1025; r.withdrawal_shard = 1025;
let result = do_induction(&r, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result, Err(ValidatorInductionError::InvalidShard)); assert_eq!(result, Err(ValidatorInductionError::InvalidShard));
assert_eq!(validators.len(), 0); assert_eq!(validators.len(), 0);
@ -257,13 +255,15 @@ mod tests {
#[test] #[test]
fn test_validator_inductor_shard_proof_of_possession_failure() { fn test_validator_inductor_shard_proof_of_possession_failure() {
let mut validators = vec![]; let validators = vec![];
let mut r = get_registration(); let mut r = get_registration();
let kp = Keypair::random(); let kp = Keypair::random();
r.proof_of_possession = get_proof_of_possession(&kp); r.proof_of_possession = get_proof_of_possession(&kp);
let result = do_induction(&r, &mut validators, 0, 1024); let mut inductor = ValidatorInductor::new(0, 1024, validators);
let result = inductor.induct(&r);
let validators = inductor.to_vec();
assert_eq!(result, Err(ValidatorInductionError::InvaidProofOfPossession)); assert_eq!(result, Err(ValidatorInductionError::InvaidProofOfPossession));
assert_eq!(validators.len(), 0); assert_eq!(validators.len(), 0);