Функция on_initialize
для каждого модуля времени выполнения субстрата вызывается через исполнительный модуль , который обрабатывает все вещи верхнего уровня; по сути, просто выполнение блоков / внешних элементов.
Каждый раз, когда выполняется блок (execute_block
), сначала вызывается initialize_block
, что в конечном итоге вызывает блок on_initalize
для типа AllModules
:
srml / руководитель / SRC / lib.rs
<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
вызывается в том порядке, в котором вы определяете модули во время выполнения. Вам ничего не нужно делать, чтобы «гарантировать, что это будет соблюдаться», поскольку поток кода здесь последовательный и детерминированный.