hyperledger/fabric · error

no orderer config in bundle

Error message

no orderer config in bundle

What it means

IsConsenterOfChannel builds a channelconfig.Bundle from the given config envelope and looks up the orderer configuration group. If the envelope's channel config has no Orderer group (bundle.OrdererConfig() returns exists=false), the check cannot proceed and this error is returned. It means the envelope is not a valid orderer-bearing config block.

Source

Thrown at orderer/consensus/smartbft/util.go:410

// IsConsenterOfChannel returns whether the caller is a consenter of a channel
// by inspecting the given configuration block.
// It returns nil if true, else returns an error.
func (conCert ConsenterCertificate) IsConsenterOfChannel(configBlock *cb.Block) error {
	if configBlock == nil {
		return errors.New("nil block")
	}
	envelopeConfig, err := protoutil.ExtractEnvelope(configBlock, 0)
	if err != nil {
		return err
	}
	bundle, err := channelconfig.NewBundleFromEnvelope(envelopeConfig, conCert.CryptoProvider)
	if err != nil {
		return err
	}
	oc, exists := bundle.OrdererConfig()
	if !exists {
		return errors.New("no orderer config in bundle")
	}
	if oc.ConsensusType() != "BFT" {
		return errors.New("not a SmartBFT config block")
	}

	for _, consenter := range oc.Consenters() {
		if bytes.Equal(conCert.ConsenterCertificate, consenter.ServerTlsCert) || bytes.Equal(conCert.ConsenterCertificate, consenter.ClientTlsCert) {
			return nil
		}
	}
	return cluster.ErrNotInChannel
}

type worker struct {
	work      [][]byte
	f         func([]byte)
	workerNum int
	id        int

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Verify the envelope is a full channel config block containing an Orderer config group
  2. Use the channel's latest config block (fetch via configtxlator or the orderer's config block API) rather than an arbitrary block
  3. Regenerate the genesis/config block with a valid Orderer section (e.g. configtxgen with correct configtx.yaml)
  4. Inspect with configtxlator decode to confirm an Orderer group exists
Defensive patterns

Strategy: validation

Validate before calling

bundle, err := channelconfig.NewBundleFromEnvelope(envelopeConfig, cryptoProvider)
if err != nil { return err }
if _, ok := bundle.OrdererConfig(); !ok {
    return errors.New("envelope has no orderer config; not usable with SmartBFT")
}

Type guard

func hasOrdererConfig(b *channelconfig.Bundle) bool {
    _, ok := b.OrdererConfig()
    return ok
}

Try / catch

if err := IsConsenterOfChannel(env, cert); err != nil {
    if err.Error() == "no orderer config in bundle" {
        // fetch the correct channel config block and retry
    }
}

Prevention

When it happens

Trigger: Calling IsConsenterOfChannel with an envelope that is not a channel config block, or a config block for a channel created without an Orderer group, or a malformed/foreign envelope passed where a config envelope was expected.

Common situations: Pointing a SmartBFT consenter at a block from an application-only channel; passing a tx envelope instead of a config envelope; corruption or truncation of genesis/config blocks in onboarding tooling.

Related errors


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