{"record":{"id":"5f0ae049b4bd7f59","repo":"hyperledger/fabric","slug":"update-does-not-contain-the-s-group","errorCode":null,"errorMessage":"update does not contain the %s group","messagePattern":"update does not contain the (.+?) group","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/common/msgprocessor/maintenancefilter.go","lineNumber":206,"sourceCode":"\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)\n\t}\n\n\treturn nil\n}\n\nfunc validateBFTConsenterMapping(currentOrdererConfig channelconfig.Orderer, nextOrdererConfig channelconfig.Orderer) error {\n\t// extract raft consenters from consensusTypeValue.metadata\n\traftMetadata := &etcdraft.ConfigMetadata{}\n\tproto.Unmarshal(currentOrdererConfig.ConsensusMetadata(), raftMetadata)\n\traftConsenters := raftMetadata.GetConsenters()\n\n\t// extract bft consenters\n\tbftConsenters := nextOrdererConfig.Consenters()\n\n\tif len(bftConsenters) == 0 {\n\t\treturn errors.Errorf(\"Invalid new config: bft consenters are missing\")\n\t}\n","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/common/msgprocessor/maintenancefilter.go#L188-L224","documentation":"During consensus-type migration the config update must include the Orderer group itself. If WriteSet.Groups has exactly one entry but it is not the Orderer group (channelconfig.OrdererGroupKey), the update cannot be validated as a ConsensusType change and is rejected.","triggerScenarios":"ensureConsensusTypeChangeOnly is called with a configUpdate where the single group in WriteSet.Groups is something other than \"Orderer\" — the ordGroup lookup fails and the else branch fires.","commonSituations":"Attempting a maintenance-mode update that modifies the Application group or a consortium instead of the Orderer group; a mis-scoped WriteSet produced by editing the wrong group in configtxlator output.","solutions":["Change the WriteSet so its sole group entry is the Orderer group with the ConsensusType value change.","If the intent was to edit another group, exit maintenance mode first — only Orderer/ConsensusType updates are permitted during migration.","Re-generate the delta from the current config ensuring the Orderer group is the edited group."],"exampleFix":"// before\nWriteSet.Groups[\"Application\"] = appGroupDelta\n// after\nWriteSet.Groups[\"Orderer\"] = &cb.ConfigGroup{Values: map[string]*cb.ConfigValue{\"ConsensusType\": ctValue}}","handlingStrategy":"validation","validationCode":"groups := update.GetWriteSet().Groups\nif len(groups) != 1 {\n    return errors.New(\"expected exactly one group in migration update\")\n}\nif _, ok := groups[\"Orderer\"]; !ok {\n    return errors.New(\"migration update must target the Orderer group\")\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Confirm the edited group key is literally \"Orderer\" in the WriteSet.","Do not attempt Application/Consortiums edits while in maintenance mode.","Build updates from the current config snapshot, not an old one."],"tags":["hyperledger-fabric","config-update","consensus-migration"],"backgroundTag":"config-update-rejected","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"}