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
- Inspect the channel config (configtxlator proto_decode) and confirm the Orderer group exists alongside the BFT capability.
- Regenerate the channel config from a correct configtx.yaml that defines the Orderer section.
- If the channel is not meant to be BFT, disable/align the ConsensusTypeBFT capability so consenters are not required.
- Apply a config update re-adding the orderer config group, then retry block verification.
- 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
- Always define the Orderer section in configtx.yaml when BFT capability is enabled
- Validate generated channel config with configtxlator before submitting
- Never hand-edit channel config blobs; regenerate from configtx.yaml
- Keep capabilities and orderer type settings consistent across the network
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
- no orderer section in config block
- illegal orderer config update detected: endpoints of org %s
- OrdererOrg config does not allow sub-groups
- no orderer section in config block
- [channel %s] cannot create channel because ChannelConfig is
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/d718cb0f30c88ff3.
Report an issue: GitHub.