async fn queue_next_block(&self, ctx: &ctx::Ctx, block: validator::Block) -> ctx::Result<()> {
        let mut payloads = sync::lock(ctx, &self.block_payloads).await?.into_async();
        let (p, j) = match &block {
            validator::Block::FinalV1(block) => (
                &block.payload,
                Some(BlockCertificate::V1(block.justification.clone())),
            ),
            validator::Block::FinalV2(block) => (
                &block.payload,
                Some(BlockCertificate::V2(block.justification.clone())),
            ),
            validator::Block::PreGenesis(block) => (&block.payload, None),
        };
        if let Some(payloads) = &mut *payloads {
            payloads
                .send(to_fetched_block(block.number(), p).context("to_fetched_block")?)
                .await
                .context("payloads.send()")?;
        }
        if let Some(certificate) = j {
            self.block_certificates.send(certificate);
        }
        Ok(())
    }
If actions queue is set (and the block has not been stored yet),
the block will be translated into a sequence of actions.
The received actions should be fed
to `ExternalIO`, so that `StateKeeper` will store the corresponding L2 block in the db.

`store_next_block()` call will wait synchronously for the L2 block.
Once the L2 block is observed in storage, `store_next_block()` will store a cert for this
L2 block.
core/node/consensus/src/storage/store.rs