From 42e774cb48a31b1aaddb8a97de9f4720a3e2a8a3 Mon Sep 17 00:00:00 2001 From: Paul Hauner Date: Mon, 22 Oct 2018 06:48:44 +1100 Subject: [PATCH] Finish genesis for BeaconChain --- beacon_chain/chain/src/blocks.rs | 12 ------ beacon_chain/chain/src/genesis.rs | 40 +++++++++---------- beacon_chain/chain/src/lib.rs | 27 ++++++++++--- beacon_chain/types/src/active_state.rs | 1 + beacon_chain/types/src/chain_config.rs | 6 +++ beacon_chain/types/src/crosslink_record.rs | 2 +- beacon_chain/types/src/crystallized_state.rs | 1 + beacon_chain/types/src/shard_and_committee.rs | 2 +- .../types/src/validator_registration.rs | 15 +++++++ 9 files changed, 65 insertions(+), 41 deletions(-) delete mode 100644 beacon_chain/chain/src/blocks.rs diff --git a/beacon_chain/chain/src/blocks.rs b/beacon_chain/chain/src/blocks.rs deleted file mode 100644 index ec43099b6a..0000000000 --- a/beacon_chain/chain/src/blocks.rs +++ /dev/null @@ -1,12 +0,0 @@ -use super::{ - BeaconChain, - BeaconChainError, -}; - -impl BeaconChain { - pub fn validate_serialized_block(&self, ssz: &[u8]) - -> Result<(), BeaconChainError> - { - Ok(()) - } -} diff --git a/beacon_chain/chain/src/genesis.rs b/beacon_chain/chain/src/genesis.rs index c503ec6ca6..54ff7969f2 100644 --- a/beacon_chain/chain/src/genesis.rs +++ b/beacon_chain/chain/src/genesis.rs @@ -1,6 +1,7 @@ use types::{ CrosslinkRecord, Hash256, + ValidatorRegistration, }; use super::{ ActiveState, @@ -9,10 +10,7 @@ use super::{ BeaconChainError, ChainConfig, }; -use validator_induction::{ - ValidatorInductor, - ValidatorRegistration, -}; +use validator_induction::ValidatorInductor; use validator_shuffling::{ shard_and_committees_for_cycle, ValidatorAssignmentError, @@ -30,9 +28,7 @@ impl BeaconChain { /// Initialize a new ChainHead with genesis parameters. /// /// Used when syncing a chain from scratch. - pub fn genesis_states( - initial_validator_entries: &[ValidatorRegistration], - config: &ChainConfig) + pub fn genesis_states(config: &ChainConfig) -> Result<(ActiveState, CrystallizedState), ValidatorAssignmentError> { /* @@ -42,7 +38,7 @@ impl BeaconChain { */ let validators = { let mut inductor = ValidatorInductor::new(0, config.shard_count, vec![]); - for registration in initial_validator_entries { + for registration in &config.initial_validators { let _ = inductor.induct(®istration); }; inductor.to_vec() @@ -120,17 +116,19 @@ mod tests { extern crate bls; use super::*; - use self::bls::Keypair; + use self::bls::{ + create_proof_of_possession, + Keypair, + }; use types::{ Hash256, Address, }; - use validator_induction::create_proof_of_possession; #[test] fn test_genesis_no_validators() { let config = ChainConfig::standard(); - let (act, cry) = BeaconChain::genesis_states(&vec![], &config).unwrap(); + let (act, cry) = BeaconChain::genesis_states(&config).unwrap(); assert_eq!(cry.validator_set_change_slot, 0); assert_eq!(cry.validators.len(), 0); @@ -170,41 +168,39 @@ mod tests { #[test] fn test_genesis_valid_validators() { - let config = ChainConfig::standard(); + let mut config = ChainConfig::standard(); let validator_count = 5; - let mut validators = vec![]; for _ in 0..validator_count { - validators.push(random_registration()); + config.initial_validators.push(random_registration()); } - let (_, cry) = BeaconChain::genesis_states(&validators, &config).unwrap(); + let (_, cry) = BeaconChain::genesis_states(&config).unwrap(); assert_eq!(cry.validators.len(), validator_count); } #[test] fn test_genesis_invalid_validators() { - let config = ChainConfig::standard(); + let mut config = ChainConfig::standard(); let good_validator_count = 5; - let mut all_validators = vec![]; for _ in 0..good_validator_count { - all_validators.push(random_registration()); + config.initial_validators.push(random_registration()); } let mut bad_v = random_registration(); let bad_kp = Keypair::random(); bad_v.proof_of_possession = create_proof_of_possession(&bad_kp); - all_validators.push(bad_v); + config.initial_validators.push(bad_v); let mut bad_v = random_registration(); bad_v.withdrawal_shard = config.shard_count + 1; - all_validators.push(bad_v); + config.initial_validators.push(bad_v); - let (_, cry) = BeaconChain::genesis_states(&all_validators, &config).unwrap(); + let (_, cry) = BeaconChain::genesis_states(&config).unwrap(); - assert!(all_validators.len() != good_validator_count, "test is invalid"); + assert!(config.initial_validators.len() != good_validator_count, "test is invalid"); assert_eq!(cry.validators.len(), good_validator_count); } } diff --git a/beacon_chain/chain/src/lib.rs b/beacon_chain/chain/src/lib.rs index d5e7e2e86b..808a9c6413 100644 --- a/beacon_chain/chain/src/lib.rs +++ b/beacon_chain/chain/src/lib.rs @@ -2,7 +2,6 @@ extern crate types; extern crate validator_induction; extern crate validator_shuffling; -mod blocks; mod genesis; use std::collections::HashMap; @@ -13,6 +12,7 @@ use types::{ Hash256, }; +#[derive(Debug, PartialEq)] pub enum BeaconChainError { InvalidGenesis, DBError(String), @@ -24,15 +24,14 @@ pub struct BeaconChain { pub fork_latest_block_hashes: Vec, pub active_states: HashMap, pub crystallized_states: HashMap, + pub config: ChainConfig, } impl BeaconChain { pub fn new(config: ChainConfig) -> Result { - let initial_validators = vec![]; - let (active_state, crystallized_state) = BeaconChain::genesis_states( - &initial_validators, &config)?; + let (active_state, crystallized_state) = BeaconChain::genesis_states(&config)?; let canonical_latest_block_hash = Hash256::zero(); let fork_latest_block_hashes = vec![]; @@ -48,6 +47,7 @@ impl BeaconChain { fork_latest_block_hashes, active_states, crystallized_states, + config, }) } } @@ -56,9 +56,26 @@ impl BeaconChain { #[cfg(test)] mod tests { use super::*; + use types::ValidatorRegistration; #[test] fn test_new_chain() { - assert_eq!(2 + 2, 4); + let mut config = ChainConfig::standard(); + + for _ in 0..4 { + config.initial_validators.push(ValidatorRegistration::random()) + } + + let chain = BeaconChain::new(config.clone()).unwrap(); + let (act, cry) = BeaconChain::genesis_states(&config).unwrap(); + + assert_eq!(chain.last_finalized_slot, None); + assert_eq!(chain.canonical_latest_block_hash, Hash256::zero()); + + let stored_act = chain.active_states.get(&Hash256::zero()).unwrap(); + assert_eq!(act, *stored_act); + + let stored_cry = chain.crystallized_states.get(&Hash256::zero()).unwrap(); + assert_eq!(cry, *stored_cry); } } diff --git a/beacon_chain/types/src/active_state.rs b/beacon_chain/types/src/active_state.rs index 4b72910fac..b31f8447f2 100644 --- a/beacon_chain/types/src/active_state.rs +++ b/beacon_chain/types/src/active_state.rs @@ -4,6 +4,7 @@ use super::{ SpecialRecord, }; +#[derive(Debug, PartialEq)] pub struct ActiveState { pub pending_attestations: Vec, pub pending_specials: Vec, diff --git a/beacon_chain/types/src/chain_config.rs b/beacon_chain/types/src/chain_config.rs index 4cdc91a6da..27382ee825 100644 --- a/beacon_chain/types/src/chain_config.rs +++ b/beacon_chain/types/src/chain_config.rs @@ -1,8 +1,12 @@ +use super::ValidatorRegistration; + +#[derive(Debug, Clone, PartialEq)] pub struct ChainConfig { pub cycle_length: u8, pub shard_count: u16, pub min_committee_size: u64, pub genesis_time: u64, + pub initial_validators: Vec, } /* @@ -17,6 +21,7 @@ impl ChainConfig { shard_count: 1024, min_committee_size: 128, genesis_time: GENESIS_TIME, // arbitrary + initial_validators: vec![], } } @@ -41,6 +46,7 @@ impl ChainConfig { shard_count: 2, min_committee_size: 2, genesis_time: GENESIS_TIME, // arbitrary + initial_validators: vec![], } } } diff --git a/beacon_chain/types/src/crosslink_record.rs b/beacon_chain/types/src/crosslink_record.rs index 2c7525fadd..d28df43509 100644 --- a/beacon_chain/types/src/crosslink_record.rs +++ b/beacon_chain/types/src/crosslink_record.rs @@ -1,6 +1,6 @@ use super::Hash256; -#[derive(Clone)] +#[derive(Clone, Debug, PartialEq)] pub struct CrosslinkRecord { pub recently_changed: bool, pub slot: u64, diff --git a/beacon_chain/types/src/crystallized_state.rs b/beacon_chain/types/src/crystallized_state.rs index 21b4eb64ea..71d31fe200 100644 --- a/beacon_chain/types/src/crystallized_state.rs +++ b/beacon_chain/types/src/crystallized_state.rs @@ -4,6 +4,7 @@ use super::shard_and_committee::ShardAndCommittee; use super::Hash256; +#[derive(Debug, PartialEq)] pub struct CrystallizedState { pub validator_set_change_slot: u64, pub validators: Vec, diff --git a/beacon_chain/types/src/shard_and_committee.rs b/beacon_chain/types/src/shard_and_committee.rs index 6cc74429ab..10b9004f49 100644 --- a/beacon_chain/types/src/shard_and_committee.rs +++ b/beacon_chain/types/src/shard_and_committee.rs @@ -1,4 +1,4 @@ -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct ShardAndCommittee { pub shard_id: u16, pub committee: Vec diff --git a/beacon_chain/types/src/validator_registration.rs b/beacon_chain/types/src/validator_registration.rs index 384f2dc729..994d4d82de 100644 --- a/beacon_chain/types/src/validator_registration.rs +++ b/beacon_chain/types/src/validator_registration.rs @@ -1,4 +1,5 @@ use bls::{ + create_proof_of_possession, Keypair, PublicKey, Signature, @@ -18,3 +19,17 @@ pub struct ValidatorRegistration { pub randao_commitment: Hash256, pub proof_of_possession: Signature, } + +impl ValidatorRegistration { + pub fn random() -> Self { + let keypair = Keypair::random(); + + Self { + pubkey: keypair.pk.clone(), + withdrawal_shard: 0, + withdrawal_address: Address::random(), + randao_commitment: Hash256::random(), + proof_of_possession: create_proof_of_possession(&keypair), + } + } +}