WIP beacon state changes
This commit is contained in:
parent
2751be9a05
commit
ac51d7be3b
@ -267,6 +267,36 @@ impl BeaconState {
|
|||||||
self.current_epoch(spec) + 1
|
self.current_epoch(spec) + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the number of committees at ``epoch``.
|
||||||
|
///
|
||||||
|
/// Spec v0.6.1
|
||||||
|
pub fn get_epoch_committee_count(&self, epoch: Epoch, spec: &ChainSpec) -> u64 {
|
||||||
|
let active_validator_indices = self.get_active_validator_indices(epoch);
|
||||||
|
spec.get_epoch_committee_count(active_validator_indices.len())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_epoch_start_shard(&self, epoch: Epoch, spec: &ChainSpec) -> u64 {
|
||||||
|
drop((epoch, spec));
|
||||||
|
unimplemented!("FIXME(sproul) get_epoch_start_shard")
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the slot of an attestation.
|
||||||
|
///
|
||||||
|
/// Spec v0.6.1
|
||||||
|
pub fn get_attestation_slot(
|
||||||
|
&self,
|
||||||
|
attestation_data: &AttestationData,
|
||||||
|
spec: &ChainSpec,
|
||||||
|
) -> Result<Slot, Error> {
|
||||||
|
let epoch = attestation_data.target_epoch;
|
||||||
|
let committee_count = self.get_epoch_committee_count(epoch, spec);
|
||||||
|
let offset = (attestation_data.shard + spec.shard_count
|
||||||
|
- self.get_epoch_start_shard(epoch, spec))
|
||||||
|
% spec.shard_count;
|
||||||
|
Ok(epoch.start_slot(spec.slots_per_epoch)
|
||||||
|
+ offset / (committee_count / spec.slots_per_epoch))
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the active validator indices for the given epoch, assuming there is no validator
|
/// Returns the active validator indices for the given epoch, assuming there is no validator
|
||||||
/// registry update in the next epoch.
|
/// registry update in the next epoch.
|
||||||
///
|
///
|
||||||
@ -320,6 +350,17 @@ impl BeaconState {
|
|||||||
.ok_or_else(|| Error::SlotOutOfBounds)?)
|
.ok_or_else(|| Error::SlotOutOfBounds)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME(sproul): implement this
|
||||||
|
pub fn get_crosslink_committee(
|
||||||
|
&self,
|
||||||
|
epoch: Epoch,
|
||||||
|
shard: u64,
|
||||||
|
spec: &ChainSpec,
|
||||||
|
) -> Result<&CrosslinkCommittee, Error> {
|
||||||
|
drop((epoch, shard, spec));
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the crosslink committees for some shard in an epoch.
|
/// Returns the crosslink committees for some shard in an epoch.
|
||||||
///
|
///
|
||||||
/// 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.
|
||||||
@ -405,6 +446,18 @@ impl BeaconState {
|
|||||||
Ok(&self.latest_block_roots[i])
|
Ok(&self.latest_block_roots[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the block root at a recent `slot`.
|
||||||
|
///
|
||||||
|
/// Spec v0.6.0
|
||||||
|
// FIXME(sproul): name swap with get_block_root
|
||||||
|
pub fn get_block_root_at_epoch(
|
||||||
|
&self,
|
||||||
|
epoch: Epoch,
|
||||||
|
spec: &ChainSpec,
|
||||||
|
) -> Result<&Hash256, BeaconStateError> {
|
||||||
|
self.get_block_root(epoch.start_slot(spec.slots_per_epoch), spec)
|
||||||
|
}
|
||||||
|
|
||||||
/// Sets the block root for some given slot.
|
/// Sets the block root for some given slot.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.5.1
|
||||||
@ -575,7 +628,7 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Safely obtains the index for `latest_slashed_balances`, given some `epoch`.
|
/// Safely obtains the index for `latest_slashed_balances`, given some `epoch`.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.6.1
|
||||||
fn get_slashed_balance_index(&self, epoch: Epoch, spec: &ChainSpec) -> Result<usize, Error> {
|
fn get_slashed_balance_index(&self, epoch: Epoch, spec: &ChainSpec) -> Result<usize, Error> {
|
||||||
let i = epoch.as_usize() % spec.latest_slashed_exit_length;
|
let i = epoch.as_usize() % spec.latest_slashed_exit_length;
|
||||||
|
|
||||||
@ -590,7 +643,7 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Gets the total slashed balances for some epoch.
|
/// Gets the total slashed balances for some epoch.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.6.1
|
||||||
pub fn get_slashed_balance(&self, epoch: Epoch, spec: &ChainSpec) -> Result<u64, Error> {
|
pub fn get_slashed_balance(&self, epoch: Epoch, spec: &ChainSpec) -> Result<u64, Error> {
|
||||||
let i = self.get_slashed_balance_index(epoch, spec)?;
|
let i = self.get_slashed_balance_index(epoch, spec)?;
|
||||||
Ok(self.latest_slashed_balances[i])
|
Ok(self.latest_slashed_balances[i])
|
||||||
@ -598,7 +651,7 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Sets the total slashed balances for some epoch.
|
/// Sets the total slashed balances for some epoch.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.6.1
|
||||||
pub fn set_slashed_balance(
|
pub fn set_slashed_balance(
|
||||||
&mut self,
|
&mut self,
|
||||||
epoch: Epoch,
|
epoch: Epoch,
|
||||||
@ -610,6 +663,41 @@ impl BeaconState {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the attestations from the current or previous epoch.
|
||||||
|
///
|
||||||
|
/// Spec v0.6.0
|
||||||
|
pub fn get_matching_source_attestations(
|
||||||
|
&self,
|
||||||
|
epoch: Epoch,
|
||||||
|
spec: &ChainSpec,
|
||||||
|
) -> Result<&[PendingAttestation], Error> {
|
||||||
|
if epoch == self.current_epoch(spec) {
|
||||||
|
Ok(&self.current_epoch_attestations)
|
||||||
|
} else if epoch == self.previous_epoch(spec) {
|
||||||
|
Ok(&self.previous_epoch_attestations)
|
||||||
|
} else {
|
||||||
|
Err(Error::EpochOutOfBounds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transform an attestation into the crosslink that it reinforces.
|
||||||
|
///
|
||||||
|
/// Spec v0.6.1
|
||||||
|
pub fn get_crosslink_from_attestation_data(
|
||||||
|
&self,
|
||||||
|
data: &AttestationData,
|
||||||
|
spec: &ChainSpec,
|
||||||
|
) -> Crosslink {
|
||||||
|
Crosslink {
|
||||||
|
epoch: std::cmp::min(
|
||||||
|
data.target_epoch,
|
||||||
|
self.current_crosslinks[data.shard as usize].epoch + spec.max_crosslink_epochs,
|
||||||
|
),
|
||||||
|
previous_crosslink_root: data.previous_crosslink_root,
|
||||||
|
crosslink_data_root: data.crosslink_data_root,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Generate a seed for the given `epoch`.
|
/// Generate a seed for the given `epoch`.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.5.1
|
||||||
@ -628,17 +716,16 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Return the effective balance (also known as "balance at stake") for a validator with the given ``index``.
|
/// Return the effective balance (also known as "balance at stake") for a validator with the given ``index``.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.6.0
|
||||||
pub fn get_effective_balance(
|
pub fn get_effective_balance(
|
||||||
&self,
|
&self,
|
||||||
validator_index: usize,
|
validator_index: usize,
|
||||||
spec: &ChainSpec,
|
_spec: &ChainSpec,
|
||||||
) -> Result<u64, Error> {
|
) -> Result<u64, Error> {
|
||||||
let balance = self
|
self.validator_registry
|
||||||
.balances
|
|
||||||
.get(validator_index)
|
.get(validator_index)
|
||||||
.ok_or_else(|| Error::UnknownValidator)?;
|
.map(|v| v.effective_balance)
|
||||||
Ok(std::cmp::min(*balance, spec.max_deposit_amount))
|
.ok_or_else(|| Error::UnknownValidator)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the epoch at which an activation or exit triggered in ``epoch`` takes effect.
|
/// Return the epoch at which an activation or exit triggered in ``epoch`` takes effect.
|
||||||
@ -663,14 +750,6 @@ impl BeaconState {
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Initiate an exit for the validator of the given `index`.
|
|
||||||
///
|
|
||||||
/// Spec v0.5.1
|
|
||||||
pub fn initiate_validator_exit(&mut self, validator_index: usize) {
|
|
||||||
// FIXME(sproul)
|
|
||||||
// self.validator_registry[validator_index].initiated_exit = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns the `slot`, `shard` and `committee_index` for which a validator must produce an
|
/// Returns the `slot`, `shard` and `committee_index` for which a validator must produce an
|
||||||
/// attestation.
|
/// attestation.
|
||||||
///
|
///
|
||||||
@ -694,7 +773,7 @@ impl BeaconState {
|
|||||||
|
|
||||||
/// Return the combined effective balance of an array of validators.
|
/// Return the combined effective balance of an array of validators.
|
||||||
///
|
///
|
||||||
/// Spec v0.5.1
|
/// Spec v0.6.0
|
||||||
pub fn get_total_balance(
|
pub fn get_total_balance(
|
||||||
&self,
|
&self,
|
||||||
validator_indices: &[usize],
|
validator_indices: &[usize],
|
||||||
|
Loading…
Reference in New Issue
Block a user