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

  1. Regenerate the channel config so the Orderer section (with consenters) is present, then update the channel via config update transaction.
  2. Check channel capabilities: if BFT is not intended, remove/disable the ConsensusTypeBFT capability flag.
  3. Validate the config block with configtxlator/configtxgen before use.
  4. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/dddccd4bbe597665. Report an issue: GitHub.