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

  1. Ensure the committed block is a valid channel config containing the Orderer group
  2. Re-issue the channel update including the Orderer section with the consenter list
  3. Verify with configtxlator/inspect that the new config JSON has an 'orderer' group before submitting
  4. 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

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


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