我需要确保on_initialize
特定模块的处理程序在我的运行时中的所有其他模块之前在同一处理程序之前运行。
a) 如何确保这一点?
b) 是否有一些编译或运行时检查我可以强制执行以绝对保证这将得到尊重?
我需要确保on_initialize
特定模块的处理程序在我的运行时中的所有其他模块之前在同一处理程序之前运行。
a) 如何确保这一点?
b) 是否有一些编译或运行时检查我可以强制执行以绝对保证这将得到尊重?
on_initialize
每个 Substrate 运行时模块的函数通过执行模块调用,该模块处理所有顶级内容;基本上只是执行块/外部。
每次执行一个块(execute_block
)时,首先initialize_block
调用它最终调用该类型的on_initalize
块AllModules
:
<AllModules as OnInitialize<System::BlockNumber>>::on_initialize(*block_number);
该AllModules
类型是运行时中不同模块标识符的元组。它由construct_runtime!
宏生成并按照您在宏中定义它们的顺序列出模块。例如,对于给定的construct_runtime!
定义:
construct_runtime!(
pub enum Runtime with Log(InternalLog: DigestItem<Hash, AuthorityId, AuthoritySignature>) where
Block = Block,
NodeBlock = opaque::Block,
UncheckedExtrinsic = UncheckedExtrinsic
{
System: system::{default, Log(ChangesTrieRoot)},
Timestamp: timestamp::{Module, Call, Storage, Config<T>, Inherent},
Consensus: consensus::{Module, Call, Storage, Config<T>, Log(AuthoritiesChange), Inherent},
Aura: aura::{Module},
Indices: indices,
Balances: balances,
Sudo: sudo,
// Used for the module template in `./template.rs`
TemplateModule: template::{Module, Call, Storage, Event<T>},
TemplateModule1: template1::{Module, Call, Storage, Event<T>},
TemplateModule2: template2::{Module, Call, Storage, Event<T>},
}
);
您将获得以下AllModules
类型:
type AllModules = (Timestamp, Consensus, Aura, Indices, Balances, Sudo, TemplateModule, TemplateModule1, TemplateModule2);
因此,on_initialize
按照您在运行时中定义模块的顺序调用该函数。您不需要做任何事情来“确保尊重这一点”,因为这里的代码流是连续的和确定的。