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
- Load the user identity (cert + key from the wallet/MSP) before building the proposal so Creator is the serialized SigningIdentity.
- Set SignatureHeader.Creator to the marshaled identity protobuf (mspprotos.SerializedIdentity with Mspid and IdBytes).
- 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
- Load wallet/user identity before constructing proposals
- Fail fast if identity resolution returns empty bytes
- Test with a real enrolled identity, not placeholder headers
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
- nonce is empty
- access denied: channel [%s] creator org unknown, creator is
- Invalid Proposal's SignatureHeader during check policy on ch
- failed unmarshaling identity %s
- Could not serialize the signing identity: %s
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/bbfe0e4263effbfc.
Report an issue: GitHub.