{"record":{"id":"dddccd4bbe597665","repo":"hyperledger/fabric","slug":"no-orderer-section-in-config-block","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":"common/deliverclient/verifier_assembler.go","lineNumber":50,"sourceCode":"func (bva *BlockVerifierAssembler) VerifierFromConfig(configuration *common.ConfigEnvelope, channel string) (protoutil.BlockVerifierFunc, error) {\n\tbundle, err := channelconfig.NewBundle(channel, configuration.Config, bva.BCCSP)\n\tif err != nil {\n\t\treturn createErrorFunc(err), err\n\t}\n\n\tpolicy, exists := bundle.PolicyManager().GetPolicy(policies.BlockValidation)\n\tif !exists {\n\t\terr := errors.Errorf(\"no `%s` policy in config block\", policies.BlockValidation)\n\t\treturn createErrorFunc(err), err\n\t}\n\n\tbftEnabled := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()\n\n\tvar consenters []*common.Consenter\n\tif bftEnabled {\n\t\tcfg, ok := bundle.OrdererConfig()\n\t\tif !ok {\n\t\t\terr := errors.New(\"no orderer section in config block\")\n\t\t\treturn createErrorFunc(err), err\n\t\t}\n\t\tconsenters = cfg.Consenters()\n\t}\n\n\treturn protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy), nil\n}\n","sourceCodeStart":32,"sourceCodeEnd":58,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/deliverclient/verifier_assembler.go#L32-L58","documentation":"When the channel capabilities enable BFT consensus (ConsensusTypeBFT), VerifierFromConfig needs the orderer config section to obtain the consenter list for signature verification. If bundle.OrdererConfig() reports no orderer section, this error is thrown. The channel claims BFT but carries no orderer group definition.","triggerScenarios":"Calling VerifierFromConfig on a config block where capabilities include ConsensusTypeBFT but the channel config has no Orderer group/section defined.","commonSituations":"Application-channel config blocks generated without the Orderer section; hand-edited or merged channel configs; capability flags enabled in a channel profile lacking orderer configuration; mixing configs from different Fabric generations.","solutions":["Regenerate the channel config so the Orderer section (with consenters) is present, then update the channel via config update transaction.","Check channel capabilities: if BFT is not intended, remove/disable the ConsensusTypeBFT capability flag.","Validate the config block with configtxlator/configtxgen before use.","Ensure the peer/orderer binary version supports the channel's BFT capability and reads the config correctly."],"exampleFix":"// before (profile without orderer section but BFT capability)\nApplication: &ApplicationDefaults\n  Capabilities: <<: *ChannelCapabilities\n// after — add Orderer group or drop BFT capability\nOrderer: &OrdererDefaults\n  OrdererType: etcdraft\n  Capabilities: <<: *OrdererCapabilities","handlingStrategy":"validation","validationCode":"bundle, err := channelconfig.NewBundleFromEnvelope(env)\nif err != nil { return err }\nif bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() {\n    if _, ok := bundle.OrdererConfig(); !ok {\n        return errors.New(\"BFT capability enabled but config block has no orderer section\")\n    }\n}","typeGuard":"func bftConfigComplete(bundle channelconfig.Resources) bool {\n    if !bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() { return true }\n    _, ok := bundle.OrdererConfig()\n    return ok\n}","tryCatchPattern":"verifier, err := assembler.VerifierFromConfig(env, chID)\nif err != nil && strings.Contains(err.Error(), \"no orderer section\") {\n    return fmt.Errorf(\"channel %s: BFT enabled without orderer config; fix channel profile: %w\", chID, err)\n}","preventionTips":["Keep BFT capability flags and Orderer section definitions together in your configtx profiles.","Lint channel configs with configtxlator before committing channel updates.","Avoid hand-editing channel config JSON/YAML; always derive updates from full profiles.","Pin capability versions to those supported by your Fabric binaries."],"tags":["hyperledger-fabric","bft","config-block","orderer"],"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"}