hyperledger/fabric · error
no orderer section in config block
Error message
no orderer section in config block
What it means
For BFT-enabled channels, the signature verifier needs the consenter list from the orderer config to authenticate block signatures. If capabilities indicate BFT but bundle.OrdererConfig() returns false, the verifier is initialized with this error and every subsequent verification fails.
Source
Thrown at orderer/common/cluster/util.go:408
func BlockVerifierBuilder(bccsp bccsp.BCCSP) func(block *common.Block) protoutil.BlockVerifierFunc {
return func(block *common.Block) protoutil.BlockVerifierFunc {
bundle, failed := bundleFromConfigBlock(block, bccsp)
if failed != nil {
return failed
}
policy, exists := bundle.PolicyManager().GetPolicy(policies.BlockValidation)
if !exists {
return createErrorFunc(errors.New("no policies in config block"))
}
bftEnabled := bundle.ChannelConfig().Capabilities().ConsensusTypeBFT()
var consenters []*common.Consenter
if bftEnabled {
cfg, ok := bundle.OrdererConfig()
if !ok {
return createErrorFunc(errors.New("no orderer section in config block"))
}
consenters = cfg.Consenters()
}
return protoutil.BlockSignatureVerifier(bftEnabled, consenters, policy)
}
}
func bundleFromConfigBlock(block *common.Block, bccsp bccsp.BCCSP) (*channelconfig.Bundle, protoutil.BlockVerifierFunc) {
if block.Data == nil || len(block.Data.Data) == 0 {
return nil, createErrorFunc(errors.New("block contains no data"))
}
env := &common.Envelope{}
if err := proto.Unmarshal(block.Data.Data[0], env); err != nil {
return nil, createErrorFunc(err)
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Ensure the config block contains a valid Orderer section with consenters when BFT capability is enabled.
- Align channel capabilities with the orderer group: regenerate config with both BFT capability and full orderer config.
- Check for incomplete config update transactions that toggled capabilities without the orderer section.
- Re-bootstrap the channel from a correctly generated genesis block.
Defensive patterns
Strategy: validation
Validate before calling
// Check BFT capability is paired with a valid Orderer config
if bundle.ChannelConfig().Capabilities().ConsensusTypeBFT() {
if _, ok := bundle.OrdererConfig(); !ok {
return errors.New("BFT enabled but orderer config missing")
}
} Prevention
- Enable BFT capability only on channels with a complete Orderer section and consenters.
- Apply capability and orderer config changes in the same, reviewed config update.
- Test capability upgrades on a throwaway channel first.
When it happens
Trigger: A channel whose capabilities enable ConsensusTypeBFT but whose config block lacks an Orderer section (or has an invalid one), so cfg, ok := bundle.OrdererConfig() fails inside the verifier factory.
Common situations: Partially applied capability upgrades where BFT capability was enabled but orderer config group is missing/corrupt, or blocks from a mismatched network where BFT flag and orderer config disagree.
Related errors
- cannot enable channel capabilities without orderer support f
- cannot enable application capabilities without orderer suppo
- global OrdererAddresses are not allowed with V3_0 capability
- not found
- cannot use _lifecycle without V2_0 application capabilities
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/d2dcef070a5208c2.
Report an issue: GitHub.