hyperledger/fabric · error

current config has application section, but new config does

Error message

current config has application section, but new config does not

What it means

This error is thrown by ValidateNew in common/channelconfig/bundle.go when a channel config update removes the Application section from a channel that currently has one. The library requires that if the current bundle has an ApplicationConfig, the proposed bundle must also have one; application sections cannot be dropped via a standard config update. It is a structural guard against accidentally deleting the application group from a channel config.

Source

Thrown at common/channelconfig/bundle.go:122

			}
		}

		for orgName, org := range oc.Organizations() {
			norg, ok := noc.Organizations()[orgName]
			if !ok {
				continue
			}
			mspID := org.MSPID()
			if mspID != norg.MSPID() {
				return errors.Errorf("orderer org %s attempted to change MSP ID from %s to %s", orgName, mspID, norg.MSPID())
			}
		}
	}

	if ac, ok := b.ApplicationConfig(); ok {
		nac, ok := nb.ApplicationConfig()
		if !ok {
			return errors.New("current config has application section, but new config does not")
		}

		for orgName, org := range ac.Organizations() {
			norg, ok := nac.Organizations()[orgName]
			if !ok {
				continue
			}
			mspID := org.MSPID()
			if mspID != norg.MSPID() {
				return errors.Errorf("application org %s attempted to change MSP ID from %s to %s", orgName, mspID, norg.MSPID())
			}
		}
	}

	if cc, ok := b.ConsortiumsConfig(); ok {
		ncc, ok := nb.ConsortiumsConfig()
		if !ok {
			return errors.Errorf("current config has consortiums section, but new config does not")

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Ensure the proposed config update retains the channel->groups->Application group from the current config; only modify values inside it.
  2. Re-generate the update payload with configtxlator: diff current_config.json against properly edited updated_config.json that still contains the Application group.
  3. If the channel genuinely should have no application section, that requires re-creating the channel, not a config update — plan accordingly.
  4. Verify the configtx profile used to generate the config includes an Application section for application channels.
Defensive patterns

Strategy: validation

Validate before calling

// Ensure an update to an application channel keeps the Application group
func requireApplicationGroup(current, proposed *cb.Config) error {
	if _, ok := current.Groups["Application"]; ok {
		if _, ok := proposed.Groups["Application"]; !ok {
			return errors.New("proposed config drops the Application group")
		}
	}
	return nil
}

Try / catch

if err := configtxManager.ProposeConfigUpdate(env); err != nil {
	if strings.Contains(err.Error(), "application section") {
		// regenerate the update from a base config that includes Application
		return fmt.Errorf("structural config error: %w", err)
	}
	return err
}

Prevention

When it happens

Trigger: Submitting a config update computed from a modified config where the Application group (channel->groups->Application) was deleted, e.g. by regenerating the config without Application section, or a configtxlator round-trip that dropped the Application group from the update transaction.

Common situations: Creating an update payload from a system-channel or orderer-only config template that lacks an Application group; running configtxlator proto_decode -> edit -> proto_encode and accidentally removing the Application group; generating a new channel creation config from a profile without Application (an orderer-only profile) and trying to apply it to an application channel.

Related errors


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