{"record":{"id":"a2a499342d6bbe2b","repo":"hyperledger/fabric","slug":"config-update-contains-changes-to-more-than-one-gr","errorCode":null,"errorMessage":"config update contains changes to more than one group","messagePattern":"config update contains changes to more than one group","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/msgprocessor/maintenancefilter.go","lineNumber":188,"sourceCode":"\tif err != nil {\n\t\treturn errors.Wrap(err, \"envelope to config update unmarshalling error\")\n\t}\n\n\tconfigUpdate, err := configtx.UnmarshalConfigUpdate(configUpdateEnv.ConfigUpdate)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"config update unmarshalling error\")\n\t}\n\n\tif len(configUpdate.WriteSet.Groups) == 0 {\n\t\treturn errors.New(\"config update contains no changes\")\n\t}\n\n\tif len(configUpdate.WriteSet.Values) > 0 {\n\t\treturn errors.Errorf(\"config update contains changes to values in group %s\", channelconfig.ChannelGroupKey)\n\t}\n\n\tif len(configUpdate.WriteSet.Groups) > 1 {\n\t\treturn errors.New(\"config update contains changes to more than one group\")\n\t}\n\n\tif ordGroup, ok1 := configUpdate.WriteSet.Groups[channelconfig.OrdererGroupKey]; ok1 {\n\t\tif len(ordGroup.Groups) > 0 {\n\t\t\treturn errors.Errorf(\"config update contains changes to groups within the %s group\",\n\t\t\t\tchannelconfig.OrdererGroupKey)\n\t\t}\n\n\t\tif _, ok2 := ordGroup.Values[channelconfig.ConsensusTypeKey]; !ok2 {\n\t\t\treturn errors.Errorf(\"config update does not contain the %s value\", channelconfig.ConsensusTypeKey)\n\t\t}\n\n\t\tif len(ordGroup.Values) > 1 {\n\t\t\treturn errors.Errorf(\"config update contain more then just the %s value in the %s group\",\n\t\t\t\tchannelconfig.ConsensusTypeKey, channelconfig.OrdererGroupKey)\n\t\t}\n\t} else {\n\t\treturn errors.Errorf(\"update does not contain the %s group\", channelconfig.OrdererGroupKey)","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/msgprocessor/maintenancefilter.go#L170-L206","documentation":"Returned when the config update's WriteSet contains changes to more than one group. ensureConsensusTypeChangeOnly enforces that during consensus-type migration the update touches exactly one group — the Orderer group — and nothing else.","triggerScenarios":"A maintenance-mode config update whose WriteSet.Groups has two or more entries, e.g. changing both the Application group (e.g. adding an org) and the Orderer group in the same update, or changes to Orderer plus Channel group values.","commonSituations":"Batching routine channel administration (org adds, ACL changes in Application group) together with the consensus migration update to save a signing round-trip.","solutions":["Strip all groups other than the Orderer group from the update write set","Perform application-group changes in a separate config update outside the maintenance window","Recompute the delta with configtxlator using a desired config that differs from current only in the Orderer ConsensusType"],"exampleFix":"// before: two groups in one update\nWriteSet.Groups: { \"Application\": {...}, \"Orderer\": {...} }\n// after: only orderer group\nWriteSet.Groups: { \"Orderer\": { \"Values\": { \"ConsensusType\": {...} } } }","handlingStrategy":"validation","validationCode":"if len(update.WriteSet.Groups) > 1 {\n    return errors.New(\"update must touch only the Orderer group during consensus migration\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never batch application/org changes with the consensus migration update","Generate the desired config so it differs from current only in Orderer.ConsensusType","Check the delta's Groups keys before collecting signatures"],"tags":["hyperledger-fabric","orderer","config-update","migration"],"backgroundTag":"unsupported-config-change","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}