hyperledger/fabric · error
owner not provided
Error message
owner not provided
What it means
SignExistingPackage adds an owner's endorsement to an already-signed chaincode package. It requires a SignerSerializer for the owner; if the owner argument is nil there is no identity to serialize or sign with, so the call fails immediately with this sentinel error.
Source
Thrown at core/common/ccpackage/ccpackage.go:205
if err != nil {
return nil, fmt.Errorf("Could not sign the ccpackage, err %s", err)
}
// each owner starts off the endorsements with one element. All such endorsed
// packages will be collected in a final package by CreateSignedCCDepSpecForInstall
// when endorsements will have all the entries
endorsements = make([]*peer.Endorsement, 1)
endorsements[0] = &peer.Endorsement{Signature: signature, Endorser: endorser}
}
return createSignedCCDepSpec(cdsbytes, instpolicybytes, endorsements)
}
// SignExistingPackage adds a signature to a signed package.
func SignExistingPackage(env *common.Envelope, owner identity.SignerSerializer) (*common.Envelope, error) {
if owner == nil {
return nil, errors.New("owner not provided")
}
ch, sdepspec, err := ExtractSignedCCDepSpec(env)
if err != nil {
return nil, err
}
if ch == nil {
return nil, errors.New("channel header not found in the envelope")
}
if sdepspec == nil || sdepspec.ChaincodeDeploymentSpec == nil || sdepspec.InstantiationPolicy == nil || sdepspec.OwnerEndorsements == nil {
return nil, errors.New("invalid signed deployment spec")
}
// serialize the signing identity
endorser, err := owner.Serialize()
if err != nil {View on GitHub (pinned to 2736b63f8f)
Solutions
- Obtain a valid signer before calling: signer, err := mspmgmt.GetLocalMSP().GetDefaultSigner(); handle the error instead of passing nil
- If signing is optional, use OwnerCreateSignedCCDepSpec with owner=nil instead of SignExistingPackage (it allows nil owner)
- Add a nil check for the signer variable at the call site
Example fix
// before
env, err := ccpackage.SignExistingPackage(env, signer) // signer may be nil
// after
if signer == nil {
return errors.New("no signer available: initialize local MSP first")
}
env, err := ccpackage.SignExistingPackage(env, signer) Defensive patterns
Strategy: validation
Validate before calling
if owner == nil {
return errors.New("SignExistingPackage requires a signer; initialize local MSP first")
}
env, err := ccpackage.SignExistingPackage(env, owner) Type guard
func hasSigner(s identity.SignerSerializer) bool { return s != nil } Try / catch
env, err := ccpackage.SignExistingPackage(env, owner)
if err != nil {
if err.Error() == "owner not provided" {
return fmt.Errorf("load signer via mspmgmt.GetLocalMSP().GetDefaultSigner(): %w", err)
}
return err
} Prevention
- Resolve the signer at startup and fail fast if absent
- Do not pass optional/nil signers to SignExistingPackage; use OwnerCreateSignedCCDepSpec for unsigned flows
- Log signer identity at debug level to confirm it loaded
When it happens
Trigger: Calling SignExistingPackage(env, nil) — e.g. the signer lookup (mspmgmt.GetLocalMSP().GetDefaultSigner()) returned nil without error, or a nil variable was passed in a batch-signing loop.
Common situations: Tooling that signs packages collected from multiple orgs where one org's signer failed to load; scripts running outside the peer context where no local MSP signer was set; tests passing nil deliberately.
Related errors
- invalid chaincode deployment spec
- Could not sign the ccpackage, err %s
- channel header not found in the envelope
- invalid signed deployment spec
- invalid deployment spec
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/a6344e8c28421470.
Report an issue: GitHub.