{"record":{"id":"6a202dd684427bd6","repo":"hyperledger/fabric","slug":"collection-configuration-is-empty","errorCode":null,"errorMessage":"collection configuration is empty","messagePattern":"collection configuration is empty","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/chaincode/lifecycle/scc.go","lineNumber":785,"sourceCode":"\t\treturn nil\n\t}\n\tif err := validateCollConfigsAgainstCommittedDef(collConfigs, committedCCDef.ExplicitCollectionConfigPkg); err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc extractStaticCollectionConfigs(collConfigPkg *pb.CollectionConfigPackage) ([]*pb.StaticCollectionConfig, error) {\n\tif collConfigPkg == nil || len(collConfigPkg.Config) == 0 {\n\t\treturn nil, nil\n\t}\n\tcollConfigs := make([]*pb.StaticCollectionConfig, len(collConfigPkg.Config))\n\tfor i, c := range collConfigPkg.Config {\n\t\tswitch t := c.Payload.(type) {\n\t\tcase *pb.CollectionConfig_StaticCollectionConfig:\n\t\t\tcollConfig := t.StaticCollectionConfig\n\t\t\tif collConfig == nil {\n\t\t\t\treturn nil, errors.Errorf(\"collection configuration is empty\")\n\t\t\t}\n\t\t\tcollConfigs[i] = collConfig\n\t\tdefault:\n\t\t\t// this should only occur if a developer has added a new\n\t\t\t// collection config type\n\t\t\treturn nil, errors.Errorf(\"collection config contains unexpected payload type: %T\", t)\n\t\t}\n\t}\n\treturn collConfigs, nil\n}\n\nfunc validateCollectionConfigs(collConfigs []*pb.StaticCollectionConfig, mspMgr msp.MSPManager) error {\n\tif len(collConfigs) == 0 {\n\t\treturn nil\n\t}\n\tcollNamesMap := map[string]struct{}{}\n\t// Process each collection config from a set of collection configs\n\tfor _, c := range collConfigs {","sourceCodeStart":767,"sourceCodeEnd":803,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/chaincode/lifecycle/scc.go#L767-L803","documentation":"extractStaticCollectionConfigs walks each CollectionConfig in the package payload; when a StaticCollectionConfig entry is present but nil, there is no actual collection definition to use, so it rejects the package with 'collection configuration is empty'.","triggerScenarios":"Submitting a CollectionConfigPackage whose Config array contains a CollectionConfig_StaticCollectionConfig wrapper with a nil StaticCollectionConfig, via ApproveChaincodeDefinitionForMyOrg or CommitChaincodeDefinition with collections.","commonSituations":"Constructing collection config JSON/protobuf programmatically and leaving a placeholder entry, or a client SDK emitting empty collection objects in the package.","solutions":["Remove nil/placeholder entries from the collection config package before approval","Fully populate each StaticCollectionConfig (name, member_orgs_policy, required_peer_count, max_peer_count, block_to_live)","Regenerate the collection-config JSON and re-run approve/commit with the corrected package"],"exampleFix":"// before\ncollectionsConfig := [{ \"static_collection_config\": null }]\n// after\ncollectionsConfig := [{ \"name\": \"coll1\", \"member_orgs_policy\": ..., \"required_peer_count\": 1, \"max_peer_count\": 2, \"block_to_live\": 0 }]","handlingStrategy":"validation","validationCode":"// Go: pre-validate collection package entries are fully populated\nfunc validateCollections(pkg *pb.CollectionConfigPackage) error {\n    for _, c := range pkg.GetConfig() {\n        sc := c.GetStaticCollectionConfig()\n        if sc == nil || sc.Name == \"\" || sc.MemberOrgsPolicy == nil {\n            return fmt.Errorf(\"collection config entry incomplete\")\n        }\n    }\n    return nil\n}","typeGuard":"func asStaticCollection(c *pb.CollectionConfig) (*pb.StaticCollectionConfig, bool) {\n    sc := c.GetStaticCollectionConfig()\n    return sc, sc != nil\n}","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"collection configuration is empty\") {\n    // reject collection config payload before approve/commit\n}","preventionTips":["Validate collections.json against the Fabric schema before packaging","Reject nil collection entries in SDK/tooling that builds CollectionConfigPackage","Use peer lifecycle chaincode approveformyorg --collections-file only after schema validation"],"tags":["hyperledger-fabric","private-data","collections"],"backgroundTag":"invalid-collection-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"}