Update ChainSpec to v0.4.0

This commit is contained in:
Paul Hauner 2019-03-04 17:48:19 +11:00
parent 7f10d41121
commit a1af65ce1a
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6
6 changed files with 62 additions and 57 deletions

View File

@ -17,8 +17,7 @@ impl<T: RngCore> TestRandom<T> for AttestationDataAndCustodyBit {
fn random_for_test(rng: &mut T) -> Self {
Self {
data: <_>::random_for_test(rng),
// TODO: deal with bools
custody_bit: false,
custody_bit: <_>::random_for_test(rng),
}
}
}

View File

@ -1,5 +1,5 @@
use crate::test_utils::TestRandom;
use crate::{BeaconBlockBody, ChainSpec, Eth1Data, Hash256, ProposalSignedData, Slot};
use crate::{BeaconBlockBody, ChainSpec, Eth1Data, Hash256, Slot};
use bls::Signature;
use rand::RngCore;
use serde_derive::Serialize;

View File

@ -772,7 +772,7 @@ impl BeaconState {
/// Update validator registry, activating/exiting validators if possible.
///
/// Spec v0.2.0
/// Spec v0.4.0
pub fn update_validator_registry(&mut self, spec: &ChainSpec) {
let current_epoch = self.current_epoch(spec);
let active_validator_indices =
@ -788,8 +788,8 @@ impl BeaconState {
for index in 0..self.validator_registry.len() {
let validator = &self.validator_registry[index];
if (validator.activation_epoch > self.get_entry_exit_effect_epoch(current_epoch, spec))
&& self.validator_balances[index] >= spec.max_deposit_amount
if (validator.activation_epoch == spec.far_future_epoch)
& (self.validator_balances[index] == spec.max_deposit_amount)
{
balance_churn += self.get_effective_balance(index, spec);
if balance_churn > max_balance_churn {
@ -803,9 +803,7 @@ impl BeaconState {
for index in 0..self.validator_registry.len() {
let validator = &self.validator_registry[index];
if (validator.exit_epoch > self.get_entry_exit_effect_epoch(current_epoch, spec))
&& validator.status_flags == Some(StatusFlags::InitiatedExit)
{
if (validator.exit_epoch == spec.far_future_epoch) & (validator.initiated_exit) {
balance_churn += self.get_effective_balance(index, spec);
if balance_churn > max_balance_churn {
break;
@ -958,10 +956,9 @@ impl BeaconState {
/// Initiate an exit for the validator of the given `index`.
///
/// Spec v0.2.0
/// Spec v0.4.0
pub fn initiate_validator_exit(&mut self, validator_index: usize) {
// TODO: the spec does an `|=` here, ensure this isn't buggy.
self.validator_registry[validator_index].status_flags = Some(StatusFlags::InitiatedExit);
self.validator_registry[validator_index].initiated_exit = true;
}
/// Exit the validator of the given `index`.
@ -1019,9 +1016,10 @@ impl BeaconState {
/// Initiate an exit for the validator of the given `index`.
///
/// Spec v0.2.0
pub fn prepare_validator_for_withdrawal(&mut self, validator_index: usize) {
pub fn prepare_validator_for_withdrawal(&mut self, validator_index: usize, spec: &ChainSpec) {
//TODO: we're not ANDing here, we're setting. Potentially wrong.
self.validator_registry[validator_index].status_flags = Some(StatusFlags::Withdrawable);
self.validator_registry[validator_index].withdrawable_epoch =
self.current_epoch(spec) + spec.min_validator_withdrawability_delay;
}
/// Iterate through the validator registry and eject active validators with balance below

View File

@ -5,7 +5,7 @@ const GWEI: u64 = 1_000_000_000;
/// Holds all the "constants" for a BeaconChain.
///
/// Spec v0.2.0
/// Spec v0.4.0
#[derive(PartialEq, Debug, Clone)]
pub struct ChainSpec {
/*
@ -16,7 +16,7 @@ pub struct ChainSpec {
pub max_balance_churn_quotient: u64,
pub beacon_chain_shard_number: u64,
pub max_indices_per_slashable_vote: u64,
pub max_withdrawals_per_epoch: u64,
pub max_exit_dequeues_per_epoch: u64,
pub shuffle_round_count: u8,
/*
@ -48,13 +48,13 @@ pub struct ChainSpec {
/*
* Time parameters
*/
pub slot_duration: u64,
pub seconds_per_slot: u64,
pub min_attestation_inclusion_delay: u64,
pub epoch_length: u64,
pub seed_lookahead: Epoch,
pub entry_exit_delay: u64,
pub eth1_data_voting_period: u64,
pub min_validator_withdrawal_epochs: Epoch,
pub slots_per_epoch: u64,
pub min_seed_lookahead: Epoch,
pub activation_exit_delay: u64,
pub epochs_per_eth1_voting_period: u64,
pub min_validator_withdrawability_delay: Epoch,
/*
* State list lengths
@ -62,15 +62,16 @@ pub struct ChainSpec {
pub latest_block_roots_length: usize,
pub latest_randao_mixes_length: usize,
pub latest_index_roots_length: usize,
pub latest_penalized_exit_length: usize,
pub latest_slashed_exit_length: usize,
/*
* Reward and penalty quotients
*/
pub base_reward_quotient: u64,
pub whistleblower_reward_quotient: u64,
pub includer_reward_quotient: u64,
pub attestation_inclusion_reward_quotient: u64,
pub inactivity_penalty_quotient: u64,
pub min_penalty_quotient: u64,
/*
* Max operations per block
@ -79,7 +80,8 @@ pub struct ChainSpec {
pub max_attester_slashings: u64,
pub max_attestations: u64,
pub max_deposits: u64,
pub max_exits: u64,
pub max_voluntary_exits: u64,
pub max_transfers: u64,
/*
* Signature domains
@ -89,19 +91,17 @@ pub struct ChainSpec {
pub domain_proposal: u64,
pub domain_exit: u64,
pub domain_randao: u64,
pub domain_transfer: u64,
}
impl ChainSpec {
/// Returns a `ChainSpec` compatible with the specification from Ethereum Foundation.
/// Returns a `ChainSpec` compatible with the Ethereum Foundation specification.
///
/// Of course, the actual foundation specs are unknown at this point so these are just a rough
/// estimate.
///
/// Spec v0.2.0
/// Spec v0.4.0
pub fn foundation() -> Self {
let genesis_slot = Slot::new(2_u64.pow(19));
let epoch_length = 64;
let genesis_epoch = genesis_slot.epoch(epoch_length);
let genesis_slot = Slot::new(2_u64.pow(32));
let slots_per_epoch = 64;
let genesis_epoch = genesis_slot.epoch(slots_per_epoch);
Self {
/*
@ -112,7 +112,7 @@ impl ChainSpec {
max_balance_churn_quotient: 32,
beacon_chain_shard_number: u64::max_value(),
max_indices_per_slashable_vote: 4_096,
max_withdrawals_per_epoch: 4,
max_exit_dequeues_per_epoch: 4,
shuffle_round_count: 90,
/*
@ -133,7 +133,7 @@ impl ChainSpec {
* Initial Values
*/
genesis_fork_version: 0,
genesis_slot: Slot::new(2_u64.pow(19)),
genesis_slot,
genesis_epoch,
genesis_start_shard: 0,
far_future_epoch: Epoch::new(u64::max_value()),
@ -144,13 +144,13 @@ impl ChainSpec {
/*
* Time parameters
*/
slot_duration: 6,
seconds_per_slot: 6,
min_attestation_inclusion_delay: 4,
epoch_length,
seed_lookahead: Epoch::new(1),
entry_exit_delay: 4,
eth1_data_voting_period: 16,
min_validator_withdrawal_epochs: Epoch::new(256),
slots_per_epoch,
min_seed_lookahead: Epoch::new(1),
activation_exit_delay: 4,
epochs_per_eth1_voting_period: 16,
min_validator_withdrawability_delay: Epoch::new(256),
/*
* State list lengths
@ -158,15 +158,16 @@ impl ChainSpec {
latest_block_roots_length: 8_192,
latest_randao_mixes_length: 8_192,
latest_index_roots_length: 8_192,
latest_penalized_exit_length: 8_192,
latest_slashed_exit_length: 8_192,
/*
* Reward and penalty quotients
*/
base_reward_quotient: 32,
whistleblower_reward_quotient: 512,
includer_reward_quotient: 8,
attestation_inclusion_reward_quotient: 8,
inactivity_penalty_quotient: 16_777_216,
min_penalty_quotient: 32,
/*
* Max operations per block
@ -175,7 +176,8 @@ impl ChainSpec {
max_attester_slashings: 1,
max_attestations: 128,
max_deposits: 16,
max_exits: 16,
max_voluntary_exits: 16,
max_transfers: 16,
/*
* Signature domains
@ -185,6 +187,7 @@ impl ChainSpec {
domain_proposal: 2,
domain_exit: 3,
domain_randao: 4,
domain_transfer: 5,
}
}
}
@ -192,18 +195,18 @@ impl ChainSpec {
impl ChainSpec {
/// Returns a `ChainSpec` compatible with the specification suitable for 8 validators.
///
/// Spec v0.2.0
/// Spec v0.4.0
pub fn few_validators() -> Self {
let genesis_slot = Slot::new(2_u64.pow(19));
let epoch_length = 8;
let genesis_epoch = genesis_slot.epoch(epoch_length);
let genesis_slot = Slot::new(2_u64.pow(32));
let slots_per_epoch = 8;
let genesis_epoch = genesis_slot.epoch(slots_per_epoch);
Self {
shard_count: 8,
target_committee_size: 1,
genesis_slot,
genesis_epoch,
epoch_length,
slots_per_epoch,
..ChainSpec::foundation()
}
}

View File

@ -17,6 +17,12 @@ where
fn random_for_test(rng: &mut T) -> Self;
}
impl<T: RngCore> TestRandom<T> for bool {
fn random_for_test(rng: &mut T) -> Self {
(rng.next_u32() % 2) == 1
}
}
impl<T: RngCore> TestRandom<T> for u64 {
fn random_for_test(rng: &mut T) -> Self {
rng.next_u64()

View File

@ -1,20 +1,19 @@
use crate::{test_utils::TestRandom, Epoch, Hash256, PublicKey};
use rand::RngCore;
use serde_derive::Serialize;
use ssz::{hash, Decodable, DecodeError, Encodable, SszStream, TreeHash};
use ssz_derive::{Decode, Encode, TreeHash};
use test_random_derive::TestRandom;
/// Information about a `BeaconChain` validator.
///
/// Spec v0.4.0
#[derive(Debug, Clone, PartialEq, Serialize, Encode, Decode, TestRandom)]
#[derive(Debug, Clone, PartialEq, Serialize, Encode, Decode, TestRandom, TreeHash)]
pub struct Validator {
pub pubkey: PublicKey,
pub withdrawal_credentials: Hash256,
pub activation_epoch: Epoch,
pub exit_epoch: Epoch,
pub withdrawal_epoch: Epoch,
pub withdrawable_epoch: Epoch,
pub initiated_exit: bool,
pub slashed: bool,
}
@ -32,7 +31,7 @@ impl Validator {
/// Returns `true` if the validator is able to withdraw at some epoch.
pub fn is_withdrawable_at(&self, epoch: Epoch) -> bool {
self.withdrawal_epoch <= epoch
self.withdrawable_epoch <= epoch
}
}
@ -44,9 +43,9 @@ impl Default for Validator {
withdrawal_credentials: Hash256::default(),
activation_epoch: Epoch::from(std::u64::MAX),
exit_epoch: Epoch::from(std::u64::MAX),
withdrawal_epoch: Epoch::from(std::u64::MAX),
penalized_epoch: Epoch::from(std::u64::MAX),
status_flags: None,
withdrawable_epoch: Epoch::from(std::u64::MAX),
initiated_exit: false,
slashed: false,
}
}
}
@ -55,7 +54,7 @@ impl Default for Validator {
mod tests {
use super::*;
use crate::test_utils::{SeedableRng, TestRandom, XorShiftRng};
use ssz::ssz_encode;
use ssz::{ssz_encode, Decodable, TreeHash};
#[test]
pub fn test_ssz_round_trip() {