Struct pallet_babe::RandomnessFromTwoEpochsAgo
source · pub struct RandomnessFromTwoEpochsAgo<T>(_);
Expand description
Randomness usable by consensus protocols that depend upon finality and take action based upon on-chain commitments made during the epoch before the previous epoch.
An off-chain consensus protocol requires randomness be finalized before usage, but one
extra epoch delay beyond RandomnessFromOneEpochAgo
suffices, under the assumption
that finality never stalls for longer than one epoch.
All randomness is relative to commitments to any other inputs to the computation: If Alice samples randomness near perfectly using radioactive decay, but then afterwards Eve selects an arbitrary value with which to xor Alice’s randomness, then Eve always wins whatever game they play.
All input commitments used with RandomnessFromTwoEpochsAgo
should come from at least
three epochs ago. We require BABE session keys be registered at least three epochs
before being used to derive ParentBlockRandomness
for example.
All users learn RandomnessFromTwoEpochsAgo
when epoch current_epoch - 1
starts,
although some learn it a few block earlier inside epoch current_epoch - 2
.
Adversaries with enough block producers could bias this randomness by choosing upon
what their block producers build at the end of epoch current_epoch - 2
or the
beginning epoch current_epoch - 1
, or skipping slots at the end of epoch
current_epoch - 2
.
Adversaries should not possess many block production slots towards the beginning or end of every epoch, but they possess some influence over when they possess more slots.
Trait Implementations§
source§impl<T: Config> Randomness<<T as Config>::Hash, <T as Config>::BlockNumber> for RandomnessFromTwoEpochsAgo<T>
impl<T: Config> Randomness<<T as Config>::Hash, <T as Config>::BlockNumber> for RandomnessFromTwoEpochsAgo<T>
source§fn random(subject: &[u8]) -> (T::Hash, T::BlockNumber)
fn random(subject: &[u8]) -> (T::Hash, T::BlockNumber)
source§fn random_seed() -> (Output, BlockNumber)
fn random_seed() -> (Output, BlockNumber)
Auto Trait Implementations§
impl<T> RefUnwindSafe for RandomnessFromTwoEpochsAgo<T>where
T: RefUnwindSafe,
impl<T> Send for RandomnessFromTwoEpochsAgo<T>where
T: Send,
impl<T> Sync for RandomnessFromTwoEpochsAgo<T>where
T: Sync,
impl<T> Unpin for RandomnessFromTwoEpochsAgo<T>where
T: Unpin,
impl<T> UnwindSafe for RandomnessFromTwoEpochsAgo<T>where
T: UnwindSafe,
Blanket Implementations§
source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
source§fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
. Read moresource§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any + 'static>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
. Read moresource§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s. Read moresource§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s. Read moresource§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T, Outer> IsWrappedBy<Outer> for Twhere
Outer: AsRef<T> + AsMut<T> + From<T>,
T: From<Outer>,
impl<T, Outer> IsWrappedBy<Outer> for Twhere
Outer: AsRef<T> + AsMut<T> + From<T>,
T: From<Outer>,
source§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
source§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
source§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T
. Read moresource§impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
source§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from
.source§impl<T, S> UniqueSaturatedInto<T> for Swhere
T: Bounded,
S: TryInto<T>,
impl<T, S> UniqueSaturatedInto<T> for Swhere
T: Bounded,
S: TryInto<T>,
source§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T
.