hyperledger/fabric · error

config update does not contain the %s value

Error message

config update does not contain the %s value

What it means

During consensus-type migration, an update to the Orderer group must contain the ConsensusType value; this is the very change migration exists to perform. If the Orderer group is present in the WriteSet but has no consensus_type entry, the update is rejected because the orderer cannot determine the target consensus type or state transition.

Source

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

		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)
		}

		if len(ordGroup.Values) > 1 {
			return errors.Errorf("config update contain more then just the %s value in the %s group",
				channelconfig.ConsensusTypeKey, channelconfig.OrdererGroupKey)
		}
	} else {
		return errors.Errorf("update does not contain the %s group", channelconfig.OrdererGroupKey)
	}

	return nil
}

func validateBFTConsenterMapping(currentOrdererConfig channelconfig.Orderer, nextOrdererConfig channelconfig.Orderer) error {
	// extract raft consenters from consensusTypeValue.metadata
	raftMetadata := &etcdraft.ConfigMetadata{}
	proto.Unmarshal(currentOrdererConfig.ConsensusMetadata(), raftMetadata)
	raftConsenters := raftMetadata.GetConsenters()

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Add the consensus_type value (with the new consensus type and MAINTENANCE state) to the Orderer group's Values in the WriteSet.
  2. Regenerate the config update using configtxlator so the delta includes the ConsensusType change.
  3. If other Orderer values also changed, remove them — migration updates may only contain ConsensusType (see companion error for extra values).

Example fix

// before
ordGroup.Values["BatchSize"] = changedValue // no ConsensusType
// after
ordGroup.Values = map[string]*cb.ConfigValue{
  "ConsensusType": {Value: encodedConsensusType},
}
Defensive patterns

Strategy: validation

Validate before calling

ord, ok := update.GetWriteSet().Groups["Orderer"]
if ok {
    if _, hasCT := ord.Values["ConsensusType"]; !hasCT {
        return errors.New("migration update must include ConsensusType value")
    }
}

Prevention

When it happens

Trigger: ensureConsensusTypeChangeOnly receives a configUpdate with an Orderer group in WriteSet.Groups whose Values map lacks channelconfig.ConsensusTypeKey — e.g. an update that only touches Orderer values like BatchSize or capabilities.

Common situations: Admins in maintenance mode submitting an update intended only to tweak other Orderer settings (BatchTimeout, BatchSize) instead of the ConsensusType value; automation that copies the wrong value into the delta.

Related errors


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