update minimal spec, fix all tests

This commit is contained in:
Michael Sproul 2019-06-17 15:21:03 +10:00
parent cf3d8b0688
commit 660a35991f
No known key found for this signature in database
GPG Key ID: 77B1309D2E54E914
7 changed files with 59 additions and 69 deletions

View File

@ -123,16 +123,20 @@ impl EthSpec for MainnetEthSpec {
pub type FoundationBeaconState = BeaconState<MainnetEthSpec>; pub type FoundationBeaconState = BeaconState<MainnetEthSpec>;
/// Ethereum Foundation specifications, modified to be suitable for < 1000 validators. /// Ethereum Foundation minimal spec, as defined here:
///
/// https://github.com/ethereum/eth2.0-specs/blob/v0.6.3/configs/constant_presets/minimal.yaml
///
/// Spec v0.6.3
#[derive(Clone, PartialEq, Debug, Default, Serialize, Deserialize)] #[derive(Clone, PartialEq, Debug, Default, Serialize, Deserialize)]
pub struct MinimalEthSpec; pub struct MinimalEthSpec;
impl EthSpec for MinimalEthSpec { impl EthSpec for MinimalEthSpec {
type ShardCount = U8; type ShardCount = U8;
type SlotsPerHistoricalRoot = U8192; type SlotsPerHistoricalRoot = U64;
type LatestRandaoMixesLength = U8192; type LatestRandaoMixesLength = U64;
type LatestActiveIndexRootsLength = U8192; type LatestActiveIndexRootsLength = U64;
type LatestSlashedExitLength = U8192; type LatestSlashedExitLength = U64;
type SlotsPerEpoch = U8; type SlotsPerEpoch = U8;
type GenesisEpoch = U0; type GenesisEpoch = U0;

View File

@ -50,24 +50,8 @@ impl CommitteeCache {
spec.target_committee_size, spec.target_committee_size,
) as usize; ) as usize;
let shuffling_start_shard = match relative_epoch { let shuffling_start_shard =
RelativeEpoch::Current => state.latest_start_shard, Self::compute_start_shard(state, relative_epoch, active_validator_indices.len(), spec);
RelativeEpoch::Previous => {
let shard_delta =
T::get_shard_delta(active_validator_indices.len(), spec.target_committee_size);
(state.latest_start_shard + T::ShardCount::to_u64() - shard_delta)
% T::ShardCount::to_u64()
}
RelativeEpoch::Next => {
let current_active_validators =
get_active_validator_count(&state.validator_registry, state.current_epoch());
let shard_delta =
T::get_shard_delta(current_active_validators, spec.target_committee_size);
(state.latest_start_shard + shard_delta) % T::ShardCount::to_u64()
}
};
let seed = state.generate_seed(epoch, spec)?; let seed = state.generate_seed(epoch, spec)?;
@ -100,6 +84,37 @@ impl CommitteeCache {
}) })
} }
/// Compute the shard which must be attested to first in a given relative epoch.
///
/// The `active_validator_count` must be the number of validators active at `relative_epoch`.
///
/// Spec v0.6.3
pub fn compute_start_shard<T: EthSpec>(
state: &BeaconState<T>,
relative_epoch: RelativeEpoch,
active_validator_count: usize,
spec: &ChainSpec,
) -> u64 {
match relative_epoch {
RelativeEpoch::Current => state.latest_start_shard,
RelativeEpoch::Previous => {
let shard_delta =
T::get_shard_delta(active_validator_count, spec.target_committee_size);
(state.latest_start_shard + T::ShardCount::to_u64() - shard_delta)
% T::ShardCount::to_u64()
}
RelativeEpoch::Next => {
let current_active_validators =
get_active_validator_count(&state.validator_registry, state.current_epoch());
let shard_delta =
T::get_shard_delta(current_active_validators, spec.target_committee_size);
(state.latest_start_shard + shard_delta) % T::ShardCount::to_u64()
}
}
}
/// Returns `true` if the cache has been initialized at the supplied `epoch`. /// Returns `true` if the cache has been initialized at the supplied `epoch`.
/// ///
/// An non-initialized cache does not provide any useful information. /// An non-initialized cache does not provide any useful information.

View File

