pub struct EpochChanges<Hash, Number, E: Epoch> { /* private fields */ }
Expand description

Tree of all epoch changes across all seen forks. Data stored in tree is the hash and block number of the block signaling the epoch change, and the epoch that was signalled at that block.

The first epoch, epoch_0, is special cased by saying that it starts at slot number of the first block in the chain. When bootstrapping a chain, there can be multiple competing block #1s, so we have to ensure that the overlayed DAG doesn’t get confused.

The first block of every epoch should be producing a descriptor for the next epoch - this is checked in higher-level code. So the first block of epoch_0 contains a descriptor for epoch_1. We special-case these and bundle them together in the same DAG entry, pinned to a specific block #1.

Further epochs (epoch_2, …, epoch_n) each get their own entry.

Implementations§

source§

impl<Hash, Number, E: Epoch> EpochChanges<Hash, Number, E>where Hash: PartialEq + Ord + AsRef<[u8]> + AsMut<[u8]> + Copy + Debug, Number: Ord + One + Zero + Add<Output = Number> + Sub<Output = Number> + Copy + Debug,

source

pub fn new() -> Self

Create a new epoch change.

source

pub fn rebalance(&mut self)

Rebalances the tree of epoch changes so that it is sorted by length of fork (longest fork first).

source

pub fn map<B, F>(self, f: F) -> EpochChanges<Hash, Number, B>where B: Epoch<Slot = E::Slot>, F: FnMut(&Hash, &Number, E) -> B,

Map the epoch changes from one storing data to a different one.

source

pub fn prune_finalized<D: IsDescendentOfBuilder<Hash>>( &mut self, descendent_of_builder: D, hash: &Hash, number: Number, slot: E::Slot ) -> Result<(), Error<D::Error>>

Prune out finalized epochs, except for the ancestor of the finalized block. The given slot should be the slot number at which the finalized block was authored.

source

pub fn epoch(&self, id: &EpochIdentifier<Hash, Number>) -> Option<&E>

Get a reference to an epoch with given identifier.

source

pub fn viable_epoch<G>( &self, descriptor: &ViableEpochDescriptor<Hash, Number, E>, make_genesis: G ) -> Option<ViableEpoch<E, &E>>where G: FnOnce(E::Slot) -> E,

Get a reference to a viable epoch with given descriptor.

source

pub fn epoch_mut( &mut self, id: &EpochIdentifier<Hash, Number> ) -> Option<&mut E>

Get a mutable reference to an epoch with given identifier.

source

pub fn viable_epoch_mut<G>( &mut self, descriptor: &ViableEpochDescriptor<Hash, Number, E>, make_genesis: G ) -> Option<ViableEpoch<E, &mut E>>where G: FnOnce(E::Slot) -> E,

Get a mutable reference to a viable epoch with given descriptor.

source

pub fn epoch_data<G>( &self, descriptor: &ViableEpochDescriptor<Hash, Number, E>, make_genesis: G ) -> Option<E>where G: FnOnce(E::Slot) -> E, E: Clone,

Get the epoch data from an epoch descriptor.

Note that this function ignores the fact that an genesis epoch might need to be imported. Mostly useful for testing.

source

pub fn epoch_data_for_child_of<D: IsDescendentOfBuilder<Hash>, G>( &self, descendent_of_builder: D, parent_hash: &Hash, parent_number: Number, slot: E::Slot, make_genesis: G ) -> Result<Option<E>, Error<D::Error>>where G: FnOnce(E::Slot) -> E, E: Clone,

Finds the epoch data for a child of the given block. Similar to epoch_descriptor_for_child_of but returns the full data.

Note that this function ignores the fact that an genesis epoch might need to be imported. Mostly useful for testing.

source

pub fn epoch_descriptor_for_child_of<D: IsDescendentOfBuilder<Hash>>( &self, descendent_of_builder: D, parent_hash: &Hash, parent_number: Number, slot: E::Slot ) -> Result<Option<ViableEpochDescriptor<Hash, Number, E>>, Error<D::Error>>

Finds the epoch for a child of the given block, assuming the given slot number.

