fn add_storage_initialization_layer(mut self, kind: LayerKind) -> anyhow::Result<Self> {
        let eth_watcher_config = try_load_config!(self.configs.eth).watcher;

        self.node.add_layer(MainNodeInitStrategyLayer {
            genesis: self.genesis_config.clone(),
            event_expiration_blocks: eth_watcher_config.event_expiration_blocks,
        });
        let mut layer = NodeStorageInitializerLayer::new();
        if matches!(kind, LayerKind::Precondition) {
            layer = layer.as_precondition();
        }
        self.node.add_layer(layer);
        Ok(self)
    }
This layer will make sure that the database is initialized correctly,
e.g. genesis will be performed if it's required.

Depending on the `kind` provided, either a task or a precondition will be added.

*Important*: the task should be added by at most one component, because
it assumes unique control over the database. Multiple components adding this
layer in a distributed mode may result in the database corruption.

This task works in pair with precondition, which must be present in every component:
the precondition will prevent node from starting until the database is initialized.
core/bin/zksync_server/src/node_builder.rs