mirror of
https://gitlab.com/pulsechaincom/lighthouse-pulse.git
synced 2025-01-02 09:17:39 +00:00
Tidy BeaconStateBuilder struct
This commit is contained in:
parent
c33e299176
commit
e99da31da8
@ -1,24 +1,14 @@
|
|||||||
use super::BeaconStateError;
|
use super::BeaconStateError;
|
||||||
|
use crate::validator_registry::get_active_validator_indices;
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use crate::{validator_registry::get_active_validator_indices, *};
|
|
||||||
use bls::create_proof_of_possession;
|
|
||||||
use rayon::prelude::*;
|
use rayon::prelude::*;
|
||||||
use ssz::TreeHash;
|
use ssz::TreeHash;
|
||||||
|
|
||||||
/// Builds a `BeaconState` for use in testing or benchmarking.
|
/// Builds a `BeaconState` for use in production.
|
||||||
///
|
///
|
||||||
/// Building the `BeaconState` is a three step processes:
|
/// This struct should not be modified for use in testing scenarios. Use `TestingBeaconStateBuilder` for that purpose.
|
||||||
///
|
///
|
||||||
/// 1. Create a new `BeaconStateBuilder`.
|
/// This struct should remain safe and sensible for production usage.
|
||||||
/// 2. Call `Self::build()` or `Self::build_fast()` generate a `BeaconState`.
|
|
||||||
/// 3. (Optional) Use builder functions to modify the `BeaconState`.
|
|
||||||
/// 4. Call `Self::cloned_state()` to obtain a `BeaconState` cloned from this struct.
|
|
||||||
///
|
|
||||||
/// Step (2) happens prior to step (3) because some functionality requires an existing
|
|
||||||
/// `BeaconState`.
|
|
||||||
///
|
|
||||||
/// Step (4) produces a clone of the BeaconState and doesn't consume the `BeaconStateBuilder` to
|
|
||||||
/// allow access to `self.keypairs` and `self.spec`.
|
|
||||||
pub struct BeaconStateBuilder {
|
pub struct BeaconStateBuilder {
|
||||||
pub state: BeaconState,
|
pub state: BeaconState,
|
||||||
}
|
}
|
||||||
@ -105,139 +95,4 @@ impl BeaconStateBuilder {
|
|||||||
|
|
||||||
Ok(self.state)
|
Ok(self.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
/// Sets the `BeaconState` to be in the last slot of the given epoch.
|
|
||||||
///
|
|
||||||
/// Sets all justification/finalization parameters to be be as "perfect" as possible (i.e.,
|
|
||||||
/// highest justified and finalized slots, full justification bitfield, etc).
|
|
||||||
pub fn teleport_to_end_of_epoch(&mut self, epoch: Epoch, spec: &ChainSpec) {
|
|
||||||
let state = &mut self.state;
|
|
||||||
|
|
||||||
let slot = epoch.end_slot(spec.slots_per_epoch);
|
|
||||||
|
|
||||||
state.slot = slot;
|
|
||||||
state.validator_registry_update_epoch = epoch - 1;
|
|
||||||
|
|
||||||
state.previous_shuffling_epoch = epoch - 1;
|
|
||||||
state.current_shuffling_epoch = epoch;
|
|
||||||
|
|
||||||
state.previous_shuffling_seed = Hash256::from_low_u64_le(0);
|
|
||||||
state.current_shuffling_seed = Hash256::from_low_u64_le(1);
|
|
||||||
|
|
||||||
state.previous_justified_epoch = epoch - 2;
|
|
||||||
state.justified_epoch = epoch - 1;
|
|
||||||
state.justification_bitfield = u64::max_value();
|
|
||||||
state.finalized_epoch = epoch - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Creates a full set of attestations for the `BeaconState`. Each attestation has full
|
|
||||||
/// participation from its committee and references the expected beacon_block hashes.
|
|
||||||
///
|
|
||||||
/// These attestations should be fully conducive to justification and finalization.
|
|
||||||
pub fn insert_attestations(&mut self) {
|
|
||||||
let state = &mut self.state;
|
|
||||||
|
|
||||||
state
|
|
||||||
.build_epoch_cache(RelativeEpoch::Previous, &self.spec)
|
|
||||||
.unwrap();
|
|
||||||
state
|
|
||||||
.build_epoch_cache(RelativeEpoch::Current, &self.spec)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let current_epoch = state.current_epoch(&self.spec);
|
|
||||||
let previous_epoch = state.previous_epoch(&self.spec);
|
|
||||||
let current_epoch_depth =
|
|
||||||
(state.slot - current_epoch.end_slot(self.spec.slots_per_epoch)).as_usize();
|
|
||||||
|
|
||||||
let previous_epoch_slots = previous_epoch.slot_iter(self.spec.slots_per_epoch);
|
|
||||||
let current_epoch_slots = current_epoch
|
|
||||||
.slot_iter(self.spec.slots_per_epoch)
|
|
||||||
.take(current_epoch_depth);
|
|
||||||
|
|
||||||
for slot in previous_epoch_slots.chain(current_epoch_slots) {
|
|
||||||
let committees = state
|
|
||||||
.get_crosslink_committees_at_slot(slot, &self.spec)
|
|
||||||
.unwrap()
|
|
||||||
.clone();
|
|
||||||
|
|
||||||
for (committee, shard) in committees {
|
|
||||||
state
|
|
||||||
.latest_attestations
|
|
||||||
.push(committee_to_pending_attestation(
|
|
||||||
state, &committee, shard, slot, &self.spec,
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a cloned `BeaconState`.
|
|
||||||
pub fn cloned_state(&self) -> BeaconState {
|
|
||||||
self.state.as_ref().expect("Genesis required").clone()
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
/// Builds a valid PendingAttestation with full participation for some committee.
|
|
||||||
fn committee_to_pending_attestation(
|
|
||||||
state: &BeaconState,
|
|
||||||
committee: &[usize],
|
|
||||||
shard: u64,
|
|
||||||
slot: Slot,
|
|
||||||
spec: &ChainSpec,
|
|
||||||
) -> PendingAttestation {
|
|
||||||
let current_epoch = state.current_epoch(spec);
|
|
||||||
let previous_epoch = state.previous_epoch(spec);
|
|
||||||
|
|
||||||
let mut aggregation_bitfield = Bitfield::new();
|
|
||||||
let mut custody_bitfield = Bitfield::new();
|
|
||||||
|
|
||||||
for (i, _) in committee.iter().enumerate() {
|
|
||||||
aggregation_bitfield.set(i, true);
|
|
||||||
custody_bitfield.set(i, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
let is_previous_epoch =
|
|
||||||
state.slot.epoch(spec.slots_per_epoch) != slot.epoch(spec.slots_per_epoch);
|
|
||||||
|
|
||||||
let justified_epoch = if is_previous_epoch {
|
|
||||||
state.previous_justified_epoch
|
|
||||||
} else {
|
|
||||||
state.justified_epoch
|
|
||||||
};
|
|
||||||
|
|
||||||
let epoch_boundary_root = if is_previous_epoch {
|
|
||||||
*state
|
|
||||||
.get_block_root(previous_epoch.start_slot(spec.slots_per_epoch), spec)
|
|
||||||
.unwrap()
|
|
||||||
} else {
|
|
||||||
*state
|
|
||||||
.get_block_root(current_epoch.start_slot(spec.slots_per_epoch), spec)
|
|
||||||
.unwrap()
|
|
||||||
};
|
|
||||||
|
|
||||||
let justified_block_root = *state
|
|
||||||
.get_block_root(justified_epoch.start_slot(spec.slots_per_epoch), &spec)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
PendingAttestation {
|
|
||||||
aggregation_bitfield,
|
|
||||||
data: AttestationData {
|
|
||||||
slot,
|
|
||||||
shard,
|
|
||||||
beacon_block_root: *state.get_block_root(slot, spec).unwrap(),
|
|
||||||
epoch_boundary_root,
|
|
||||||
crosslink_data_root: Hash256::zero(),
|
|
||||||
latest_crosslink: Crosslink {
|
|
||||||
epoch: slot.epoch(spec.slots_per_epoch),
|
|
||||||
crosslink_data_root: Hash256::zero(),
|
|
||||||
},
|
|
||||||
justified_epoch,
|
|
||||||
justified_block_root,
|
|
||||||
},
|
|
||||||
custody_bitfield,
|
|
||||||
inclusion_slot: slot,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
Loading…
Reference in New Issue
Block a user