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
- Recompute the config update delta with configtxlator compute-update between the correct current and desired config blocks
- Confirm the update actually changes the Orderer group's ConsensusType value
- 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
- Verify the two config blocks fed to compute-update actually differ
- Inspect the decoded update JSON for a non-empty Groups map before signing
- Avoid submitting updates during maintenance mode unless they migrate the consensus type
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
- config update contains changes to values in group %s
- config update contains changes to more than one group
- attempted to change consensus type from %s to %s, but next c
- attempted to change consensus type from %s to %s, transition
- failed to unmarshal BFT metadata configuration
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/0a29e48f9c7c33c2.
Report an issue: GitHub.