{"record":{"id":"fd9d02071bee600f","repo":"hyperledger/fabric","slug":"endorsements-should-either-be-both-nil-or-not-nil","errorCode":null,"errorMessage":"endorsements should either be both nil or not nil","messagePattern":"endorsements should either be both nil or not nil","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/common/ccpackage/ccpackage.go","lineNumber":56,"sourceCode":"\t}\n\n\treturn ch, sp, nil\n}\n\n// This file provides functions for helping with the chaincode install\n// package workflow. In particular\n//     OwnerCreateSignedCCDepSpec - each owner creates signs the package using the same deploy\n//     CreateSignedCCDepSpecForInstall - an admin or owner creates the package to be installed\n//                                       using the packages from OwnerCreateSignedCCDepSpec\n\n// ValidateCip validate the endorsed package against the base package\nfunc ValidateCip(baseCip, otherCip *peer.SignedChaincodeDeploymentSpec) error {\n\tif baseCip == nil || otherCip == nil {\n\t\tpanic(\"do not call with nil parameters\")\n\t}\n\n\tif (baseCip.OwnerEndorsements == nil && otherCip.OwnerEndorsements != nil) || (baseCip.OwnerEndorsements != nil && otherCip.OwnerEndorsements == nil) {\n\t\treturn errors.New(\"endorsements should either be both nil or not nil\")\n\t}\n\n\tbN := len(baseCip.OwnerEndorsements)\n\toN := len(otherCip.OwnerEndorsements)\n\tif bN > 1 || oN > 1 {\n\t\treturn errors.New(\"expect utmost 1 endorsement from a owner\")\n\t}\n\n\tif bN != oN {\n\t\treturn fmt.Errorf(\"Rule-all packages should be endorsed or none should be endorsed failed for (%d, %d)\", bN, oN)\n\t}\n\n\tif !bytes.Equal(baseCip.ChaincodeDeploymentSpec, otherCip.ChaincodeDeploymentSpec) {\n\t\treturn fmt.Errorf(\"Rule-all deployment specs should match(%d, %d)\", len(baseCip.ChaincodeDeploymentSpec), len(otherCip.ChaincodeDeploymentSpec))\n\t}\n\n\tif !bytes.Equal(baseCip.InstantiationPolicy, otherCip.InstantiationPolicy) {\n\t\treturn fmt.Errorf(\"Rule-all instantiation policies should match(%d, %d)\", len(baseCip.InstantiationPolicy), len(otherCip.InstantiationPolicy))","sourceCodeStart":38,"sourceCodeEnd":74,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/common/ccpackage/ccpackage.go#L38-L74","documentation":"ValidateCip found one SignedChaincodeDeploymentSpec carries OwnerEndorsements while the other does not. The collation rule requires all owner packages to be endorsed uniformly — mixing endorsed and non-endorsed packages is invalid.","triggerScenarios":"Thrown at core/common/ccpackage/ccpackage.go:56 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Ensure all owners sign their packages (or none do) before collating with CreateSignedCCDepSpecForInstall","Re-collect packages from all owners with consistent endorsement behavior"],"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"}