Fix compile errors in beacon_state.rs
This commit is contained in:
parent
262e9cf0bc
commit
0f7d2c168c
@ -470,17 +470,15 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Return the index root at a recent `epoch`.
|
/// Return the index root at a recent `epoch`.
|
||||||
///
|
///
|
||||||
/// Spec v0.2.0
|
/// Spec v0.4.0
|
||||||
pub fn get_active_index_root(&self, epoch: Epoch, spec: &ChainSpec) -> Option<Hash256> {
|
pub fn get_active_index_root(&self, epoch: Epoch, spec: &ChainSpec) -> Option<Hash256> {
|
||||||
let current_epoch = self.current_epoch(spec);
|
let current_epoch = self.current_epoch(spec);
|
||||||
|
|
||||||
let earliest_index_root = current_epoch
|
if (current_epoch - spec.latest_active_index_roots_length as u64
|
||||||
- Epoch::from(spec.latest_active_index_roots_length)
|
+ spec.activation_exit_delay
|
||||||
+ Epoch::from(spec.entry_exit_delay)
|
< epoch)
|
||||||
+ 1;
|
& (epoch <= current_epoch + spec.activation_exit_delay)
|
||||||
let latest_index_root = current_epoch + spec.entry_exit_delay;
|
{
|
||||||
|
|
||||||
if (epoch >= earliest_index_root) & (epoch <= latest_index_root) {
|
|
||||||
Some(
|
Some(
|
||||||
self.latest_active_index_roots
|
self.latest_active_index_roots
|
||||||
[epoch.as_usize() % spec.latest_active_index_roots_length],
|
[epoch.as_usize() % spec.latest_active_index_roots_length],
|
||||||
@ -678,12 +676,11 @@ impl BeaconState {
|
|||||||
.and_then(|tuple| Some(*tuple)))
|
.and_then(|tuple| Some(*tuple)))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// An entry or exit triggered in the ``epoch`` given by the input takes effect at
|
/// Return the epoch at which an activation or exit triggered in ``epoch`` takes effect.
|
||||||
/// the epoch given by the output.
|
|
||||||
///
|
///
|
||||||
/// Spec v0.2.0
|
/// Spec v0.4.0
|
||||||
pub fn get_entry_exit_effect_epoch(&self, epoch: Epoch, spec: &ChainSpec) -> Epoch {
|
pub fn get_delayed_activation_exit_epoch(&self, epoch: Epoch, spec: &ChainSpec) -> Epoch {
|
||||||
epoch + 1 + spec.entry_exit_delay
|
epoch + 1 + spec.activation_exit_delay
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the beacon proposer index for the `slot`.
|
/// Returns the beacon proposer index for the `slot`.
|
||||||
@ -710,20 +707,20 @@ impl BeaconState {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Process the penalties and prepare the validators who are eligible to withdrawal.
|
/// Process the slashings.
|
||||||
///
|
///
|
||||||
/// Spec v0.2.0
|
/// Spec v0.4.0
|
||||||
pub fn process_slashings(&mut self, spec: &ChainSpec) {
|
pub fn process_slashings(&mut self, spec: &ChainSpec) {
|
||||||
let current_epoch = self.current_epoch(spec);
|
let current_epoch = self.current_epoch(spec);
|
||||||
let active_validator_indices =
|
let active_validator_indices =
|
||||||
get_active_validator_indices(&self.validator_registry, current_epoch);
|
get_active_validator_indices(&self.validator_registry, current_epoch);
|
||||||
let total_balance = self.get_total_balance(&active_validator_indices[..], spec);
|
let total_balance = self.get_total_balance(&active_validator_indices[..], spec);
|
||||||
|
|
||||||
for index in 0..self.validator_balances.len() {
|
for (index, validator) in self.validator_registry.iter().enumerate() {
|
||||||
let validator = &self.validator_registry[index];
|
if validator.slashed
|
||||||
|
&& (current_epoch
|
||||||
if current_epoch
|
== validator.withdrawable_epoch
|
||||||
== validator.penalized_epoch + Epoch::from(spec.latest_slashed_exit_length / 2)
|
- Epoch::from(spec.latest_slashed_exit_length / 2))
|
||||||
{
|
{
|
||||||
let epoch_index: usize = current_epoch.as_usize() % spec.latest_slashed_exit_length;
|
let epoch_index: usize = current_epoch.as_usize() % spec.latest_slashed_exit_length;
|
||||||
|
|
||||||
@ -731,17 +728,21 @@ impl BeaconState {
|
|||||||
[(epoch_index + 1) % spec.latest_slashed_exit_length];
|
[(epoch_index + 1) % spec.latest_slashed_exit_length];
|
||||||
let total_at_end = self.latest_slashed_balances[epoch_index];
|
let total_at_end = self.latest_slashed_balances[epoch_index];
|
||||||
let total_penalities = total_at_end.saturating_sub(total_at_start);
|
let total_penalities = total_at_end.saturating_sub(total_at_start);
|
||||||
let penalty = self.get_effective_balance(index, spec)
|
let penalty = std::cmp::max(
|
||||||
|
self.get_effective_balance(index, spec)
|
||||||
* std::cmp::min(total_penalities * 3, total_balance)
|
* std::cmp::min(total_penalities * 3, total_balance)
|
||||||
/ total_balance;
|
/ total_balance,
|
||||||
|
self.get_effective_balance(index, spec) / spec.min_penalty_quotient,
|
||||||
|
);
|
||||||
|
|
||||||
safe_sub_assign!(self.validator_balances[index], penalty);
|
safe_sub_assign!(self.validator_balances[index], penalty);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Process the penalties and prepare the validators who are eligible to withdrawal.
|
/// Process the exit queue.
|
||||||
///
|
///
|
||||||
/// Spec v0.2.0
|
/// Spec v0.4.0
|
||||||
pub fn process_exit_queue(&mut self, spec: &ChainSpec) {
|
pub fn process_exit_queue(&mut self, spec: &ChainSpec) {
|
||||||
let current_epoch = self.current_epoch(spec);
|
let current_epoch = self.current_epoch(spec);
|
||||||
let active_validator_indices =
|
let active_validator_indices =
|
||||||
@ -751,11 +752,10 @@ impl BeaconState {
|
|||||||
let eligible = |index: usize| {
|
let eligible = |index: usize| {
|
||||||
let validator = &self.validator_registry[index];
|
let validator = &self.validator_registry[index];
|
||||||
|
|
||||||
if validator.penalized_epoch <= current_epoch {
|
if validator.withdrawable_epoch != spec.far_future_epoch {
|
||||||
let penalized_withdrawal_epochs = spec.latest_slashed_exit_length / 2;
|
false
|
||||||
current_epoch >= validator.penalized_epoch + penalized_withdrawal_epochs as u64
|
|
||||||
} else {
|
} else {
|
||||||
current_epoch >= validator.exit_epoch + spec.min_validator_withdrawal_epochs
|
current_epoch >= validator.exit_epoch + spec.min_validator_withdrawability_delay
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -763,11 +763,12 @@ impl BeaconState {
|
|||||||
.filter(|i| eligible(*i))
|
.filter(|i| eligible(*i))
|
||||||
.collect();
|
.collect();
|
||||||
eligable_indices.sort_by_key(|i| self.validator_registry[*i].exit_epoch);
|
eligable_indices.sort_by_key(|i| self.validator_registry[*i].exit_epoch);
|
||||||
|
|
||||||
for (withdrawn_so_far, index) in eligable_indices.iter().enumerate() {
|
for (withdrawn_so_far, index) in eligable_indices.iter().enumerate() {
|
||||||
self.prepare_validator_for_withdrawal(*index);
|
if withdrawn_so_far as u64 >= spec.max_exit_dequeues_per_epoch {
|
||||||
if withdrawn_so_far as u64 >= spec.max_withdrawals_per_epoch {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
self.prepare_validator_for_withdrawal(*index, spec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -943,7 +944,7 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Activate the validator of the given ``index``.
|
/// Activate the validator of the given ``index``.
|
||||||
///
|
///
|
||||||
/// Spec v0.2.0
|
/// Spec v0.4.0
|
||||||
pub fn activate_validator(
|
pub fn activate_validator(
|
||||||
&mut self,
|
&mut self,
|
||||||
validator_index: usize,
|
validator_index: usize,
|
||||||
@ -955,7 +956,7 @@ impl BeaconState {
|
|||||||
self.validator_registry[validator_index].activation_epoch = if is_genesis {
|
self.validator_registry[validator_index].activation_epoch = if is_genesis {
|
||||||
spec.genesis_epoch
|
spec.genesis_epoch
|
||||||
} else {
|
} else {
|
||||||
self.get_entry_exit_effect_epoch(current_epoch, spec)
|
self.get_delayed_activation_exit_epoch(current_epoch, spec)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -968,18 +969,16 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Exit the validator of the given `index`.
|
/// Exit the validator of the given `index`.
|
||||||
///
|
///
|
||||||
/// Spec v0.2.0
|
/// Spec v0.4.0
|
||||||
fn exit_validator(&mut self, validator_index: usize, spec: &ChainSpec) {
|
fn exit_validator(&mut self, validator_index: usize, spec: &ChainSpec) {
|
||||||
let current_epoch = self.current_epoch(spec);
|
let current_epoch = self.current_epoch(spec);
|
||||||
|
let delayed_epoch = self.get_delayed_activation_exit_epoch(current_epoch, spec);
|
||||||
|
|
||||||
if self.validator_registry[validator_index].exit_epoch
|
if self.validator_registry[validator_index].exit_epoch <= delayed_epoch {
|
||||||
<= self.get_entry_exit_effect_epoch(current_epoch, spec)
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.validator_registry[validator_index].exit_epoch =
|
self.validator_registry[validator_index].exit_epoch = delayed_epoch;
|
||||||
self.get_entry_exit_effect_epoch(current_epoch, spec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Slash the validator with index ``index``.
|
/// Slash the validator with index ``index``.
|
||||||
|
Loading…
Reference in New Issue
Block a user