{"record":{"id":"9d23432c02b44d6c","repo":"hyperledger/fabric","slug":"unknown-collection-configuration-type-9d2343","errorCode":null,"errorMessage":"unknown collection configuration type","messagePattern":"unknown collection configuration type","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/handlers/validation/builtin/v12/validation_logic.go","lineNumber":209,"sourceCode":"\t\tData:      env.Payload,\n\t\tIdentity:  shdr.Creator,\n\t\tSignature: env.Signature,\n\t}}\n\terr = vscc.policyEvaluator.Evaluate(instantiationPolicy, sd)\n\tif err != nil {\n\t\treturn policyErr(fmt.Errorf(\"chaincode instantiation policy violated, error %s\", err))\n\t}\n\treturn nil\n}\n\nfunc validateNewCollectionConfigs(newCollectionConfigs []*pb.CollectionConfig) error {\n\tnewCollectionsMap := make(map[string]bool, len(newCollectionConfigs))\n\t// Process each collection config from a set of collection configs\n\tfor _, newCollectionConfig := range newCollectionConfigs {\n\n\t\tnewCollection := newCollectionConfig.GetStaticCollectionConfig()\n\t\tif newCollection == nil {\n\t\t\treturn errors.New(\"unknown collection configuration type\")\n\t\t}\n\n\t\t// Ensure that there are no duplicate collection names\n\t\tcollectionName := newCollection.GetName()\n\n\t\tif err := validateCollectionName(collectionName); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif _, ok := newCollectionsMap[collectionName]; !ok {\n\t\t\tnewCollectionsMap[collectionName] = true\n\t\t} else {\n\t\t\treturn fmt.Errorf(\"collection-name: %s -- found duplicate collection configuration\", collectionName)\n\t\t}\n\n\t\t// Validate gossip related parameters present in the collection config\n\t\tmaximumPeerCount := newCollection.GetMaximumPeerCount()\n\t\trequiredPeerCount := newCollection.GetRequiredPeerCount()","sourceCodeStart":191,"sourceCodeEnd":227,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/handlers/validation/builtin/v12/validation_logic.go#L191-L227","documentation":"When validating a collection configuration upgrade, validateNewCollectionConfigs extracts each CollectionConfig's StaticCollectionConfig. If GetStaticCollectionConfig() returns nil, the entry is of an unknown/unrecognized collection configuration type and the whole collection upgrade is rejected.","triggerScenarios":"A collection config package in a chaincode upgrade whose CollectionConfig payload is not a StaticCollectionConfig (nil static config), typically due to a malformed or future-version protobuf message being submitted in the collections upgrade set.","commonSituations":"Hand-edited or tool-generated collections_config.json/proto that wraps nothing or an unsupported type; submitting collections config produced by a newer Fabric version with an unrecognized collection type to an older peer; corrupted chaincode upgrade package.","solutions":["Ensure every entry in the CollectionConfigPackage contains a StaticCollectionConfig (correctly set the oneof payload)","Regenerate the collections configuration using the peer CLI (peer chaincode upgrade -collections-config) instead of hand-crafting protos","Align peer and SDK/tool versions so the collection config types match the supported schema"],"exampleFix":"// before\ncfg := &pb.CollectionConfig{} // no payload set -> StaticCollectionConfig nil\nconfigs = append(configs, cfg)\n// after\ncfg := &pb.CollectionConfig{Payload: &pb.CollectionConfig_StaticCollectionConfig{\n    StaticCollectionConfig: &pb.StaticCollectionConfig{Name: \"col1\", ...}}}\nconfigs = append(configs, cfg)","handlingStrategy":"validation","validationCode":"for _, cfg := range collectionConfigPackage.Config {\n    if cfg.GetStaticCollectionConfig() == nil {\n        return errors.New(\"collection config entry missing StaticCollectionConfig payload\")\n    }\n}","typeGuard":"func isStatic(cfg *pb.CollectionConfig) bool {\n    return cfg != nil && cfg.GetStaticCollectionConfig() != nil\n}","tryCatchPattern":null,"preventionTips":["Generate collection configs with supported tooling/CLI, not hand-built protos","Pin SDK/Fabric versions so collection config schemas match","Validate collections JSON/proto before chaincode upgrade"],"tags":["go","collections","validation","protobuf"],"backgroundTag":"unknown-collection-config-type","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"}