hyperledger/fabric · error
no orderer section in config block
Error message
no orderer section in config block
What it means
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.
Source
Thrown at common/deliverclient/verifier_assembler.go:50
func (bva *BlockVerifierAssembler) VerifierFromConfig(configuration *common.ConfigEnvelope, channel string) (protoutil.BlockVerifierFunc, error) {
bundle, err := channelconfig.NewBundle(channel, configuration.Config, bva.BCCSP)
if err != nil {
return createErrorFunc(err), err
}
policy, exists := bundle.PolicyManager().GetPolicy(policies.BlockValidation)
if !exists {
err := errors.Errorf("no `%s` policy in config block", policies.BlockValidation)
return createErrorFunc(err), err
}
bftEnabled := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()
var consenters []*common.Consenter
if bftEnabled {
cfg, ok := bundle.OrdererConfig()
if !ok {
err := errors.New("no orderer section in config block")
return createErrorFunc(err), err
}
consenters = cfg.Consenters()
}
return protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy), nil
}
View on GitHub (pinned to 2736b63f8f)
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.
Example fix
// before (profile without orderer section but BFT capability) Application: &ApplicationDefaults Capabilities: <<: *ChannelCapabilities // after — add Orderer group or drop BFT capability Orderer: &OrdererDefaults OrdererType: etcdraft Capabilities: <<: *OrdererCapabilities
Defensive patterns
Strategy: validation
Validate before calling
bundle, err := channelconfig.NewBundleFromEnvelope(env)
if err != nil { return err }
if bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() {
if _, ok := bundle.OrdererConfig(); !ok {
return errors.New("BFT capability enabled but config block has no orderer section")
}
} Type guard
func bftConfigComplete(bundle channelconfig.Resources) bool {
if !bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() { return true }
_, ok := bundle.OrdererConfig()
return ok
} Try / catch
verifier, err := assembler.VerifierFromConfig(env, chID)
if err != nil && strings.Contains(err.Error(), "no orderer section") {
return fmt.Errorf("channel %s: BFT enabled without orderer config; fix channel profile: %w", chID, err)
} Prevention
- 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.
When it happens
Trigger: Calling VerifierFromConfig on a config block where capabilities include ConsensusTypeBFT but the channel config has no Orderer group/section defined.
Common situations: 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.
Related errors
- no orderer section in channel config for channel [%s].
- nil block
- failed extracting bundle from envelope
- no orderer section in config block
- failed getting a new bundle from envelope of config block
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/dddccd4bbe597665.
Report an issue: GitHub.