mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 20:21:06 +00:00
Introduce a Slot type (#7997)
* Introduce a `Slot` type Instead of having some type definition that only was used in half of the code or directly using `u64`, this adds a new unit type wrapper `Slot`. This makes it especially easy for the outside api to know what type is expected/returned. * Change epoch duratioC * rename all instances of slot number to slot * Make the constructor private Co-authored-by: André Silva <andrerfosilva@gmail.com>
This commit is contained in:
@@ -43,7 +43,7 @@ use sp_timestamp::OnTimestampSet;
|
||||
use sp_consensus_babe::{
|
||||
digests::{NextConfigDescriptor, NextEpochDescriptor, PreDigest},
|
||||
inherents::{BabeInherentData, INHERENT_IDENTIFIER},
|
||||
BabeAuthorityWeight, ConsensusLog, Epoch, EquivocationProof, SlotNumber, BABE_ENGINE_ID,
|
||||
BabeAuthorityWeight, ConsensusLog, Epoch, EquivocationProof, Slot, BABE_ENGINE_ID,
|
||||
};
|
||||
use sp_consensus_vrf::schnorrkel;
|
||||
use sp_inherents::{InherentData, InherentIdentifier, MakeFatalError, ProvideInherent};
|
||||
@@ -66,7 +66,7 @@ pub trait Config: pallet_timestamp::Config {
|
||||
/// The amount of time, in slots, that each epoch should last.
|
||||
/// NOTE: Currently it is not possible to change the epoch duration after
|
||||
/// the chain has started. Attempting to do so will brick block production.
|
||||
type EpochDuration: Get<SlotNumber>;
|
||||
type EpochDuration: Get<u64>;
|
||||
|
||||
/// The expected average block time at which BABE should be creating
|
||||
/// blocks. Since BABE is probabilistic it is not trivial to figure out
|
||||
@@ -168,10 +168,10 @@ decl_storage! {
|
||||
|
||||
/// The slot at which the first epoch actually started. This is 0
|
||||
/// until the first block of the chain.
|
||||
pub GenesisSlot get(fn genesis_slot): u64;
|
||||
pub GenesisSlot get(fn genesis_slot): Slot;
|
||||
|
||||
/// Current slot number.
|
||||
pub CurrentSlot get(fn current_slot): u64;
|
||||
pub CurrentSlot get(fn current_slot): Slot;
|
||||
|
||||
/// The epoch randomness for the *current* epoch.
|
||||
///
|
||||
@@ -403,7 +403,7 @@ impl<T: Config> Module<T> {
|
||||
// so we don't rotate the epoch.
|
||||
now != One::one() && {
|
||||
let diff = CurrentSlot::get().saturating_sub(Self::current_epoch_start());
|
||||
diff >= T::EpochDuration::get()
|
||||
*diff >= T::EpochDuration::get()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,7 +424,7 @@ impl<T: Config> Module<T> {
|
||||
pub fn next_expected_epoch_change(now: T::BlockNumber) -> Option<T::BlockNumber> {
|
||||
let next_slot = Self::current_epoch_start().saturating_add(T::EpochDuration::get());
|
||||
next_slot
|
||||
.checked_sub(CurrentSlot::get())
|
||||
.checked_sub(*CurrentSlot::get())
|
||||
.map(|slots_remaining| {
|
||||
// This is a best effort guess. Drifts in the slot/block ratio will cause errors here.
|
||||
let blocks_remaining: T::BlockNumber = slots_remaining.saturated_into();
|
||||
@@ -490,10 +490,10 @@ impl<T: Config> Module<T> {
|
||||
}
|
||||
}
|
||||
|
||||
// finds the start slot of the current epoch. only guaranteed to
|
||||
// give correct results after `do_initialize` of the first block
|
||||
// in the chain (as its result is based off of `GenesisSlot`).
|
||||
pub fn current_epoch_start() -> SlotNumber {
|
||||
/// Finds the start slot of the current epoch. only guaranteed to
|
||||
/// give correct results after `do_initialize` of the first block
|
||||
/// in the chain (as its result is based off of `GenesisSlot`).
|
||||
pub fn current_epoch_start() -> Slot {
|
||||
Self::epoch_start(EpochIndex::get())
|
||||
}
|
||||
|
||||
@@ -525,7 +525,7 @@ impl<T: Config> Module<T> {
|
||||
}
|
||||
}
|
||||
|
||||
fn epoch_start(epoch_index: u64) -> SlotNumber {
|
||||
fn epoch_start(epoch_index: u64) -> Slot {
|
||||
// (epoch_index * epoch_duration) + genesis_slot
|
||||
|
||||
const PROOF: &str = "slot number is u64; it should relate in some way to wall clock time; \
|
||||
@@ -535,7 +535,7 @@ impl<T: Config> Module<T> {
|
||||
.checked_mul(T::EpochDuration::get())
|
||||
.expect(PROOF);
|
||||
|
||||
epoch_start.checked_add(GenesisSlot::get()).expect(PROOF)
|
||||
epoch_start.checked_add(*GenesisSlot::get()).expect(PROOF).into()
|
||||
}
|
||||
|
||||
fn deposit_consensus<U: Encode>(new: U) {
|
||||
@@ -583,9 +583,9 @@ impl<T: Config> Module<T> {
|
||||
// on the first non-zero block (i.e. block #1)
|
||||
// this is where the first epoch (epoch #0) actually starts.
|
||||
// we need to adjust internal storage accordingly.
|
||||
if GenesisSlot::get() == 0 {
|
||||
GenesisSlot::put(digest.slot_number());
|
||||
debug_assert_ne!(GenesisSlot::get(), 0);
|
||||
if *GenesisSlot::get() == 0 {
|
||||
GenesisSlot::put(digest.slot());
|
||||
debug_assert_ne!(*GenesisSlot::get(), 0);
|
||||
|
||||
// deposit a log because this is the first block in epoch #0
|
||||
// we use the same values as genesis because we haven't collected any
|
||||
@@ -599,11 +599,11 @@ impl<T: Config> Module<T> {
|
||||
}
|
||||
|
||||
// the slot number of the current block being initialized
|
||||
let current_slot = digest.slot_number();
|
||||
let current_slot = digest.slot();
|
||||
|
||||
// how many slots were skipped between current and last block
|
||||
let lateness = current_slot.saturating_sub(CurrentSlot::get() + 1);
|
||||
let lateness = T::BlockNumber::from(lateness as u32);
|
||||
let lateness = T::BlockNumber::from(*lateness as u32);
|
||||
|
||||
Lateness::<T>::put(lateness);
|
||||
CurrentSlot::put(current_slot);
|
||||
@@ -684,7 +684,7 @@ impl<T: Config> Module<T> {
|
||||
key_owner_proof: T::KeyOwnerProof,
|
||||
) -> DispatchResultWithPostInfo {
|
||||
let offender = equivocation_proof.offender.clone();
|
||||
let slot_number = equivocation_proof.slot_number;
|
||||
let slot = equivocation_proof.slot;
|
||||
|
||||
// validate the equivocation proof
|
||||
if !sp_consensus_babe::check_equivocation_proof(equivocation_proof) {
|
||||
@@ -694,7 +694,7 @@ impl<T: Config> Module<T> {
|
||||
let validator_set_count = key_owner_proof.validator_count();
|
||||
let session_index = key_owner_proof.session();
|
||||
|
||||
let epoch_index = (slot_number.saturating_sub(GenesisSlot::get()) / T::EpochDuration::get())
|
||||
let epoch_index = (*slot.saturating_sub(GenesisSlot::get()) / T::EpochDuration::get())
|
||||
.saturated_into::<u32>();
|
||||
|
||||
// check that the slot number is consistent with the session index
|
||||
@@ -709,7 +709,7 @@ impl<T: Config> Module<T> {
|
||||
.ok_or(Error::<T>::InvalidKeyOwnershipProof)?;
|
||||
|
||||
let offence = BabeEquivocationOffence {
|
||||
slot: slot_number,
|
||||
slot,
|
||||
validator_set_count,
|
||||
offender,
|
||||
session_index,
|
||||
@@ -837,7 +837,7 @@ impl<T: Config> ProvideInherent for Module<T> {
|
||||
let timestamp_based_slot = (timestamp / Self::slot_duration()).saturated_into::<u64>();
|
||||
let seal_slot = data.babe_inherent_data()?;
|
||||
|
||||
if timestamp_based_slot == seal_slot {
|
||||
if timestamp_based_slot == *seal_slot {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(sp_inherents::Error::from("timestamp set in block doesn't match slot in seal").into())
|
||||
|
||||
Reference in New Issue
Block a user