{"record":{"id":"145cf8bb4fae0387","repo":"hyperledger/fabric","slug":"config-update-contains-changes-to-values-in-group","errorCode":null,"errorMessage":"config update contains changes to values in group %s","messagePattern":"config update contains changes to values in group (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/msgprocessor/maintenancefilter.go","lineNumber":184,"sourceCode":"// ensureConsensusTypeChangeOnly checks that the only change is the Channel/Orderer group, and within that,\n// only to the ConsensusType value.\nfunc (mf *MaintenanceFilter) ensureConsensusTypeChangeOnly(configEnvelope *cb.ConfigEnvelope) error {\n\tconfigUpdateEnv, err := protoutil.EnvelopeToConfigUpdate(configEnvelope.LastUpdate)\n\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\",","sourceCodeStart":166,"sourceCodeEnd":202,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/msgprocessor/maintenancefilter.go#L166-L202","documentation":"Returned when the config update's WriteSet contains changes to values directly in the top-level Channel group (channelconfig.ChannelGroupKey). The maintenance filter only permits changes inside the Orderer group's ConsensusType value, so any value-level change at the Channel group is rejected.","triggerScenarios":"A maintenance-mode config update whose WriteSet.Values is non-empty, e.g. bundling a change to a Channel-group config value (like BlockValidation or capabilities) together with the consensus type change.","commonSituations":"Administrators trying to batch multiple config changes (capabilities upgrade plus consensus migration) into a single update while the channel is in maintenance mode.","solutions":["Remove all top-level Channel-group value changes from the update; keep only the Orderer group ConsensusType change","Submit separate config updates: do non-migration value changes before entering maintenance mode or after the migration completes","Recompute the delta so the write set contains only Groups[orderer].Values[ConsensusType]"],"exampleFix":"// before: bundled changes\nWriteSet: { Values: { Capabilities: ... }, Groups: { Orderer: { Values: { ConsensusType: ... } } } }\n// after: only the consensus type change\nWriteSet: { Values: {}, Groups: { Orderer: { Values: { ConsensusType: { State: STATE_MAINTENANCE, Type: \"BFT\" } } } } }","handlingStrategy":"validation","validationCode":"if len(update.WriteSet.Values) > 0 {\n    return errors.New(\"update must not change Channel-group values during consensus migration\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep migration updates limited to Orderer/ConsensusType only","Schedule other config value changes before entering or after leaving maintenance","Review the configtxlator delta output for unexpected Values entries before signing"],"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"}