{"record":{"id":"622086abcab481de","repo":"hyperledger/fabric","slug":"no-orderer-group-in-channel-groups","errorCode":null,"errorMessage":"no 'Orderer' group in channel groups","messagePattern":"no 'Orderer' group in channel groups","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"orderer/consensus/smartbft/configverifier.go","lineNumber":108,"sourceCode":"\t\treturn errors.Errorf(\"unexpected envelope type %s\", common.HeaderType_name[chdr.Type])\n\t}\n}\n\nfunc (cbv *ConfigBlockValidator) checkConsentersMatchPolicy(conf *common.Config) error {\n\tif conf == nil {\n\t\treturn fmt.Errorf(\"empty Config\")\n\t}\n\n\tif conf.ChannelGroup == nil {\n\t\treturn fmt.Errorf(\"empty channel group\")\n\t}\n\n\tif len(conf.ChannelGroup.Groups) == 0 {\n\t\treturn fmt.Errorf(\"no groups in channel group\")\n\t}\n\n\tif conf.ChannelGroup.Groups[\"Orderer\"] == nil {\n\t\treturn fmt.Errorf(\"no 'Orderer' group in channel groups\")\n\t}\n\n\tif len(conf.ChannelGroup.Groups[\"Orderer\"].Values) == 0 {\n\t\treturn fmt.Errorf(\"no values in 'Orderer' group\")\n\t}\n\n\tif conf.ChannelGroup.Groups[\"Orderer\"].Values[\"Orderers\"] == nil {\n\t\treturn fmt.Errorf(\"no values in 'Orderer' group\")\n\t}\n\n\tords := &common.Orderers{}\n\tif err := proto.Unmarshal(conf.ChannelGroup.Groups[\"Orderer\"].Values[\"Orderers\"].Value, ords); err != nil {\n\t\treturn err\n\t}\n\n\tn := len(ords.ConsenterMapping)\n\tf := (n - 1) / 3\n","sourceCodeStart":90,"sourceCodeEnd":126,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/orderer/consensus/smartbft/configverifier.go#L90-L126","documentation":"The SmartBFT consenter checks live under ChannelGroup.Groups[\"Orderer\"]. If that group is absent the verifier cannot read the 'Orderers' value or the BlockValidation policy, so it fails with 'no Orderer group in channel groups'. This is SmartBFT-specific: a BFT channel must have an Orderer group defining its consenter mapping.","triggerScenarios":"Validating a SmartBFT channel config whose ChannelGroup.Groups lacks an \"Orderer\" key — e.g. an application-only config, a config produced for a Raft/Solo channel, or a typo'd group name in generated config.","commonSituations":"Switching a channel to SmartBFT without regenerating the full orderer config; configtx profiles omitting the Orderer section; tooling that builds the config tree with only Application groups.","solutions":["Ensure ChannelGroup.Groups contains an \"Orderer\" group populated by the orderer section of your configtx profile","Regenerate the channel config with configtxgen using a profile with Orderer: Orderers/ConsensusType set for SmartBFT","If converting an existing channel, perform the standard consensus-type migration steps so the Orderer group and 'Orderers' value exist"],"exampleFix":"// before\nGroups: map[string]*common.ConfigGroup{\"Application\": appGroup} // missing Orderer\n// after\nGroups: map[string]*common.ConfigGroup{\n  \"Orderer\": ordererGroup, // contains Values[\"Orderers\"], Values[\"ConsensusType\"], Policies[\"BlockValidation\"]\n  \"Application\": appGroup,\n}","handlingStrategy":"validation","validationCode":"func hasOrdererGroup(conf *common.Config) bool {\n  return conf != nil && conf.ChannelGroup != nil && conf.ChannelGroup.Groups[\"Orderer\"] != nil\n}","typeGuard":"func hasOrdererGroup(c *common.Config) bool {\n  return c != nil && c.GetChannelGroup() != nil && c.GetChannelGroup().GetGroups()[\"Orderer\"] != nil\n}","tryCatchPattern":"if err := cbv.ValidateConfig(envelope); err != nil {\n  if strings.Contains(err.Error(), \"no 'Orderer' group\") {\n    return fmt.Errorf(\"not a valid SmartBFT channel config: %w\", err)\n  }\n  return err\n}","preventionTips":["Use a configtx profile with an Orderer section and SmartBFT consensus when creating BFT channels","Check Groups[\"Orderer\"] presence (plus Values[\"Orderers\"]) before submitting config updates to a SmartBFT channel","When migrating consensus types, follow the official migration procedure so the Orderer group is populated"],"tags":["hyperledger-fabric","smartbft","config-validation","orderer-group"],"backgroundTag":"missing-orderer-config","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"}