If the returned epoch is an UnimportedGenesis epoch, it should be imported into the tree.

source

pub fn import<D: IsDescendentOfBuilder<Hash>>( &mut self, descendent_of_builder: D, hash: Hash, number: Number, parent_hash: Hash, epoch: IncrementedEpoch<E> ) -> Result<(), Error<D::Error>>

Import a new epoch-change, signalled at the given block.

This assumes that the given block is prospective (i.e. has not been imported yet), but its parent has. This is why the parent hash needs to be provided.

source

pub fn reset( &mut self, parent_hash: Hash, hash: Hash, number: Number, current: E, next: E )

Reset to a specified pair of epochs, as if they were announced at blocks parent_hash and hash.

source

pub fn revert<D: IsDescendentOfBuilder<Hash>>( &mut self, descendent_of_builder: D, hash: Hash, number: Number )

Revert to a specified block given its hash and number. This removes all the epoch changes information that were announced by all the given block descendents.

source

pub fn tree(&self) -> &ForkTree<Hash, Number, PersistedEpochHeader<E>>

Return the inner fork tree (mostly useful for testing)

Trait Implementations§

source§

impl<Hash: Clone, Number: Clone, E: Clone + Epoch> Clone for EpochChanges<Hash, Number, E>

source§

fn clone(&self) -> EpochChanges<Hash, Number, E>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Hash: Debug, Number: Debug, E: Debug + Epoch> Debug for EpochChanges<Hash, Number, E>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<Hash, Number, E: Epoch> Decode for EpochChanges<Hash, Number, E>where ForkTree<Hash, Number, PersistedEpochHeader<E>>: Decode, BTreeMap<(Hash, Number), PersistedEpoch<E>>: Decode,

source§

fn decode<__CodecInputEdqy: Input>( __codec_input_edqy: &mut __CodecInputEdqy ) -> Result<Self, Error>

Attempt to deserialise the value from input.
§

fn decode_into<I>( input: &mut I, dst: &mut MaybeUninit<Self> ) -> Result<DecodeFinished, Error>where I: Input,

Attempt to deserialize the value from input into a pre-allocated piece of memory. Read more
§

fn skip<I>(input: &mut I) -> Result<(), Error>where I: Input,

Attempt to skip the encoded value from input. Read more
§

fn encoded_fixed_size() -> Option<usize>

Returns the fixed encoded size of the type. Read more
source§

impl<Hash, Number, E: Epoch> Default for EpochChanges<Hash, Number, E>where Hash: PartialEq + Ord, Number: Ord,

source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<Hash, Number, E: Epoch> Encode for EpochChanges<Hash, Number, E>where ForkTree<Hash, Number, PersistedEpochHeader<E>>: Encode, BTreeMap<(Hash, Number), PersistedEpoch<E>>: Encode,

source§

fn encode_to<__CodecOutputEdqy: Output + ?Sized>( &self, __codec_dest_edqy: &mut __CodecOutputEdqy )

Convert self to a slice and append it to the destination.
§

fn size_hint(&self) -> usize

If possible give a hint of expected size of the encoding. Read more
§

fn encode(&self) -> Vec<u8, Global>

Convert self to an owned vector.
§

fn using_encoded<R, F>(&self, f: F) -> Rwhere F: FnOnce(&[u8]) -> R,

Convert self to a slice and then invoke the given closure with it.
§

fn encoded_size(&self) -> usize

Calculates the encoded size. Read more
source§

impl<Hash, Number, E: Epoch> EncodeLike<EpochChanges<Hash, Number, E>> for EpochChanges<Hash, Number, E>where ForkTree<Hash, Number, PersistedEpochHeader<E>>: Encode, BTreeMap<(Hash, Number), PersistedEpoch<E>>: Encode,

Auto Trait Implementations§

§

impl<Hash, Number, E> RefUnwindSafe for EpochChanges<Hash, Number, E>where E: RefUnwindSafe, Hash: RefUnwindSafe, Number: RefUnwindSafe, <E as Epoch>::Slot: RefUnwindSafe,

§

