hyperledger/fabric · error

config update contains no changes

Error message

config update contains no changes

What it means

Returned when the parsed config update's WriteSet contains no group entries at all, meaning the update carries no changes that the maintenance filter can interpret as a consensus type migration. During migration, only a change to the Orderer group's ConsensusType value is permitted, so an empty write set is rejected.

Source

Thrown at orderer/common/msgprocessor/maintenancefilter.go:180

	return nil
}

// ensureConsensusTypeChangeOnly checks that the only change is the Channel/Orderer group, and within that,
// only to the ConsensusType value.
func (mf *MaintenanceFilter) ensureConsensusTypeChangeOnly(configEnvelope *cb.ConfigEnvelope) error {
	configUpdateEnv, err := protoutil.EnvelopeToConfigUpdate(configEnvelope.LastUpdate)
	if err != nil {
		return errors.Wrap(err, "envelope to config update unmarshalling error")
	}

	configUpdate, err := configtx.UnmarshalConfigUpdate(configUpdateEnv.ConfigUpdate)
	if err != nil {
		return errors.Wrap(err, "config update unmarshalling error")
	}

	if len(configUpdate.WriteSet.Groups) == 0 {
		return errors.New("config update contains no changes")
	}

	if len(configUpdate.WriteSet.Values) > 0 {
		return errors.Errorf("config update contains changes to values in group %s", channelconfig.ChannelGroupKey)
	}

	if len(configUpdate.WriteSet.Groups) > 1 {
		return errors.New("config update contains changes to more than one group")
	}

	if ordGroup, ok1 := configUpdate.WriteSet.Groups[channelconfig.OrdererGroupKey]; ok1 {
		if len(ordGroup.Groups) > 0 {
			return errors.Errorf("config update contains changes to groups within the %s group",
				channelconfig.OrdererGroupKey)
		}

		if _, ok2 := ordGroup.Values[channelconfig.ConsensusTypeKey]; !ok2 {
			return errors.Errorf("config update does not contain the %s value", channelconfig.ConsensusTypeKey)

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Recompute the config update delta with configtxlator compute-update between the correct current and desired config blocks
  2. Confirm the update actually changes the Orderer group's ConsensusType value
  3. If no change is intended, do not submit an update during the migration window
Defensive patterns

Strategy: validation

Validate before calling

if len(update.WriteSet.Groups) == 0 {
    return errors.New("update write set has no group changes; recompute delta with configtxlator")
}

Prevention

When it happens

Trigger: Submitting a config update during maintenance mode where the WriteSet.Groups map is empty — e.g. a no-op update, an update touching nothing, or a delta that failed to compute any group-level change.

Common situations: Computing a delta between two identical configs, or accidentally submitting the original config as the update so the resulting write set is empty.

Related errors


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