Additional spec updates

This commit is contained in:
Paul Hauner 2019-03-05 09:51:29 +11:00
parent 663d39739f
commit 262e9cf0bc
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6
4 changed files with 63 additions and 44 deletions

View File

@ -555,15 +555,15 @@ impl EpochProcessable for BeaconState {
/*
* Validator Registry
*/
self.previous_calculation_epoch = self.current_calculation_epoch;
self.previous_shuffling_epoch = self.current_shuffling_epoch;
self.previous_epoch_start_shard = self.current_epoch_start_shard;
debug!(
"setting previous_epoch_seed to : {}",
self.current_epoch_seed
"setting previous_shuffling_seed to : {}",
self.current_shuffling_seed
);
self.previous_epoch_seed = self.current_epoch_seed;
self.previous_shuffling_seed = self.current_shuffling_seed;
let should_update_validator_registy = if self.finalized_epoch
> self.validator_registry_update_epoch
@ -580,11 +580,11 @@ impl EpochProcessable for BeaconState {
trace!("updating validator registry.");
self.update_validator_registry(spec);
self.current_calculation_epoch = next_epoch;
self.current_shuffling_epoch = next_epoch;
self.current_epoch_start_shard = (self.current_epoch_start_shard
+ self.get_current_epoch_committee_count(spec) as u64)
% spec.shard_count;
self.current_epoch_seed = self.generate_seed(self.current_calculation_epoch, spec)?
self.current_shuffling_seed = self.generate_seed(self.current_shuffling_epoch, spec)?
} else {
trace!("not updating validator registry.");
let epochs_since_last_registry_update =
@ -592,9 +592,9 @@ impl EpochProcessable for BeaconState {
if (epochs_since_last_registry_update > 1)
& epochs_since_last_registry_update.is_power_of_two()
{
self.current_calculation_epoch = next_epoch;
self.current_epoch_seed =
self.generate_seed(self.current_calculation_epoch, spec)?
self.current_shuffling_epoch = next_epoch;
self.current_shuffling_seed =
self.generate_seed(self.current_shuffling_epoch, spec)?
}
}

View File

@ -39,8 +39,10 @@ pub enum Error {
EpochOutOfBounds,
/// The supplied shard is unknown. It may be larger than the maximum shard count, or not in a
/// committee for the given slot.
SlotOutOfBounds,
ShardOutOfBounds,
UnableToShuffle,
UnknownValidator,
InsufficientRandaoMixes,
InsufficientValidators,
InsufficientBlockRoots,
@ -172,7 +174,7 @@ impl BeaconState {
spec.zero_hash;
spec.latest_active_index_roots_length as usize
],
latest_slashed_balances: vec![0; spec.latest_penalized_exit_length as usize],
latest_slashed_balances: vec![0; spec.latest_slashed_exit_length as usize],
latest_attestations: vec![],
batched_block_roots: vec![],
@ -711,7 +713,7 @@ impl BeaconState {
/// Process the penalties and prepare the validators who are eligible to withdrawal.
///
/// Spec v0.2.0
pub fn process_penalties_and_exits(&mut self, spec: &ChainSpec) {
pub fn process_slashings(&mut self, spec: &ChainSpec) {
let current_epoch = self.current_epoch(spec);
let active_validator_indices =
get_active_validator_indices(&self.validator_registry, current_epoch);
@ -721,13 +723,12 @@ impl BeaconState {
let validator = &self.validator_registry[index];
if current_epoch
== validator.penalized_epoch + Epoch::from(spec.latest_penalized_exit_length / 2)
== validator.penalized_epoch + Epoch::from(spec.latest_slashed_exit_length / 2)
{
let epoch_index: usize =
current_epoch.as_usize() % spec.latest_penalized_exit_length;
let epoch_index: usize = current_epoch.as_usize() % spec.latest_slashed_exit_length;
let total_at_start = self.latest_slashed_balances
[(epoch_index + 1) % spec.latest_penalized_exit_length];
[(epoch_index + 1) % spec.latest_slashed_exit_length];
let total_at_end = self.latest_slashed_balances[epoch_index];
let total_penalities = total_at_end.saturating_sub(total_at_start);
let penalty = self.get_effective_balance(index, spec)
@ -736,12 +737,22 @@ impl BeaconState {
safe_sub_assign!(self.validator_balances[index], penalty);
}
}
}
/// Process the penalties and prepare the validators who are eligible to withdrawal.
///
/// Spec v0.2.0
pub fn process_exit_queue(&mut self, spec: &ChainSpec) {
let current_epoch = self.current_epoch(spec);
let active_validator_indices =
get_active_validator_indices(&self.validator_registry, current_epoch);
let total_balance = self.get_total_balance(&active_validator_indices[..], spec);
let eligible = |index: usize| {
let validator = &self.validator_registry[index];
if validator.penalized_epoch <= current_epoch {
let penalized_withdrawal_epochs = spec.latest_penalized_exit_length / 2;
let penalized_withdrawal_epochs = spec.latest_slashed_exit_length / 2;
current_epoch >= validator.penalized_epoch + penalized_withdrawal_epochs as u64
} else {
current_epoch >= validator.exit_epoch + spec.min_validator_withdrawal_epochs
@ -881,7 +892,7 @@ impl BeaconState {
/// this hashmap, each call to `process_deposits` requires an iteration though
/// `self.validator_registry`. This becomes highly inefficient at scale.
///
/// Spec v0.2.0
/// Spec v0.4.0
pub fn process_deposit(
&mut self,
pubkey: PublicKey,
@ -893,15 +904,9 @@ impl BeaconState {
) -> Result<usize, ()> {
// TODO: update proof of possession to function written above (
// requires bls::create_proof_of_possession to be updated
//
// https://github.com/sigp/lighthouse/issues/239
if !verify_proof_of_possession(&proof_of_possession, &pubkey)
//if !self.validate_proof_of_possession(
// pubkey.clone(),
// proof_of_possession,
// withdrawal_credentials,
// &spec,
// )
{
if !verify_proof_of_possession(&proof_of_possession, &pubkey) {
return Err(());
}
@ -926,9 +931,9 @@ impl BeaconState {
withdrawal_credentials,
activation_epoch: spec.far_future_epoch,
exit_epoch: spec.far_future_epoch,
withdrawal_epoch: spec.far_future_epoch,
penalized_epoch: spec.far_future_epoch,
status_flags: None,
withdrawable_epoch: spec.far_future_epoch,
initiated_exit: false,
slashed: false,
};
self.validator_registry.push(validator);
self.validator_balances.push(amount);
@ -977,22 +982,32 @@ impl BeaconState {
self.get_entry_exit_effect_epoch(current_epoch, spec);
}
/// Penalize the validator of the given ``index``.
/// Slash the validator with index ``index``.
///
/// Exits the validator and assigns its effective balance to the block producer for this
/// state.
///
/// Spec v0.2.0
pub fn penalize_validator(
/// Spec v0.4.0
pub fn slash_validator(
&mut self,
validator_index: usize,
spec: &ChainSpec,
) -> Result<(), Error> {
self.exit_validator(validator_index, spec);
let current_epoch = self.current_epoch(spec);
self.latest_slashed_balances
[current_epoch.as_usize() % spec.latest_penalized_exit_length] +=
let validator = &self
.validator_registry
.get(validator_index)
.ok_or_else(|| Error::UnknownValidator)?;
if self.slot
>= validator
.withdrawable_epoch
.start_slot(spec.slots_per_epoch)
{
return Err(Error::SlotOutOfBounds);
}
self.exit_validator(validator_index, spec);
self.latest_slashed_balances[current_epoch.as_usize() % spec.latest_slashed_exit_length] +=
self.get_effective_balance(validator_index, spec);
let whistleblower_index = self.get_beacon_proposer_index(self.slot, spec)?;
@ -1005,11 +1020,15 @@ impl BeaconState {
self.validator_balances[validator_index],
whistleblower_reward
);
self.validator_registry[validator_index].penalized_epoch = current_epoch;
self.validator_registry[validator_index].slashed = true;
self.validator_registry[validator_index].withdrawable_epoch =
current_epoch + Epoch::from(spec.latest_slashed_exit_length);
debug!(
"Whistleblower {} penalized validator {}.",
whistleblower_index, validator_index
);
Ok(())
}

View File

@ -142,11 +142,11 @@ impl BeaconStateBuilder {
state.slot = slot;
state.validator_registry_update_epoch = epoch - 1;
state.previous_calculation_epoch = epoch - 1;
state.current_calculation_epoch = epoch;
state.previous_shuffling_epoch = epoch - 1;
state.current_shuffling_epoch = epoch;
state.previous_epoch_seed = Hash256::from(&b"previous_seed"[..]);
state.current_epoch_seed = Hash256::from(&b"current_seed"[..]);
state.previous_shuffling_seed = Hash256::from(&b"previous_seed"[..]);
state.current_shuffling_seed = Hash256::from(&b"current_seed"[..]);
state.previous_justified_epoch = epoch - 2;
state.justified_epoch = epoch - 1;

View File

@ -61,7 +61,7 @@ pub struct ChainSpec {
*/
pub latest_block_roots_length: usize,
pub latest_randao_mixes_length: usize,
pub latest_index_roots_length: usize,
pub latest_active_index_roots_length: usize,
pub latest_slashed_exit_length: usize,
/*
@ -157,7 +157,7 @@ impl ChainSpec {
*/
latest_block_roots_length: 8_192,
latest_randao_mixes_length: 8_192,
latest_index_roots_length: 8_192,
latest_active_index_roots_length: 8_192,
latest_slashed_exit_length: 8_192,
/*