hyperledger/fabric · error

creator is empty

Error message

creator is empty

What it means

The proposal's SignatureHeader.Creator field (the serialized identity of the submitting client) is empty. The endorser needs the creator to verify the signature, determine the MSP, and compute the transaction ID. An empty creator means the proposal cannot be attributed or authenticated.

Source

Thrown at core/endorser/msgvalidation.go:153

		// transaction, so any other header type seems like it ought to be an error... oh well.

	default:
		return errors.Errorf("invalid header type %s", common.HeaderType(up.ChannelHeader.Type))
	}

	// ensure the epoch is 0
	if up.ChannelHeader.Epoch != 0 {
		return errors.Errorf("epoch is non-zero")
	}

	// ensure that there is a nonce
	if len(up.SignatureHeader.Nonce) == 0 {
		return errors.Errorf("nonce is empty")
	}

	// ensure that there is a creator
	if len(up.SignatureHeader.Creator) == 0 {
		return errors.New("creator is empty")
	}

	expectedTxID := protoutil.ComputeTxID(up.SignatureHeader.Nonce, up.SignatureHeader.Creator)
	if up.TxID() != expectedTxID {
		return errors.Errorf("incorrectly computed txid '%s' -- expected '%s'", up.TxID(), expectedTxID)
	}

	if up.SignedProposal.ProposalBytes == nil {
		return errors.Errorf("empty proposal bytes")
	}

	if up.SignedProposal.Signature == nil {
		return errors.Errorf("empty signature bytes")
	}

	// get the identity of the creator
	creator, err := idDeserializer.DeserializeIdentity(up.SignatureHeader.Creator)
	if err != nil {

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Load the user identity (cert + key from the wallet/MSP) before building the proposal so Creator is the serialized SigningIdentity.
  2. Set SignatureHeader.Creator to the marshaled identity protobuf (mspprotos.SerializedIdentity with Mspid and IdBytes).
  3. Check the SDK context/user is properly initialized and enrolled for the target organization.

Example fix

// before
shdr := &common.SignatureHeader{Nonce: nonce}
// after
sid, _ := proto.Marshal(&mspprotos.SerializedIdentity{Mspid: "Org1MSP", IdBytes: certPEM})
shdr := &common.SignatureHeader{Nonce: nonce, Creator: sid}
Defensive patterns

Strategy: validation

Validate before calling

if len(shdr.Creator) == 0 {
    return errors.New("creator identity required: marshal SerializedIdentity into SignatureHeader.Creator")
}

Type guard

func hasCreator(sh *common.SignatureHeader) bool {
    return sh != nil && len(sh.Creator) > 0
}

Prevention

When it happens

Trigger: ProcessProposal -> preProcess -> Validate on a SignedProposal whose SignatureHeader.Creator is a zero-length byte slice — the client identity was never serialized into the header.

Common situations: Clients that never call the SDK's identity/context resolution, wallet/identity not loaded before building the proposal, test harnesses omitting the creator, msp serialization failures swallowed earlier.

Related errors


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