Update to spec v0.8.3

This commit is contained in:
Michael Sproul 2019-08-27 16:59:53 +10:00
parent 5a7903a377
commit 4d2cdc9492
No known key found for this signature in database
GPG Key ID: 77B1309D2E54E914
5 changed files with 9 additions and 32 deletions

View File

@ -17,11 +17,9 @@ pub fn get_attesting_indices<T: EthSpec>(
target_relative_epoch, target_relative_epoch,
)?; )?;
/* TODO(freeze): re-enable this? if bitlist.len() != committee.committee.len() {
if bitlist.len() > committee.committee.len() {
return Err(BeaconStateError::InvalidBitfield); return Err(BeaconStateError::InvalidBitfield);
} }
*/
Ok(committee Ok(committee
.committee .committee

View File

@ -3,7 +3,7 @@ use types::*;
/// Return the compact committee root at `relative_epoch`. /// Return the compact committee root at `relative_epoch`.
/// ///
/// Spec v0.8.0 /// Spec v0.8.3
pub fn get_compact_committees_root<T: EthSpec>( pub fn get_compact_committees_root<T: EthSpec>(
state: &BeaconState<T>, state: &BeaconState<T>,
relative_epoch: RelativeEpoch, relative_epoch: RelativeEpoch,
@ -11,28 +11,13 @@ pub fn get_compact_committees_root<T: EthSpec>(
) -> Result<Hash256, BeaconStateError> { ) -> Result<Hash256, BeaconStateError> {
let mut committees = let mut committees =
FixedVector::<_, T::ShardCount>::from_elem(CompactCommittee::<T>::default()); FixedVector::<_, T::ShardCount>::from_elem(CompactCommittee::<T>::default());
// FIXME: this is a spec bug, whereby the start shard for the epoch after the next epoch let start_shard = state.get_epoch_start_shard(relative_epoch)?;
// is mistakenly used. The start shard from the cache SHOULD work.
// Waiting on a release to fix https://github.com/ethereum/eth2.0-specs/issues/1315
let start_shard = if relative_epoch == RelativeEpoch::Next {
state.next_epoch_start_shard(spec)?
} else {
state.get_epoch_start_shard(relative_epoch)?
};
for committee_number in 0..state.get_committee_count(relative_epoch)? { for committee_number in 0..state.get_committee_count(relative_epoch)? {
let shard = (start_shard + committee_number) % T::ShardCount::to_u64(); let shard = (start_shard + committee_number) % T::ShardCount::to_u64();
// FIXME: this is a partial workaround for the above, but it only works in the case
// where there's a committee for every shard in every epoch. It works for the minimal
// tests but not the mainnet ones.
let fake_shard = if relative_epoch == RelativeEpoch::Next {
(shard + 1) % T::ShardCount::to_u64()
} else {
shard
};
for &index in state for &index in state
.get_crosslink_committee_for_shard(fake_shard, relative_epoch)? .get_crosslink_committee_for_shard(shard, relative_epoch)?
.committee .committee
{ {
let validator = state let validator = state

View File

@ -11,6 +11,8 @@ pub fn get_indexed_attestation<T: EthSpec>(
state: &BeaconState<T>, state: &BeaconState<T>,
attestation: &Attestation<T>, attestation: &Attestation<T>,
) -> Result<IndexedAttestation<T>, Error> { ) -> Result<IndexedAttestation<T>, Error> {
// Note: we rely on both calls to `get_attesting_indices` to check the bitfield lengths
// against the committee length
let attesting_indices = let attesting_indices =
get_attesting_indices(state, &attestation.data, &attestation.aggregation_bits)?; get_attesting_indices(state, &attestation.data, &attestation.aggregation_bits)?;

View File

@ -218,9 +218,6 @@ pub fn process_final_updates<T: EthSpec>(
} }
} }
// Update start shard.
state.start_shard = state.next_epoch_start_shard(spec)?;
// Set active index root // Set active index root
let index_epoch = next_epoch + spec.activation_exit_delay; let index_epoch = next_epoch + spec.activation_exit_delay;
let indices_list = VariableList::<usize, T::ValidatorRegistryLimit>::from( let indices_list = VariableList::<usize, T::ValidatorRegistryLimit>::from(
@ -252,6 +249,9 @@ pub fn process_final_updates<T: EthSpec>(
.push(Hash256::from_slice(&historical_batch.tree_hash_root()))?; .push(Hash256::from_slice(&historical_batch.tree_hash_root()))?;
} }
// Update start shard.
state.start_shard = state.get_epoch_start_shard(RelativeEpoch::Next)?;
// Rotate current/previous epoch attestations // Rotate current/previous epoch attestations
state.previous_epoch_attestations = state.previous_epoch_attestations =
std::mem::replace(&mut state.current_epoch_attestations, VariableList::empty()); std::mem::replace(&mut state.current_epoch_attestations, VariableList::empty());

View File

@ -298,14 +298,6 @@ impl<T: EthSpec> BeaconState<T> {
Ok(cache.epoch_start_shard()) Ok(cache.epoch_start_shard())
} }
pub fn next_epoch_start_shard(&self, spec: &ChainSpec) -> Result<u64, Error> {
let cache = self.cache(RelativeEpoch::Current)?;
let active_validator_count = cache.active_validator_count();
let shard_delta = T::get_shard_delta(active_validator_count, spec.target_committee_size);
Ok((self.start_shard + shard_delta) % T::ShardCount::to_u64())
}
/// Get the slot of an attestation. /// Get the slot of an attestation.
/// ///
/// Note: Utilizes the cache and will fail if the appropriate cache is not initialized. /// Note: Utilizes the cache and will fail if the appropriate cache is not initialized.