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
- Add the consensus_type value (with the new consensus type and MAINTENANCE state) to the Orderer group's Values in the WriteSet.
- Regenerate the config update using configtxlator so the delta includes the ConsensusType change.
- 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
- Always add the ConsensusType value (new type + state) to the Orderer group in maintenance-mode updates.
- Use the official migration tooling/scripts instead of manual envelope construction.
- Assert the delta contains the consensus_type key before signing and submitting.
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
- attempted to change consensus type from %s to %s, but next c
- attempted to change consensus type from %s to %s, transition
- config update contains changes to groups within the %s group
- config update contain more then just the %s value in the %s
- update does not contain the %s group
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/a80a0c5200908078.
Report an issue: GitHub.