{"record":{"id":"bfb4a1ecbdc612d3","repo":"hyperledger/fabric","slug":"current-config-has-consortiums-section-but-new-co","errorCode":null,"errorMessage":"current config has consortiums section, but new config does not","messagePattern":"current config has consortiums section, but new config does not","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/channelconfig/bundle.go","lineNumber":140,"sourceCode":"\t\t\treturn errors.New(\"current config has application section, but new config does not\")\n\t\t}\n\n\t\tfor orgName, org := range ac.Organizations() {\n\t\t\tnorg, ok := nac.Organizations()[orgName]\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tmspID := org.MSPID()\n\t\t\tif mspID != norg.MSPID() {\n\t\t\t\treturn errors.Errorf(\"application org %s attempted to change MSP ID from %s to %s\", orgName, mspID, norg.MSPID())\n\t\t\t}\n\t\t}\n\t}\n\n\tif cc, ok := b.ConsortiumsConfig(); ok {\n\t\tncc, ok := nb.ConsortiumsConfig()\n\t\tif !ok {\n\t\t\treturn errors.Errorf(\"current config has consortiums section, but new config does not\")\n\t\t}\n\n\t\tfor consortiumName, consortium := range cc.Consortiums() {\n\t\t\tnconsortium, ok := ncc.Consortiums()[consortiumName]\n\t\t\tif !ok {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tfor orgName, org := range consortium.Organizations() {\n\t\t\t\tnorg, ok := nconsortium.Organizations()[orgName]\n\t\t\t\tif !ok {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tmspID := org.MSPID()\n\t\t\t\tif mspID != norg.MSPID() {\n\t\t\t\t\treturn errors.Errorf(\"consortium %s org %s attempted to change MSP ID from %s to %s\", consortiumName, orgName, mspID, norg.MSPID())\n\t\t\t\t}\n\t\t\t}","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/channelconfig/bundle.go#L122-L158","documentation":"Thrown by ValidateNew when the current config has a Consortiums section (i.e. it is a system channel or otherwise defines consortiums) but the proposed new config does not. The Consortiums group cannot be removed via a config update; doing so would break the definitions of channels that can be created from those consortiums. (Note: this is errors.Errorf used where errors.New would suffice — the message is constant.)","triggerScenarios":"A config update against a system channel (or any channel whose config contains groups->Consortiums) where the Consortiums group was deleted from the proposed config, e.g. a configtxlator-edited update that removed groups->Consortiums.","commonSituations":"Migrating/templating configs between a system channel and application channels and applying the wrong shape; editing a system channel config to drop consortiums; automated tooling that rebuilds the config tree and omits the Consortiums group.","solutions":["Retain the groups->Consortiums group from the current config in the proposed config; only mutate values within it.","Regenerate the update payload by diffing two full JSON configs (current and edited) via configtxlator so no top-level groups are silently dropped.","If consortiums must be removed, that is part of a deliberate system-channel removal/migration path (Fabric 3 removed system channels), not a plain config update.","Inspect the update transaction with configtxlator to confirm Consortiums is present before submitting."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Ensure a system-channel-style update keeps the Consortiums group\nfunc requireConsortiumsGroup(current, proposed *cb.Config) error {\n\tif _, ok := current.Groups[\"Consortiums\"]; ok {\n\t\tif _, ok := proposed.Groups[\"Consortiums\"]; !ok {\n\t\t\treturn errors.New(\"proposed config drops the Consortiums group\")\n\t\t}\n\t}\n\treturn nil\n}","typeGuard":null,"tryCatchPattern":"if err := configtxManager.ProposeConfigUpdate(env); err != nil {\n\tif strings.Contains(err.Error(), \"consortiums section\") {\n\t\t// rebuild the update from the current system channel config, keeping Consortiums\n\t\treturn fmt.Errorf(\"structural config error: %w\", err)\n\t}\n\treturn err\n}","preventionTips":["Generate system channel updates only from a decoded copy of the current system channel config","Keep all top-level groups (Orderer, Consortiums) intact when editing; change values, not structure","Use configtxlator compute-update so only intended deltas enter the transaction","When planning system-channel removal (Fabric 3 migration), follow the documented migration path instead of dropping groups via update"],"tags":["hyperledger-fabric","channel-config","consortium","config-update"],"backgroundTag":"missing-config-section","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"}