hyperledger/fabric · critical
no orderer config
Error message
no orderer config
What it means
After decoding the config envelope and building a config bundle, configBlockToBFTConfig calls bundle.OrdererConfig(); if the bundle has no Orderer group it returns 'no orderer config'. A BFT consenter can only derive its types.Configuration from a channel config that contains an Orderer section.
Source
Thrown at orderer/consensus/smartbft/util.go:116
}
func configBlockToBFTConfig(selfID uint64, block *cb.Block, bccsp bccsp.BCCSP) (types.Configuration, error) {
if block == nil || block.Data == nil || len(block.Data.Data) == 0 {
return types.Configuration{}, errors.New("empty block")
}
env, err := protoutil.UnmarshalEnvelope(block.Data.Data[0])
if err != nil {
return types.Configuration{}, err
}
bundle, err := channelconfig.NewBundleFromEnvelope(env, bccsp)
if err != nil {
return types.Configuration{}, err
}
oc, ok := bundle.OrdererConfig()
if !ok {
return types.Configuration{}, errors.New("no orderer config")
}
consensusConfigOptions, err := createSmartBftConfig(oc)
if err != nil {
return types.Configuration{}, err
}
return util.ConfigFromMetadataOptions(selfID, consensusConfigOptions)
}
func getViewMetadataFromBlock(block *cb.Block) (*smartbftprotos.ViewMetadata, error) {
if block.Header.Number == 0 {
// Genesis block has no prior metadata so we just return an un-initialized metadata
return new(smartbftprotos.ViewMetadata), nil
}
signatureMetadata := protoutil.GetMetadataFromBlockOrPanic(block, cb.BlockMetadataIndex_SIGNATURES)
ordererMD := &cb.OrdererBlockMetadata{}View on GitHub (pinned to 2736b63f8f)
Solutions
- Ensure the committed block is a valid channel config containing the Orderer group
- Re-issue the channel update including the Orderer section with the consenter list
- Verify with configtxlator/inspect that the new config JSON has an 'orderer' group before submitting
- Restore the previous good config block if the update was erroneous
Defensive patterns
Strategy: validation
Validate before calling
bundle, _ := channelconfig.NewBundleFromEnvelope(env)
if _, ok := bundle.OrdererConfig(); !ok {
return errors.New("proposed config block lacks an Orderer group; aborting")
} Try / catch
if err := chain.BlockCommitted(block); err != nil && strings.Contains(err.Error(), "no orderer config") {
logger.Errorf("channel update removed orderer config; roll back: %v", err)
} Prevention
- Diff proposed channel config JSON against current config before submission
- Never remove the Orderer group in config updates
- Confirm the block originates from the correct channel
- Use configtxlator decode/encode round-trips to detect dropped groups
When it happens
Trigger: Committing a config block whose channel config lacks the orderer group (e.g. an application-channel update that removed the Orderer section, or a block that is not actually a channel config).
Common situations: Channel update accidentally deleting the Orderer group via configtxlator round-trip, applying a config block from the wrong channel, or system-channel/channel config confusion.
Related errors
- failed to deserialize values
- illegal orderer config update detected: endpoints of org %s
- orderer org %s attempted to change MSP ID from %s to %s
- current config has application section, but new config does
- application org %s attempted to change MSP ID from %s to %s
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/fc72bb2c638859a7.
Report an issue: GitHub.