{"record":{"id":"d2dcef070a5208c2","repo":"hyperledger/fabric","slug":"no-orderer-section-in-config-block-d2dcef","errorCode":null,"errorMessage":"no orderer section in config block","messagePattern":"no orderer section in config block","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/cluster/util.go","lineNumber":408,"sourceCode":"func BlockVerifierBuilder(bccsp bccsp.BCCSP) func(block *common.Block) protoutil.BlockVerifierFunc {\n\treturn func(block *common.Block) protoutil.BlockVerifierFunc {\n\t\tbundle, failed := bundleFromConfigBlock(block, bccsp)\n\t\tif failed != nil {\n\t\t\treturn failed\n\t\t}\n\n\t\tpolicy, exists := bundle.PolicyManager().GetPolicy(policies.BlockValidation)\n\t\tif !exists {\n\t\t\treturn createErrorFunc(errors.New(\"no policies in config block\"))\n\t\t}\n\n\t\tbftEnabled := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()\n\n\t\tvar consenters []*common.Consenter\n\t\tif bftEnabled {\n\t\t\tcfg, ok := bundle.OrdererConfig()\n\t\t\tif !ok {\n\t\t\t\treturn createErrorFunc(errors.New(\"no orderer section in config block\"))\n\t\t\t}\n\t\t\tconsenters = cfg.Consenters()\n\t\t}\n\n\t\treturn protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy)\n\t}\n}\n\nfunc bundleFromConfigBlock(block *common.Block, bccsp bccsp.BCCSP) (*channelconfig.Bundle, protoutil.BlockVerifierFunc) {\n\tif block.Data == nil || len(block.Data.Data) == 0 {\n\t\treturn nil, createErrorFunc(errors.New(\"block contains no data\"))\n\t}\n\n\tenv := &common.Envelope{}\n\tif err := proto.Unmarshal(block.Data.Data[0], env); err != nil {\n\t\treturn nil, createErrorFunc(err)\n\t}\n","sourceCodeStart":390,"sourceCodeEnd":426,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/cluster/util.go#L390-L426","documentation":"For BFT-enabled channels, the signature verifier needs the consenter list from the orderer config to authenticate block signatures. If capabilities indicate BFT but bundle.OrdererConfig() returns false, the verifier is initialized with this error and every subsequent verification fails.","triggerScenarios":"A channel whose capabilities enable ConsensusTypeBFT but whose config block lacks an Orderer section (or has an invalid one), so cfg, ok := bundle.OrdererConfig() fails inside the verifier factory.","commonSituations":"Partially applied capability upgrades where BFT capability was enabled but orderer config group is missing/corrupt, or blocks from a mismatched network where BFT flag and orderer config disagree.","solutions":["Ensure the config block contains a valid Orderer section with consenters when BFT capability is enabled.","Align channel capabilities with the orderer group: regenerate config with both BFT capability and full orderer config.","Check for incomplete config update transactions that toggled capabilities without the orderer section.","Re-bootstrap the channel from a correctly generated genesis block."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Check BFT capability is paired with a valid Orderer config\nif bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() {\n    if _, ok := bundle.OrdererConfig(); !ok {\n        return errors.New(\"BFT enabled but orderer config missing\")\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Enable BFT capability only on channels with a complete Orderer section and consenters.","Apply capability and orderer config changes in the same, reviewed config update.","Test capability upgrades on a throwaway channel first."],"tags":["fabric","bft","orderer-config","capabilities"],"backgroundTag":"missing-orderer-config-section","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}