{"record":{"id":"e4fc322af3e00c4b","repo":"hyperledger/fabric","slug":"unknown-orderer-type-s","errorCode":null,"errorMessage":"unknown orderer type: %s","messagePattern":"unknown orderer type: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/configtxgen/encoder/encoder.go","lineNumber":232,"sourceCode":"\tcase ConsensusTypeEtcdRaft:\n\t\tif consensusMetadata, err = channelconfig.MarshalEtcdRaftMetadata(conf.EtcdRaft); err != nil {\n\t\t\treturn nil, errors.Errorf(\"cannot marshal metadata for orderer type %s: %s\", ConsensusTypeEtcdRaft, err)\n\t\t}\n\tcase ConsensusTypeBFT:\n\t\tconsenterProtos, err := consenterProtosFromConfig(conf.ConsenterMapping)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Errorf(\"cannot load consenter config for orderer type %s: %s\", ConsensusTypeBFT, err)\n\t\t}\n\t\taddValue(ordererGroup, channelconfig.OrderersValue(consenterProtos), channelconfig.AdminsPolicyKey)\n\t\tif consensusMetadata, err = channelconfig.MarshalBFTOptions(conf.SmartBFT); err != nil {\n\t\t\treturn nil, errors.Errorf(\"consenter options read failed with error %s for orderer type %s\", err, ConsensusTypeBFT)\n\t\t}\n\t\t// Force leader rotation to be turned off\n\t\tconf.SmartBFT.LeaderRotation = smartbft.Options_ROTATION_OFF\n\t\t// Overwrite policy manually by computing it from the consenters\n\t\tpolicies.EncodeBFTBlockVerificationPolicy(consenterProtos, ordererGroup)\n\tdefault:\n\t\treturn nil, errors.Errorf(\"unknown orderer type: %s\", conf.OrdererType)\n\t}\n\n\taddValue(ordererGroup, channelconfig.ConsensusTypeValue(conf.OrdererType, consensusMetadata), channelconfig.AdminsPolicyKey)\n\n\tfor _, org := range conf.Organizations {\n\t\tvar err error\n\t\tordererGroup.Groups[org.Name], err = NewOrdererOrgGroup(org, channelCapabilities)\n\t\tif err != nil {\n\t\t\treturn nil, errors.Wrap(err, \"failed to create orderer org\")\n\t\t}\n\t}\n\n\tordererGroup.ModPolicy = channelconfig.AdminsPolicyKey\n\treturn ordererGroup, nil\n}\n\nfunc consenterProtosFromConfig(consenterMapping []*genesisconfig.Consenter) ([]*cb.Consenter, error) {\n\tvar consenterProtos []*cb.Consenter","sourceCodeStart":214,"sourceCodeEnd":250,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/configtxgen/encoder/encoder.go#L214-L250","documentation":"NewOrdererGroup only recognizes solo, etcdraft, and BFT consensus types (the ConsensusType* constants). Any other conf.OrdererType string falls through to the default branch and fails with this error. It is a fail-fast guard against typo'd or unsupported orderer types in the channel configuration.","triggerScenarios":"NewOrdererGroup/NewChannelGroup invoked with genesisconfig.Orderer.OrdererType set to anything other than \"solo\", \"etcdraft\", or \"BFT\" — e.g. \"kafka\", \"raft\", \"smartbft\", or a case mismatch.","commonSituations":"Migrating old Fabric 1.x kafka profiles (kafka was removed), typos like 'etcdRaft' vs 'etcdraft', or writing 'SmartBFT' instead of the constant 'BFT'.","solutions":["Set Orderer.OrdererType exactly to one of: solo, etcdraft, or BFT (case-sensitive)","Replace removed 'kafka' orderer type with etcdraft or BFT","Check capitalization: BFT is uppercase; use 'etcdraft' all lowercase","Regenerate the config after correcting the value"],"exampleFix":"# before\nOrderer:\n    OrdererType: kafka\n# after\nOrderer:\n    OrdererType: etcdraft","handlingStrategy":"validation","validationCode":"var validOrdererTypes = map[string]bool{\"solo\": true, \"etcdraft\": true, \"BFT\": true}\nfunc validateOrdererType(conf *genesisconfig.Orderer) error {\n    if !validOrdererTypes[conf.OrdererType] {\n        return fmt.Errorf(\"OrdererType %q invalid; must be solo, etcdraft, or BFT\", conf.OrdererType)\n    }\n    return nil\n}","typeGuard":"func isKnownOrdererType(t string) bool { return t == \"solo\" || t == \"etcdraft\" || t == \"BFT\" }","tryCatchPattern":"group, err := encoder.NewOrdererGroup(conf, caps)\nif err != nil && strings.Contains(err.Error(), \"unknown orderer type\") {\n    return fmt.Errorf(\"OrdererType must be exactly one of solo/etcdraft/BFT: %w\", err)\n}","preventionTips":["Migrate kafka profiles to etcdraft or BFT; kafka is no longer supported","Watch case sensitivity: 'BFT' uppercase, 'etcdraft' lowercase","Validate the profile with configtxgen (printOrg/config) before deploying"],"tags":["config","hyperledger-fabric","consensus"],"backgroundTag":"invalid-enum-value","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}