В каком порядке `on_initialize` вызывается для разных модулей во время выполнения субстрата? - PullRequest
3 голосов
/ 21 июня 2019

Мне нужно быть уверенным, что обработчик on_initialize для определенного модуля запускается раньше того же обработчика, чем все остальные модули в моей среде выполнения.

а) Как это обеспечить?

b) Есть ли какая-либо проверка во время компиляции или выполнения, которую я могу применить, чтобы абсолютно гарантировать, что это будет соблюдаться?

1 Ответ

4 голосов
/ 21 июня 2019

Функция 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 вызывается в том порядке, в котором вы определяете модули во время выполнения. Вам ничего не нужно делать, чтобы «гарантировать, что это будет соблюдаться», поскольку поток кода здесь последовательный и детерминированный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...