I have a chain with 4 validators. When I chilled 1 old validator and added 1 new, the chain has stopped finalization. Nodes show the following error:

Oct 14 09:48:42 node4 polkadot[24877]: 2022-10-14 09:48:42  ✨ Imported #7735136 (0x81cc…c93f)
Oct 14 09:58:48 node4 polkadot[24877]: 2022-10-14 09:58:48  🙌 Starting consensus session on top of parent 0x81cca4dbb445e52a2cd6c329f4fc7c35ebf9cbdca0ab6dd1aee252da8089c93f
Oct 14 09:58:48 node4 polkadot[24877]: 2022-10-14 09:58:48  could not get provisioner inherent data; injecting default data err=ClosedChannelAwaitingInherentData
Oct 14 09:58:48 node4 polkadot[24877]: 2022-10-14 09:58:48  🎁 Prepared block for proposing at 7735137 [hash: 0x06a7cdf092dcb5ba8cf7cbdc3c94dce94f3f83fc75110d2e43005edbfb4455b4; parent_hash: 0x81cc…c93f; extrinsics (1): [0x3d39…5756]]

How to fix it?

The chain: http://ws.slonigiraf.org/#/explorer Telemetry: https://telemetry.polkadot.io/#list/0x596245dfe0d724c621946ae8b63c3ab850d3bc0f867592857092dc062f49e3e4

  • perhaps make title more human readable to get better results. Oct 14, 2022 at 13:30
  • The link to your explorer times out. After this error does your chain produce blocks normally?
    – Bruno
    Oct 16, 2022 at 14:49

2 Answers 2


Adding a bit more context to this issue as it may help you solve the issue.

Looks like the error is coming from the parachain inherent data provider logic.

For context on the parachain inherent data provider:

Parachain backing and approval is an off-chain process, but the parachain needs to progress on chain as well. To make it progress on chain a block producer needs to forward information about the state of a parachain to the runtime. This information is forwarded through an inherent to the runtime. Here we provide the [ParachainInherentDataProvider] that requests the relevant data from the provisioner subsystem and creates the the inherent data that the runtime will use to create an inherent.

The error is originating from here:

let inherent_data = match res {
    Ok(pd) => ParachainsInherentData {
        bitfields: pd.bitfields.into_iter().map(Into::into).collect(),
        backed_candidates: pd.backed_candidates,
        disputes: pd.disputes,
    Err(err) => {
            target: LOG_TARGET,
            "Could not get provisioner inherent data; injecting default data",
        ParachainsInherentData {
            bitfields: Vec::new(),
            backed_candidates: Vec::new(),
            disputes: Vec::new(),

And the pd is not available because of this error:

receiver.await.map_err(|_| Error::ClosedChannelAwaitingInherentData)

Some context on requesting the inherent data:

When a validator is selected by BABE to author a block, it becomes a block producer. The provisioner is the subsystem best suited to choosing which specific backed candidates and availability bitfields should be assembled into the block. To engage this functionality, a ProvisionerMessage::RequestInherentData is sent; the response is a ParaInherentData.


Check the total amount on stake - if it goes under the specific limit, the Granpa stops finalizing.

  • Care to improve this with reference to why this is the case?
    – Nuke
    Oct 20, 2022 at 21:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.