{"record":{"id":"d4856f91861be863","repo":"FuelLabs/fuel-core","slug":"the-consensus-at-override-height-override-height","errorCode":null,"errorMessage":"The consensus at override height {override_height} is not PoA.","messagePattern":"The consensus at override height (.+?) is not PoA\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/fuel-core/src/service.rs","lineNumber":326,"sourceCode":"\n                    let block_header = on_chain_view\n                        .get_sealed_block_header(override_height)?\n                        .ok_or(not_found!(\"SealedBlockHeader\"))?;\n                    let header = block_header.entity;\n                    let seal = block_header.consensus;\n\n                    if let Consensus::PoA(poa_seal) = seal {\n                        let block_valid = verify_consensus(\n                            start_up_consensus_config,\n                            &header,\n                            &poa_seal,\n                        );\n\n                        if !block_valid {\n                            found_override_height = Some(override_height);\n                        }\n                    } else {\n                        return Err(anyhow::anyhow!(\n                            \"The consensus at override height {override_height} is not PoA.\"\n                        ));\n                    };\n                }\n            }\n        }\n\n        if let Some(override_height) = found_override_height {\n            let rollback_height = override_height.pred().ok_or(anyhow::anyhow!(\n                \"The override height is zero. \\\n                The override height should be greater than zero.\"\n            ))?;\n            tracing::warn!(\n                \"The consensus at override height {override_height} \\\n                does not match with the database. \\\n                Rollbacking the database to the height {rollback_height}\"\n            );\n            combined_database.rollback_to(rollback_height, shutdown_listener)?;","sourceCodeStart":308,"sourceCodeEnd":344,"githubUrl":"https://github.com/FuelLabs/fuel-core/blob/b9d4d170da3a31c9ace5f963d633b326348e0d42/crates/fuel-core/src/service.rs#L308-L344","documentation":"On startup, make_database_compatible_with_config verifies blocks at PoAV2 override heights against the new consensus signing keys, rolling back if they mismatch. This error fires when the sealed block header at an override height carries a consensus seal that is not Consensus::PoA at all, so it cannot be verified against the PoA config.","triggerScenarios":"Starting a node configured with PoAV2 signing-key overrides against a database whose block at that height was sealed with a different consensus variant (e.g. a PoW-sealed block from an old network, or data imported from another chain/config).","commonSituations":"Reusing a chain DB after switching consensus types or networks; override heights pointing at pre-migration blocks; snapshot/DB copied from a chain with different consensus; stale DB after a consensus-parameter/key rotation.","solutions":["Start with a fresh database or a snapshot whose blocks are PoA-sealed and match the current consensus config","Move the override heights so they only cover heights at/after blocks sealed under PoA with the new keys","Verify you are running the same network/chain config that produced the database"],"exampleFix":"# before\n# consensus.poa.signing_keys.overrides = { 1000 = \"new_key\" }\n# DB contains a PoW-sealed block at height 1000\n\n# after: wipe the mismatched DB or use a matching snapshot\nrm -rf ~/.fuel/db\n# or set overrides only at heights sealed with PoA:\n# [consensus.poa.signing_keys.overrides]\n# 5000 = \"new_key\"","handlingStrategy":"validation","validationCode":"// Rust operator: before starting with overrides, confirm the DB block at each override height is PoA-sealed\nfor &h in poa.get_all_overrides().keys() {\n    let sealed = on_chain_view.get_sealed_block_header(h)?.ok_or(not_found!(\"SealedBlockHeader\"))?;\n    ensure!(matches!(sealed.consensus, Consensus::PoA(_)), \"non-PoA block at {h}\");\n}","typeGuard":null,"tryCatchPattern":"match start_node().await { Err(e) if e.to_string().contains(\"is not PoA\") => { /* wipe/resnapshot the DB to match the consensus config, or move override heights past non-PoA blocks */ } r => r }","preventionTips":["Never reuse a database across chains or consensus-type changes; resnapshot instead","Set PoAV2 signing-key overrides only at heights at/after PoA-sealed blocks","Record the chain config hash with each DB snapshot and diff before startup"],"tags":["node","consensus","poa","database","startup"],"backgroundTag":null,"analyzedSha":"b9d4d170da3a31c9ace5f963d633b326348e0d42","analyzedAt":"2026-08-16T08:56:42.692Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}