hyperledger/fabric · error
endorsements should either be both nil or not nil
Error message
endorsements should either be both nil or not nil
What it means
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.
Source
Thrown at core/common/ccpackage/ccpackage.go:56
}
return ch, sp, nil
}
// This file provides functions for helping with the chaincode install
// package workflow. In particular
// OwnerCreateSignedCCDepSpec - each owner creates signs the package using the same deploy
// CreateSignedCCDepSpecForInstall - an admin or owner creates the package to be installed
// using the packages from OwnerCreateSignedCCDepSpec
// ValidateCip validate the endorsed package against the base package
func ValidateCip(baseCip, otherCip *peer.SignedChaincodeDeploymentSpec) error {
if baseCip == nil || otherCip == nil {
panic("do not call with nil parameters")
}
if (baseCip.OwnerEndorsements == nil && otherCip.OwnerEndorsements != nil) || (baseCip.OwnerEndorsements != nil && otherCip.OwnerEndorsements == nil) {
return errors.New("endorsements should either be both nil or not nil")
}
bN := len(baseCip.OwnerEndorsements)
oN := len(otherCip.OwnerEndorsements)
if bN > 1 || oN > 1 {
return errors.New("expect utmost 1 endorsement from a owner")
}
if bN != oN {
return fmt.Errorf("Rule-all packages should be endorsed or none should be endorsed failed for (%d, %d)", bN, oN)
}
if !bytes.Equal(baseCip.ChaincodeDeploymentSpec, otherCip.ChaincodeDeploymentSpec) {
return fmt.Errorf("Rule-all deployment specs should match(%d, %d)", len(baseCip.ChaincodeDeploymentSpec), len(otherCip.ChaincodeDeploymentSpec))
}
if !bytes.Equal(baseCip.InstantiationPolicy, otherCip.InstantiationPolicy) {
return fmt.Errorf("Rule-all instantiation policies should match(%d, %d)", len(baseCip.InstantiationPolicy), len(otherCip.InstantiationPolicy))View on GitHub (pinned to 2736b63f8f)
Solutions
- Ensure all owners sign their packages (or none do) before collating with CreateSignedCCDepSpecForInstall
- Re-collect packages from all owners with consistent endorsement behavior
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at core/common/ccpackage/ccpackage.go:56 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/fd9d02071bee600f.
Report an issue: GitHub.