Struct frame_executive::Executive
source · pub struct Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade = ()>(_);
Expand description
Main entry point for certain runtime actions as e.g. execute_block
.
Generic parameters:
-
System
: Something that implementsframe_system::Config
-
Block
: The block type of the runtime -
Context
: The context that is used when checking an extrinsic. -
UnsignedValidator
: The unsigned transaction validator of the runtime. -
AllPalletsWithSystem
: Tuple that contains all pallets including frame system pallet. Will be used to call hooks e.g.on_initialize
. -
OnRuntimeUpgrade
: Custom logic that should be called after a runtime upgrade. Modules are already called byAllPalletsWithSystem
. It will be called before all modules will be called.Executive
implementsExecuteBlock
that provieds two methodsexecute_block
that is responsible for execution of relay chain blocks (origin substrate impl)execute_block_ver
that is responsible for execution of parachain chain blocks (ver mangata impl)
VER block execution
Upon block execution.
- (if any) previous block extrinsics are executed, they are fetched from a queue that is
field
count
, it is used for notifying how many txs were fetched and executed by collator when the block was build. That information can be used to fetch specific amount of txs at once during block execution process. Every network participant needs to fetch and execute exactly same amount of txs from the storage queue to reach exactly the same state as block author. - (if any) new txs that were just collected from transaction pool are persisted into the storage
VER block execution includes number of steps that are not present in origin impl:
- shuffling seed validation
- enqueued txs size & weight limits validation
- validation of txs listed in block body
- malicious collator prevention (decoding txs)
txs from storage queue} D -- Fail --> E D -- OK --> F{Number of executed txs} F -- >0 --> G{StorageQeueu::is_empty
or Header::count >0} F -- 0 --> H G -- No --> E G -- Yes --> H{extrinsics from block body
== txs popped from
StorageQueue } H -- No --> E H -- Yes --> I{Verify that there are no new
enqueued txs if there is no room
in storage queue} I -- Fail --> E I -- Ok --> J{validate if local state == Header::state_root} J -- OK --> K[Accept block] B -- No ----> E[Reject block]
Implementations§
source§impl<System: Config + EnsureInherentsAreFirst<Block>, Block: Block<Header = HeaderFor<System>, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<BlockNumberFor<System>> + OnIdle<BlockNumberFor<System>> + OnFinalize<BlockNumberFor<System>> + OffchainWorker<BlockNumberFor<System>>, COnRuntimeUpgrade: OnRuntimeUpgrade> Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade>where
Block::Extrinsic: IdentifyAccountWithLookup<Context> + Checkable<Context> + Codec + GetDispatchInfo,
CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo,
CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo> + ExtendedCall,
OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>,
UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>,
impl<System: Config + EnsureInherentsAreFirst<Block>, Block: Block<Header = HeaderFor<System>, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<BlockNumberFor<System>> + OnIdle<BlockNumberFor<System>> + OnFinalize<BlockNumberFor<System>> + OffchainWorker<BlockNumberFor<System>>, COnRuntimeUpgrade: OnRuntimeUpgrade> Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade>where Block::Extrinsic: IdentifyAccountWithLookup<Context> + Checkable<Context> + Codec + GetDispatchInfo, CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo, CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo> + ExtendedCall, OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>, UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>,
sourcepub fn execute_on_runtime_upgrade() -> Weight
pub fn execute_on_runtime_upgrade() -> Weight
Execute all OnRuntimeUpgrade
of this runtime, and return the aggregate weight.
sourcepub fn initialize_block(header: &HeaderFor<System>)
pub fn initialize_block(header: &HeaderFor<System>)
Start the execution of a particular block.
sourcepub fn execute_block(block: Block)
pub fn execute_block(block: Block)
Actually execute all transitions for block
.
sourcepub fn execute_block_ver_impl(block: Block, public: Vec<u8>)
pub fn execute_block_ver_impl(block: Block, public: Vec<u8>)
Actually execute all transitions for block
.
sourcepub fn finalize_block() -> HeaderFor<System>
pub fn finalize_block() -> HeaderFor<System>
Finalize the block - it is up the caller to ensure that all header fields are valid except state-root.
sourcepub fn apply_extrinsic(uxt: Block::Extrinsic) -> ApplyExtrinsicResult
pub fn apply_extrinsic(uxt: Block::Extrinsic) -> ApplyExtrinsicResult
Apply extrinsic outside of the block execution function.
This doesn’t attempt to validate anything regarding the block, but it builds a list of uxt hashes.
sourcepub fn validate_transaction(
source: TransactionSource,
uxt: Block::Extrinsic,
block_hash: Block::Hash
) -> TransactionValidity
pub fn validate_transaction( source: TransactionSource, uxt: Block::Extrinsic, block_hash: Block::Hash ) -> TransactionValidity
Check a given signed transaction for validity. This doesn’t execute any side-effects; it merely checks whether the transaction would panic if it were included or not.
Changes made to storage should be discarded.
sourcepub fn offchain_worker(header: &HeaderFor<System>)
pub fn offchain_worker(header: &HeaderFor<System>)
Start an offchain worker and generate extrinsics.
Trait Implementations§
source§impl<System: Config + EnsureInherentsAreFirst<Block>, Block: Block<Header = HeaderFor<System>, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<BlockNumberFor<System>> + OnIdle<BlockNumberFor<System>> + OnFinalize<BlockNumberFor<System>> + OffchainWorker<BlockNumberFor<System>>, COnRuntimeUpgrade: OnRuntimeUpgrade> ExecuteBlock<Block> for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade>where
Block::Extrinsic: IdentifyAccountWithLookup<Context> + Checkable<Context> + Codec + GetDispatchInfo,
CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo,
CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo> + ExtendedCall,
OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>,
UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>,
impl<System: Config + EnsureInherentsAreFirst<Block>, Block: Block<Header = HeaderFor<System>, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<BlockNumberFor<System>> + OnIdle<BlockNumberFor<System>> + OnFinalize<BlockNumberFor<System>> + OffchainWorker<BlockNumberFor<System>>, COnRuntimeUpgrade: OnRuntimeUpgrade> ExecuteBlock<Block> for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade>where Block::Extrinsic: IdentifyAccountWithLookup<Context> + Checkable<Context> + Codec + GetDispatchInfo, CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo, CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo> + ExtendedCall, OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>, UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>,
source§fn execute_block(block: Block)
fn execute_block(block: Block)
block
. Read moreAuto Trait Implementations§
impl<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade> RefUnwindSafe for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade>where AllPalletsWithSystem: RefUnwindSafe, Block: RefUnwindSafe, Context: RefUnwindSafe, OnRuntimeUpgrade: RefUnwindSafe, System: RefUnwindSafe, UnsignedValidator: RefUnwindSafe,
impl<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade> Send for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade>where AllPalletsWithSystem: Send, Block: Send, Context: Send, OnRuntimeUpgrade: Send, System: Send, UnsignedValidator: Send,
impl<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade> Sync for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade>where AllPalletsWithSystem: Sync, Block: Sync, Context: Sync, OnRuntimeUpgrade: Sync, System: Sync, UnsignedValidator: Sync,
impl<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade> Unpin for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade>where AllPalletsWithSystem: Unpin, Block: Unpin, Context: Unpin, OnRuntimeUpgrade: Unpin, System: Unpin, UnsignedValidator: Unpin,
impl<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade> UnwindSafe for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade>where AllPalletsWithSystem: UnwindSafe, Block: UnwindSafe, Context: UnwindSafe, OnRuntimeUpgrade: UnwindSafe, System: UnwindSafe, UnsignedValidator: UnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
source§impl<T> FmtForward for T
impl<T> FmtForward for T
source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.source§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> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read moresource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.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<T> Tap for T
impl<T> Tap for T
source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read moresource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read moresource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read moresource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read moresource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read moresource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read moresource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.source§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
.