{"record":{"id":"3814e3d359efd212","repo":"hyperledger/fabric","slug":"no-orderer-section-in-config-block-3814e3","errorCode":null,"errorMessage":"no orderer section in config block","messagePattern":"no orderer section in config block","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/multichannel/registrar.go","lineNumber":410,"sourceCode":"\t}\n\n\tledger, err := r.ledgerFactory.GetOrCreate(chdr.ChannelId)\n\tif err != nil {\n\t\treturn nil, errors.WithMessagef(err, \"error getting ledger for channel: %s\", chdr.ChannelId)\n\t}\n\n\tpolicy, exists := bundle.PolicyManager().GetPolicy(policies.BlockValidation)\n\tif !exists {\n\t\treturn nil, errors.New(\"no policies in config block\")\n\t}\n\n\tbftEnabled := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()\n\n\tvar consenters []*cb.Consenter\n\tif bftEnabled {\n\t\tcfg, ok := bundle.OrdererConfig()\n\t\tif !ok {\n\t\t\treturn nil, errors.New(\"no orderer section in config block\")\n\t\t}\n\t\tconsenters = cfg.Consenters()\n\t}\n\tsignatureVerifier := protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy)\n\n\treturn &ledgerResources{\n\t\tconfigResources: &configResources{\n\t\t\tmutableResources: channelconfig.NewBundleSource(bundle, r.callbacks...),\n\t\t\tbccsp:            r.bccsp,\n\t\t},\n\t\tReadWriter:        ledger,\n\t\tsignatureVerifier: signatureVerifier,\n\t}, nil\n}\n\n// CreateChain makes the Registrar create a consensus.Chain with the given name.\nfunc (r *Registrar) CreateChain(chainName string) {\n\tlf, err := r.ledgerFactory.GetOrCreate(chainName)","sourceCodeStart":392,"sourceCodeEnd":428,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/multichannel/registrar.go#L392-L428","documentation":"When the channel's capabilities enable BFT consensus, the registrar requires the channel config to contain an Orderer section so it can obtain the list of consenters for block signature verification. If BFT is enabled but OrdererConfig() returns false, the config block lacks the Orderer group and channel creation fails.","triggerScenarios":"Creating/joining a channel whose capabilities enable ConsensusTypeBFT (e.g. V2_5+ BFT capability) but whose config block has no Orderer group — typically a channel created with an application-only profile or a config missing the orderer org definitions.","commonSituations":"BFT capability enabled in Channel capabilities but the channel was generated from a profile without Orderer section; partial config updates that removed the Orderer group; mismatched capability/config after a Fabric upgrade.","solutions":["Ensure the configtx.yaml profile includes a proper Orderer section with consensus type and orderer organizations, then regenerate the channel config","Either supply the Orderer section in the channel config or disable the BFT capability if running Raft/etcdraft","Verify channel capabilities (channel + orderer groups) match the intended consensus type using configtxlator"],"exampleFix":"// before: BFT capability enabled but no Orderer section in profile\nChannel: &ChannelCapabilities{ConsensusTypeBFT: true}\n// (profile has only Application group)\n\n// after: include Orderer section with consenters\n// in configtx.yaml:\n// Orderer: &OrdererDefaults\n//   OrdererType: SmartBFT\n//   Organizations:\n//     - *OrdererOrg\n//   Capabilities:\n//     <<: *OrdererCapabilities","handlingStrategy":"validation","validationCode":"// Go: check BFT capability vs Orderer section before join\nbft := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()\n_, hasOrderer := bundle.OrdererConfig()\nif bft && !hasOrderer {\n    return errors.New(\"BFT capability requires an Orderer config section\")\n}","typeGuard":"func bftConfigValid(bundle channelconfig.Resources) bool {\n    if bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() {\n        _, ok := bundle.OrdererConfig()\n        return ok\n    }\n    return true\n}","tryCatchPattern":"if err := joinChannel(...); err != nil {\n    if strings.Contains(err.Error(), \"no orderer section\") {\n        // config is BFT-capable but lacks Orderer group: rebuild channel config\n        return rebuildChannelConfigWithOrdererSection()\n    }\n    return err\n}","preventionTips":["Keep the Orderer section (consenters + organizations) in every profile that enables BFT capabilities","Use configtxlator to decode and verify the Orderer group before creating channels","Align capability levels (channel/orderer/application) when upgrading Fabric versions"],"tags":["hyperledger-fabric","orderer","bft","channel-config"],"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"}