hyperledger/fabric · error

no orderer section in channel config for channel [%s].

Error message

no orderer section in channel config for channel [%s].

What it means

While building the block signature verifier, the channel config had BFT consensus capability enabled (ConsensusTypeBFT is true) but chConfig.OrdererConfig() returned no Orderer section. Without the orderer config the service cannot obtain the consenters list needed to verify BFT block signatures, so it errors out.

Source

Thrown at internal/peer/gossip/mcs.go:186

	cpm := s.channelPolicyManagerGetter.Manager(channelID)
	if cpm == nil {
		return fmt.Errorf("Could not acquire policy manager for channel %s", channelID)
	}
	mcsLogger.Debugf("Got policy manager for channel [%s]", channelID)

	// Get block validation policy
	policy, ok := cpm.GetPolicy(policies.BlockValidation)
	// ok is true if it was the policy requested, or false if it is the default policy
	mcsLogger.Debugf("Got block validation policy for channel [%s] with flag [%t]", channelID, ok)

	chConfig := s.channelConfigGetter(channelID)
	bftEnabled := chConfig.ChannelConfig().Capabilities().ConsensusTypeBFT()

	var consenters []*pcommon.Consenter
	if bftEnabled {
		cfg, ok := chConfig.OrdererConfig()
		if !ok {
			return fmt.Errorf("no orderer section in channel config for channel [%s].", channelID)
		}
		consenters = cfg.Consenters()
	}

	verifier := protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy)
	return verifier(block.Header, block.Metadata)
}

// VerifyBlockAttestation returns nil when the header matches the metadata signature. It assumed the block.Data is nil
// and therefore does not verify that Header.DataHash is equal to the hash of block.Data. This is used when the orderer
// delivers a block with header & metadata only, as an attestation of block existence.
func (s *MSPMessageCryptoService) VerifyBlockAttestation(chainID string, block *pcommon.Block) error {
	if block == nil {
		return fmt.Errorf("Invalid Block on channel [%s]. Block is nil.", chainID)
	}
	if block.Header == nil {
		return fmt.Errorf("Invalid Block on channel [%s]. Header must be different from nil.", chainID)
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Inspect the channel config (configtxlator proto_decode) and confirm the Orderer group exists alongside the BFT capability.
  2. Regenerate the channel config from a correct configtx.yaml that defines the Orderer section.
  3. If the channel is not meant to be BFT, disable/align the ConsensusTypeBFT capability so consenters are not required.
  4. Apply a config update re-adding the orderer config group, then retry block verification.
  5. Verify peer is loading the latest committed channel config, not a stale one.

Example fix

// before (configtx.yaml missing orderer group while BFT capability on)
Capabilities:
  Channel: &ChannelCapabilities{ConsensusType: BFT}
// after: define the Orderer section
Orderer: &OrdererDefaults
  OrdererType: etcdraft
  Capabilities: <<: *OrdererCapabilities  # BFT enabled together with orderer config present
Defensive patterns

Strategy: validation

Validate before calling

cfg, ok := channelConfig.OrdererConfig()
bft := channelConfig.ChannelConfig().Capabilities().ConsensusTypeBFT()
if bft && !ok {
    return fmt.Errorf("channel config invalid: BFT enabled but Orderer section missing")
}

Type guard

func hasOrdererConfigForBFT(envConfig *common.Config) bool {
    oc, ok := channelconfig.OrdererConfig(envConfig)
    return !envConfig.ChannelConfig().Capabilities().ConsensusTypeBFT() || ok && oc != nil
}

Try / catch

if err := cryptoService.VerifyBlock(chainID, block); err != nil {
    if strings.Contains(err.Error(), "no orderer section") {
        log.Errorf("corrupt channel config for %s: reload config via config update", chainID)
    }
    return err
}

Prevention

When it happens

Trigger: VerifyBlock or VerifyBlockAttestation runs on a channel whose config group enables the BFT consensus capability but lacks an orderer.config group — a malformed or incomplete channel configuration.

Common situations: Hand-edited or partially generated channel config where capabilities say BFT but the orderer group was dropped; config update that removed the Orderer section; mixing config blobs across channels when scripting channel creation; wrong config tree deserialization in tests.

Related errors


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