{"record":{"id":"34909516d166e0b3","repo":"hyperledger/fabric","slug":"current-config-has-orderer-section-but-new-config","errorCode":null,"errorMessage":"current config has orderer section, but new config does not","messagePattern":"current config has orderer section, but new config does not","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"common/channelconfig/bundle.go","lineNumber":85,"sourceCode":"// ApplicationConfig returns the configtxapplication.SharedConfig for the channel\n// and whether the Application config exists.\nfunc (b *Bundle) ApplicationConfig() (Application, bool) {\n\tresult := b.channelConfig.ApplicationConfig()\n\treturn result, result != nil\n}\n\n// ConfigtxValidator returns the configtx.Validator for the channel.\nfunc (b *Bundle) ConfigtxValidator() configtx.Validator {\n\treturn b.configtxManager\n}\n\n// ValidateNew checks if a new bundle's contained configuration is valid to be derived from the current bundle.\n// This allows checks of the nature \"Make sure that the consensus type did not change\".\nfunc (b *Bundle) ValidateNew(nb Resources) error {\n\tif oc, ok := b.OrdererConfig(); ok {\n\t\tnoc, ok := nb.OrdererConfig()\n\t\tif !ok {\n\t\t\treturn errors.New(\"current config has orderer section, but new config does not\")\n\t\t}\n\n\t\t// Prevent consensus-type migration when channel capabilities ConsensusTypeMigration is disabled\n\t\tif !b.channelConfig.Capabilities().ConsensusTypeMigration() {\n\t\t\tif oc.ConsensusType() != noc.ConsensusType() {\n\t\t\t\treturn errors.Errorf(\"attempted to change consensus type from %s to %s\",\n\t\t\t\t\toc.ConsensusType(), noc.ConsensusType())\n\t\t\t}\n\t\t}\n\n\t\t// When we move to capability V3_0 we insist on per Org endpoints for every org\n\t\tisOldV3 := b.ChannelConfig().Capabilities().ConsensusTypeBFT()\n\t\tisNewV3 := nb.ChannelConfig().Capabilities().ConsensusTypeBFT()\n\t\tif !isOldV3 && isNewV3 {\n\t\t\tfor _, org := range noc.Organizations() {\n\t\t\t\tif len(org.Endpoints()) == 0 {\n\t\t\t\t\treturn errors.Errorf(\"illegal orderer config update detected: endpoints of org %s are missing\", org.Name())\n\t\t\t\t}","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/common/channelconfig/bundle.go#L67-L103","documentation":"Config-update sanity check in Bundle.ValidateNew: the current channel config has an Orderer group but the proposed new config does not, which would silently delete the orderer section — not permitted.","triggerScenarios":"Thrown at common/channelconfig/bundle.go:85 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Include the full Orderer group in the new config being submitted","If decommissioning orderers is intended, remove them via supported config-update procedures, not by dropping the group"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}