@ -170,7 +170,7 @@ impl EthSpec for ExcessShardsEthSpec {
fn starts_on_the_correct_shard() { fn starts_on_the_correct_shard() {
let spec = &ExcessShardsEthSpec::default_spec(); let spec = &ExcessShardsEthSpec::default_spec();
let num_validators = ExcessShardsEthSpec::shard_count(); let num_validators = spec.target_committee_size * ExcessShardsEthSpec::shard_count();
let epoch = Epoch::new(100_000_000); let epoch = Epoch::new(100_000_000);
let slot = epoch.start_slot(ExcessShardsEthSpec::slots_per_epoch()); let slot = epoch.start_slot(ExcessShardsEthSpec::slots_per_epoch());

View File

@ -214,8 +214,9 @@ mod committees {
) { ) {
let active_indices: Vec<usize> = (0..validator_count).collect(); let active_indices: Vec<usize> = (0..validator_count).collect();
let seed = state.generate_seed(epoch, spec).unwrap(); let seed = state.generate_seed(epoch, spec).unwrap();
let start_shard = 0;
let relative_epoch = RelativeEpoch::from_epoch(state.current_epoch(), epoch).unwrap(); let relative_epoch = RelativeEpoch::from_epoch(state.current_epoch(), epoch).unwrap();
let start_shard =
CommitteeCache::compute_start_shard(&state, relative_epoch, active_indices.len(), spec);
let mut ordered_indices = state let mut ordered_indices = state
.get_cached_active_validator_indices(relative_epoch) .get_cached_active_validator_indices(relative_epoch)
@ -231,8 +232,9 @@ mod committees {
shuffle_list(active_indices, spec.shuffle_round_count, &seed[..], false).unwrap(); shuffle_list(active_indices, spec.shuffle_round_count, &seed[..], false).unwrap();
let mut expected_indices_iter = shuffling.iter(); let mut expected_indices_iter = shuffling.iter();
let mut expected_shards_iter = let mut expected_shards_iter = (0..T::ShardCount::to_u64())
(start_shard..start_shard + T::shard_count() as u64).into_iter(); .into_iter()
.map(|i| (start_shard + i) % T::ShardCount::to_u64());
// Loop through all slots in the epoch being tested. // Loop through all slots in the epoch being tested.
for slot in epoch.slot_iter(T::slots_per_epoch()) { for slot in epoch.slot_iter(T::slots_per_epoch()) {

View File

@ -223,7 +223,11 @@ impl ChainSpec {
} }
} }
/// Returns a `ChainSpec` compatible with the specification suitable for 8 validators. /// Ethereum Foundation minimal spec, as defined here:
///
/// https://github.com/ethereum/eth2.0-specs/blob/v0.6.3/configs/constant_presets/minimal.yaml
///
/// Spec v0.6.3
pub fn minimal() -> Self { pub fn minimal() -> Self {
let genesis_slot = Slot::new(0); let genesis_slot = Slot::new(0);
@ -235,11 +239,13 @@ impl ChainSpec {
.expect("correct multiaddr")]; .expect("correct multiaddr")];
Self { Self {
boot_nodes, target_committee_size: 4,
target_committee_size: 1,
chain_id: 2, // lighthouse testnet chain id
genesis_slot,
shuffle_round_count: 10, shuffle_round_count: 10,
min_attestation_inclusion_delay: 2,
slots_per_eth1_voting_period: 16,
genesis_slot,
chain_id: 2, // lighthouse testnet chain id
boot_nodes,
..ChainSpec::mainnet() ..ChainSpec::mainnet()
} }
} }

View File

@ -1,33 +0,0 @@
use serde_derive::{Deserialize, Serialize};
use types::{
typenum::{U64, U8},
ChainSpec, EthSpec, FewValidatorsEthSpec, FoundationEthSpec,
};
/// "Minimal" testing specification, as defined here:
///
/// https://github.com/ethereum/eth2.0-specs/blob/v0.6.1/configs/constant_presets/minimal.yaml
///
/// Spec v0.6.1
#[derive(Clone, PartialEq, Debug, Default, Serialize, Deserialize)]
pub struct MinimalEthSpec;
impl EthSpec for MinimalEthSpec {
type ShardCount = U8;
type SlotsPerHistoricalRoot = U64;
type LatestRandaoMixesLength = U64;
type LatestActiveIndexRootsLength = U64;
type LatestSlashedExitLength = U64;
fn spec() -> ChainSpec {
let mut spec = FewValidatorsEthSpec::spec();
spec.target_committee_size = 4;
spec.shuffle_round_count = 10;
spec.min_attestation_inclusion_delay = 2;
spec.slots_per_epoch = 8;
spec.slots_per_eth1_voting_period = 16;
spec
}
}
pub type MainnetEthSpec = FoundationEthSpec;

View File

@ -98,7 +98,6 @@ fn operations_exit() {
} }
#[test] #[test]
#[should_panic]
fn operations_proposer_slashing() { fn operations_proposer_slashing() {
yaml_files_in_test_dir(&Path::new("operations").join("proposer_slashing")) yaml_files_in_test_dir(&Path::new("operations").join("proposer_slashing"))
.into_par_iter() .into_par_iter()
@ -108,7 +107,6 @@ fn operations_proposer_slashing() {
} }
#[test] #[test]
#[should_panic]
fn operations_attester_slashing() { fn operations_attester_slashing() {
yaml_files_in_test_dir(&Path::new("operations").join("attester_slashing")) yaml_files_in_test_dir(&Path::new("operations").join("attester_slashing"))
.into_par_iter() .into_par_iter()
@ -118,7 +116,6 @@ fn operations_attester_slashing() {
} }
#[test] #[test]
#[should_panic]
fn operations_attestation() { fn operations_attestation() {
yaml_files_in_test_dir(&Path::new("operations").join("attestation")) yaml_files_in_test_dir(&Path::new("operations").join("attestation"))
.into_par_iter() .into_par_iter()
@ -137,7 +134,6 @@ fn operations_block_header() {
} }
#[test] #[test]
#[should_panic]
fn sanity_blocks() { fn sanity_blocks() {
yaml_files_in_test_dir(&Path::new("sanity").join("blocks")) yaml_files_in_test_dir(&Path::new("sanity").join("blocks"))
.into_par_iter() .into_par_iter()