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

  1. Obtain a valid signer before calling: signer, err := mspmgmt.GetLocalMSP().GetDefaultSigner(); handle the error instead of passing nil
  2. If signing is optional, use OwnerCreateSignedCCDepSpec with owner=nil instead of SignExistingPackage (it allows nil owner)
  3. 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

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


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/a6344e8c28421470. Report an issue: GitHub.