pub struct ParentBlockRandomness<T>(_);
Expand description

Randomness produced semi-freshly with each block, but inherits limitations of RandomnessFromTwoEpochsAgo from which it derives.

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.

As with RandomnessFromTwoEpochsAgo, all input commitments combined with ParentBlockRandomness should come from at least two epoch ago, except preferably not near epoch ending, and thus ideally three epochs ago.

Almost all users learn this randomness for a given block by the time they receive it’s parent block, which makes this randomness appear fresh enough. Yet, the block producer themselves learned this randomness at the beginning of epoch current_epoch - 2, at the same time as they learn RandomnessFromTwoEpochsAgo.

Aside from just biasing RandomnessFromTwoEpochsAgo, adversaries could also bias ParentBlockRandomness by never announcing their block if doing so yields an unfavorable randomness. As such, ParentBlockRandomness should be considered weaker than both other randomness sources provided by BABE, but ParentBlockRandomness remains constrained by declared staking, while a randomness source like block hash is only constrained by adversaries’ unknowable computational power.

As an example use, parachains could assign block production slots based upon the ParentBlockRandomness of their relay parent or relay parent’s parent, provided the parachain registers collators but avoids censorship sensitive functionality like slashing. Any parachain with slashing could operate BABE itself or perhaps better yet a BABE-like approach that derives its ParentBlockRandomness, and authorizes block production, based upon the relay parent’s ParentBlockRandomness or more likely the relay parent’s RandomnessFromTwoEpochsAgo.

NOTE: there is some nuance here regarding what is current and parent randomness. If you are using this trait from within the runtime (i.e. as part of block execution) then the randomness provided here will always be generated from the parent block. If instead you are using this randomness externally, i.e. after block execution, then this randomness will be provided by the “current” block (this stems from the fact that we process VRF outputs on block execution finalization, i.e. on_finalize).

Trait Implementations§

source§

impl<T: Config> Randomness<Option<<T as Config>::Hash>, <<<T as Config>::Block as HeaderProvider>::HeaderT as Header>::Number> for ParentBlockRandomness<T>

source§

fn random(subject: &[u8]) -> (Option<T::Hash>, BlockNumberFor<T>)

Get the most recently determined random seed, along with the time in the past since when it was determinable by chain observers. Read more
source§

fn random_seed() -> (Output, BlockNumber)

Get the basic random seed. Read more

Auto Trait Implementations§

§

impl<T> RefUnwindSafe for ParentBlockRandomness<T>where T: RefUnwindSafe,

§

impl<T> Send for ParentBlockRandomness<T>where T: Send,

§

impl<T> Sync for ParentBlockRandomness<T>where T: Sync,

§

impl<T> Unpin for ParentBlockRandomness<T>where T: Unpin,

§

impl<T> UnwindSafe for ParentBlockRandomness<T>where T: 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
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
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> IsType<T> for T

source§

fn from_ref(t: &T) -> &T

Cast reference.
source§

fn into_ref(&self) -> &T

Cast reference.
source§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
source§

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

Cast mutable reference.
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> 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
§

impl<SS, SP> SupersetOf<SS> for SPwhere SS: SubsetOf<SP>,

§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
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<T> JsonSchemaMaybe for T

source§

impl<T> MaybeRefUnwindSafe for Twhere T: RefUnwindSafe,