Move deposit process into file & add tests
This commit is contained in:
parent
b3bd3fa992
commit
acb5a17748
@ -1,4 +1,3 @@
|
|||||||
use super::utils::types::{ Bitfield, U256 };
|
|
||||||
use super::bytes::{ BytesMut, BufMut };
|
use super::bytes::{ BytesMut, BufMut };
|
||||||
use super::crystallized_state::CrystallizedState;
|
use super::crystallized_state::CrystallizedState;
|
||||||
use super::active_state::ActiveState;
|
use super::active_state::ActiveState;
|
||||||
@ -54,46 +53,11 @@ pub fn get_attesters_and_proposer(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn process_ffg_deposits(
|
|
||||||
cry_state: &CrystallizedState,
|
|
||||||
ffg_vote_bitfield: Bitfield)
|
|
||||||
-> (Vec<u64>, u64, U256, bool, bool)
|
|
||||||
{
|
|
||||||
let active_validators: usize = cry_state.num_active_validators();
|
|
||||||
let finality_distance: u64 = cry_state.finality_distance();
|
|
||||||
let online_reward: u64 = if finality_distance <= 2 { 6 } else { 0 };
|
|
||||||
let offline_penalty: u64 = finality_distance.saturating_mul(3);
|
|
||||||
let mut total_vote_count: u64 = 0;
|
|
||||||
let mut total_vote_deposits = U256::zero();
|
|
||||||
|
|
||||||
let mut deltas = vec![0_u64; active_validators];
|
|
||||||
for i in 0..active_validators {
|
|
||||||
if ffg_vote_bitfield.get_bit(&i) {
|
|
||||||
total_vote_deposits = total_vote_deposits
|
|
||||||
.saturating_add(cry_state.active_validators[i].balance);
|
|
||||||
deltas[i] += online_reward;
|
|
||||||
total_vote_count += 1;
|
|
||||||
} else {
|
|
||||||
deltas[i] = deltas[i].saturating_sub(offline_penalty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut should_finalize = false;
|
|
||||||
let should_justify = total_vote_deposits.saturating_mul(U256::from(3))
|
|
||||||
>= cry_state.total_deposits.saturating_mul(U256::from(2));
|
|
||||||
if should_justify {
|
|
||||||
if cry_state.last_justified_epoch == cry_state.current_epoch - 1 {
|
|
||||||
should_finalize = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(deltas, total_vote_count, total_vote_deposits, should_justify, should_finalize)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use super::super::validator_record::ValidatorRecord;
|
use super::super::validator_record::ValidatorRecord;
|
||||||
use super::super::utils::types::{ Address, Sha256Digest };
|
use super::super::utils::types::{ Address, Sha256Digest, U256 };
|
||||||
use super::super::
|
use super::super::
|
||||||
utils::test_helpers::get_dangerous_test_keypair;
|
utils::test_helpers::get_dangerous_test_keypair;
|
||||||
|
|
||||||
|
122
src/state/transition/deposits.rs
Normal file
122
src/state/transition/deposits.rs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
use super::crystallized_state::CrystallizedState;
|
||||||
|
use super::utils::types::{ Bitfield, U256 };
|
||||||
|
|
||||||
|
pub fn process_ffg_deposits(
|
||||||
|
cry_state: &CrystallizedState,
|
||||||
|
ffg_vote_bitfield: &Bitfield)
|
||||||
|
-> (Vec<i64>, u64, U256, bool, bool)
|
||||||
|
{
|
||||||
|
let active_validators: usize = cry_state.num_active_validators();
|
||||||
|
let finality_distance: u64 = cry_state.finality_distance();
|
||||||
|
let online_reward: u64 = if finality_distance <= 2 { 6 } else { 0 };
|
||||||
|
let offline_penalty: u64 = finality_distance.saturating_mul(3);
|
||||||
|
let mut total_vote_count: u64 = 0;
|
||||||
|
let mut total_vote_deposits = U256::zero();
|
||||||
|
|
||||||
|
let mut deltas = vec![0_i64; active_validators];
|
||||||
|
for i in 0..active_validators {
|
||||||
|
if ffg_vote_bitfield.get_bit(&i) {
|
||||||
|
total_vote_deposits = total_vote_deposits
|
||||||
|
.saturating_add(cry_state.active_validators[i].balance);
|
||||||
|
deltas[i] += online_reward as i64;
|
||||||
|
total_vote_count += 1;
|
||||||
|
} else {
|
||||||
|
deltas[i] -= offline_penalty as i64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Justify if total voting deposits is greater than 2/3 the total deposits.
|
||||||
|
let should_justify = total_vote_deposits.saturating_mul(U256::from(3))
|
||||||
|
>= cry_state.total_deposits.saturating_mul(U256::from(2));
|
||||||
|
let mut should_finalize = false;
|
||||||
|
if should_justify {
|
||||||
|
if cry_state.last_justified_epoch == cry_state.current_epoch - 1 {
|
||||||
|
should_finalize = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(deltas, total_vote_count, total_vote_deposits, should_justify, should_finalize)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use super::super::utils::types::{ Address, Sha256Digest };
|
||||||
|
use super::super::super::validator_record::ValidatorRecord;
|
||||||
|
use super::super::
|
||||||
|
utils::test_helpers::get_dangerous_test_keypair;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deposit_processing_scenario_1() {
|
||||||
|
let mut cry_state = CrystallizedState::zero();
|
||||||
|
let mut bitfield = Bitfield::new();
|
||||||
|
let mut total_deposits = U256::zero();
|
||||||
|
let individual_deposit = U256::from(1);
|
||||||
|
|
||||||
|
|
||||||
|
// load some validators into the cry state and flag
|
||||||
|
// they have all voted
|
||||||
|
for i in 0..10 {
|
||||||
|
cry_state.active_validators.push(ValidatorRecord {
|
||||||
|
pubkey: get_dangerous_test_keypair().public,
|
||||||
|
withdrawal_shard: 0,
|
||||||
|
withdrawal_address: Address::zero(),
|
||||||
|
randao_commitment: Sha256Digest::zero(),
|
||||||
|
balance: individual_deposit,
|
||||||
|
switch_dynasty: 0
|
||||||
|
});
|
||||||
|
total_deposits = total_deposits + individual_deposit;
|
||||||
|
bitfield.set_bit(&i, &true);
|
||||||
|
}
|
||||||
|
|
||||||
|
cry_state.current_epoch = 100;
|
||||||
|
cry_state.last_justified_epoch = 99;
|
||||||
|
cry_state.last_finalized_epoch = 98;
|
||||||
|
cry_state.total_deposits = total_deposits;
|
||||||
|
|
||||||
|
let (deltas, total_vote_count, total_vote_deposits,
|
||||||
|
should_justify, should_finalize) = process_ffg_deposits(
|
||||||
|
&cry_state, &bitfield);
|
||||||
|
|
||||||
|
assert_eq!(deltas, [6; 10]);
|
||||||
|
assert_eq!(total_vote_count, 10);
|
||||||
|
assert_eq!(total_vote_deposits, total_deposits);
|
||||||
|
assert_eq!(should_justify, true);
|
||||||
|
assert_eq!(should_finalize, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deposit_processing_scenario_2() {
|
||||||
|
let mut cry_state = CrystallizedState::zero();
|
||||||
|
let bitfield = Bitfield::new();
|
||||||
|
let individual_deposit = U256::from(0);
|
||||||
|
|
||||||
|
|
||||||
|
// load some validators into the cry state and flag
|
||||||
|
// they have all voted
|
||||||
|
for _i in 0..10 {
|
||||||
|
cry_state.active_validators.push(ValidatorRecord {
|
||||||
|
pubkey: get_dangerous_test_keypair().public,
|
||||||
|
withdrawal_shard: 0,
|
||||||
|
withdrawal_address: Address::zero(),
|
||||||
|
randao_commitment: Sha256Digest::zero(),
|
||||||
|
balance: individual_deposit,
|
||||||
|
switch_dynasty: 0
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
cry_state.current_epoch = 100;
|
||||||
|
cry_state.last_justified_epoch = 99;
|
||||||
|
cry_state.last_finalized_epoch = 98;
|
||||||
|
cry_state.total_deposits = U256::from(10);
|
||||||
|
|
||||||
|
let (deltas, total_vote_count, total_vote_deposits,
|
||||||
|
should_justify, should_finalize) = process_ffg_deposits(
|
||||||
|
&cry_state, &bitfield);
|
||||||
|
|
||||||
|
assert_eq!(deltas, [-6; 10]);
|
||||||
|
assert_eq!(total_vote_count, 0);
|
||||||
|
assert_eq!(total_vote_deposits, U256::zero());
|
||||||
|
assert_eq!(should_justify, false);
|
||||||
|
assert_eq!(should_finalize, false);
|
||||||
|
}
|
||||||
|
}
|
@ -1,5 +1,7 @@
|
|||||||
use super::config;
|
use super::config;
|
||||||
use super::utils;
|
use super::utils;
|
||||||
use super::blake2;
|
use super::blake2;
|
||||||
|
use super::crystallized_state;
|
||||||
|
|
||||||
pub mod shuffling;
|
pub mod shuffling;
|
||||||
|
pub mod deposits;
|
||||||
|
Loading…
Reference in New Issue
Block a user