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 intView on GitHub (pinned to 2736b63f8f)
Solutions
- Verify the envelope is a full channel config block containing an Orderer config group
- Use the channel's latest config block (fetch via configtxlator or the orderer's config block API) rather than an arbitrary block
- Regenerate the genesis/config block with a valid Orderer section (e.g. configtxgen with correct configtx.yaml)
- 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
- Always pass a full channel config block, not a transaction envelope
- Verify config blocks with configtxlator before use
- Ensure configtx.yaml defines an Orderer section for the channel
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
- some orderer organizations endpoints are empty: %s
- failed to unmarshal BFT metadata configuration
- invalid BFT metadata configuration
- invalid BFT consenter mapping configuration
- failed getting a new bundle from envelope of config block
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/9b32a2fbee7344b2.
Report an issue: GitHub.