frame/executive解剖
类型定义
pub type CheckedOf<E, C> = <E as Checkable<C>>::Checked; pub type CallOf<E, C> = <CheckedOf<E, C> as Applyable>::Call; pub type OriginOf<E, C> = <CallOf<E, C> as Dispatchable>::Origin;
特殊结构体定义(PhantomData)
/// Main entry point for certain runtime actions as e.g. `execute_block`. /// /// Generic parameters: /// - `System`: Something that implements `frame_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 by `AllPalletsWithSystem`. It will be called before all modules will be called. pub struct Executive< System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade = (), >( PhantomData<( System, Block, Context, UnsignedValidator, AllPalletsWithSystem, OnRuntimeUpgrade, )>, );
定义并实现许多方法
substrate/frame/executive/src/lib.rs
AllPalletsWithSystem, COnRuntimeUpgrade, >::execute_block(block); } } impl< System: frame_system::Config + EnsureInherentsAreFirst<Block>, Block: traits::Block<Header = System::Header, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<System::BlockNumber> + OnIdle<System::BlockNumber> + OnFinalize<System::BlockNumber> + OffchainWorker<System::BlockNumber>, COnRuntimeUpgrade: OnRuntimeUpgrade, > Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade> where Block::Extrinsic: Checkable<Context> + Codec,
实现trait中定义的方法
-
type
alias vsuse
- help - The Rust Programming Language Forum -
类型转换:
-
where与impl语法的对比:
substrate/frame/executive/src/lib.rs
- 下列trait限定的意思:
- 为Executive结构体实现ExecuteBlock这个trait的方法
- for Executive<…>:Executive本身是个结构体,用到了这些类型
- impl<…>:这些类型分别有哪些trait限定,要用到关联类型限定的,就放在where子句中
- where子句:主要先约束好关联类型Block::Extrinsic,给后面的使用
- 总结impl与where子句:这里将简单情况放在impl中,将复杂的关联类型限定放在where子句中。
- 关于CheckedOf、CallOf、OriginOf这三个:
- impl中的UnsignedValidator用到CallOf, CallOf用到CheckedOf
- (问题)OriginOf的用途
impl< System: frame_system::Config + EnsureInherentsAreFirst<Block>, Block: traits::Block<Header = System::Header, Hash = System::Hash>, Context: Default, UnsignedValidator, AllPalletsWithSystem: OnRuntimeUpgrade + OnInitialize<System::BlockNumber> + OnIdle<System::BlockNumber> + OnFinalize<System::BlockNumber> + OffchainWorker<System::BlockNumber>, COnRuntimeUpgrade: OnRuntimeUpgrade, > ExecuteBlock<Block> for Executive<System, Block, Context, UnsignedValidator, AllPalletsWithSystem, COnRuntimeUpgrade> // where // Block::Extrinsic: Checkable<Context> + Codec, // <Block::Extrinsic as Checkable<Context>>::Checked: Applyable + GetDispatchInfo, // <Block::Extrinsic as Checkable<Context>>::Checked as Applyable>::Call: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>, // <Block::Extrinsic as Checkable<Context>>::Checked as Applyable>::Call: From<Option<System::AccountId>>, // UnsignedValidator: ValidateUnsigned<Call = <Block::Extrinsic as Checkable<Context>>::Checked as Applyable>::Call>, where Block::Extrinsic: Checkable<Context> + Codec, CheckedOf<Block::Extrinsic, Context>: Applyable + GetDispatchInfo, CallOf<Block::Extrinsic, Context>: Dispatchable<Info = DispatchInfo, PostInfo = PostDispatchInfo>, OriginOf<Block::Extrinsic, Context>: From<Option<System::AccountId>>, UnsignedValidator: ValidateUnsigned<Call = CallOf<Block::Extrinsic, Context>>, { fn execute_block(block: Block) { Executive::< System, Block, Context,