hyperledger/fabric · error

Invalid configuration block, missing %s configuration group

Error message

Invalid configuration block, missing %s configuration group

What it means

The channel's top-level Groups map exists but does not contain an entry keyed by channelconfig.ApplicationGroupKey ("Application"). A channel that will host chaincode must define an Application configuration group (application organizations, ACLs, capabilities); cscc rejects channel creation when it is absent, e.g. an orderer-only config.

Source

Thrown at core/scc/cscc/configure.go:242

	if err != nil {
		return errors.Errorf("Bad configuration envelope: %s", err)
	}

	if configEnv.Config == nil {
		return errors.New("Nil config envelope Config")
	}

	if configEnv.Config.ChannelGroup == nil {
		return errors.New("Nil channel group")
	}

	if configEnv.Config.ChannelGroup.Groups == nil {
		return errors.New("No channel configuration groups are available")
	}

	_, exists := configEnv.Config.ChannelGroup.Groups[channelconfig.ApplicationGroupKey]
	if !exists {
		return errors.Errorf("Invalid configuration block, missing %s "+
			"configuration group", channelconfig.ApplicationGroupKey)
	}

	// Check the capabilities requirement
	if err = channelconfig.ValidateCapabilities(block, bccsp); err != nil {
		return errors.Errorf("Failed capabilities check: [%s]", err)
	}

	return nil
}

// joinChain will join the specified chain in the configuration block.
// Since it is the first block, it is the genesis block containing configuration
// for this chain, so we want to update the Chain object with this info
func (e *PeerConfiger) joinChain(
	channelID string,
	block *common.Block,
	deployedCCInfoProvider ledger.DeployedChaincodeInfoProvider,

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Edit configtx.yaml so the profile includes an Application section with at least one application organization and `Application: <<: *ApplicationDefaults`, then regenerate with configtxgen
  2. Verify with `configtxgen -inspectChannelCreateTx config.tx` that the Application group appears
  3. If the group was removed by an update, re-add Application group members via a config update computed with configtxlator compute-update
  4. Ensure the peer creating the channel expects an application channel, not the orderer system channel

Example fix

# before (configtx.yaml profile)
TwoOrgsChannel:
  Orderer:
    Organizations: [OrdererOrg]
# after
TwoOrgsChannel:
  Orderer:
    Organizations: [OrdererOrg]
  Application:
    <<: *ApplicationDefaults
    Organizations: [Org1, Org2]
Defensive patterns

Strategy: validation

Validate before calling

_, ok := cfg.GetChannelGroup().GetGroups()[channelconfig.ApplicationGroupKey]
if !ok {
    return errors.New("Application group missing from channel config")
}

Type guard

func hasApplicationGroup(cfg *common.Config) bool {
    _, ok := cfg.GetChannelGroup().GetGroups()[channelconfig.ApplicationGroupKey]
    return ok
}

Try / catch

if _, exists := cfg.GetChannelGroup().GetGroups()[channelconfig.ApplicationGroupKey]; !exists {
    return fmt.Errorf("profile lacks Application section: add it to configtx.yaml and regenerate")
}

Prevention

When it happens

Trigger: Creating a channel from a configtxgen profile without an Application section (orderer-only profile); a config update that removed the Application group; submitting the genesis block of a system-channel-style or consortium-less config to JoinChain.

Common situations: Users reusing the orderer genesis profile as a channel creation profile; configtx.yaml profiles missing `Application: <<: *ApplicationDefaults` or with no Application Organizations; team upgrades that dropped Application capabilities/orgs during config edits.

Related errors


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