impl<Hash, Number, E> Send for EpochChanges<Hash, Number, E>where E: Send, Hash: Send, Number: Send, <E as Epoch>::Slot: Send,

§

impl<Hash, Number, E> Sync for EpochChanges<Hash, Number, E>where E: Sync, Hash: Sync, Number: Sync, <E as Epoch>::Slot: Sync,

§

impl<Hash, Number, E> Unpin for EpochChanges<Hash, Number, E>where Hash: Unpin, Number: Unpin, <E as Epoch>::Slot: Unpin,

§

impl<Hash, Number, E> UnwindSafe for EpochChanges<Hash, Number, E>where E: RefUnwindSafe, Hash: UnwindSafe + RefUnwindSafe, Number: UnwindSafe + RefUnwindSafe, <E as Epoch>::Slot: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Any for Twhere T: Any,

§

fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>

§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>

§

fn type_name(&self) -> &'static str

§

impl<T> AnySync for Twhere T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send + 'static>

source§

impl<T> Borrow<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

const: unstable · source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CheckedConversion for T

source§

fn checked_from<T>(t: T) -> Option<Self>where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
source§

fn checked_into<T>(self) -> Option<T>where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
§

impl<T> DecodeAll for Twhere T: Decode,

§

fn decode_all(input: &mut &[u8]) -> Result<T, Error>

Decode Self and consume all of the given input data. Read more
§

impl<T> DecodeLimit for Twhere T: Decode,

§

fn decode_all_with_depth_limit( limit: u32, input: &mut &[u8] ) -> Result<T, Error>

Decode Self and consume all of the given input data. Read more
§

fn decode_with_depth_limit<I>(limit: u32, input: &mut I) -> Result<T, Error>where I: Input,

Decode Self with the given maximum recursion depth and advance input by the number of bytes consumed. Read more
source§

impl<T> DynClone for Twhere T: Clone,

source§

fn __clone_box(&self, _: Private) -> *mut ()

source§

impl<T> From<T> for T

const: unstable · source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for Twhere U: From<T>,

const: unstable · source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, Outer> IsWrappedBy<Outer> for Twhere Outer: AsRef<T> + AsMut<T> + From<T>, T: From<Outer>,

source§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

source§

fn from_mut(outer: &mut Outer) -> &mut T

Get a mutable reference to the inner from the outer.

§

impl<T> KeyedVec for Twhere T: Codec,

§

fn to_keyed_vec(&self, prepend_key: &[u8]) -> Vec<u8, Global>

Return an encoding of Self prepended by given slice.
§

impl<T> Pointable for T

§

const ALIGN: usize = mem::align_of::<T>()

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatedConversion for T

source§

fn saturated_from<T>(t: T) -> Selfwhere Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
source§

fn saturated_into<T>(self) -> Twhere Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of T. Read more
source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
const: unstable · source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
const: unstable · source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<S, T> UncheckedInto<T> for Swhere T: UncheckedFrom<S>,

source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
source§

impl<T, S> UniqueSaturatedInto<T> for Swhere T: Bounded, S: TryInto<T>,

source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
§

impl<S> Codec for Swhere S: Decode + Encode,

§

impl<T> EncodeLike<&&T> for Twhere T: Encode,

§

impl<T> EncodeLike<&T> for Twhere T: Encode,

§

impl<T> EncodeLike<&mut T> for Twhere T: Encode,

§

impl<T> EncodeLike<Arc<T>> for Twhere T: Encode,

§

impl<T> EncodeLike<Box<T, Global>> for Twhere T: Encode,

§

impl<'a, T> EncodeLike<Cow<'a, T>> for Twhere T: ToOwned + Encode,

§

impl<T> EncodeLike<Rc<T>> for Twhere T: Encode,

§

impl<S> FullCodec for Swhere S: Decode + FullEncode,

§

impl<S> FullEncode for Swhere S: Encode + EncodeLike<S>,

§

impl<T> JsonSchemaMaybe for T

§

impl<T> MaybeDebug for Twhere T: Debug,

source§

impl<T> MaybeRefUnwindSafe for Twhere T: RefUnwindSafe,