{"record":{"id":"7514e687a893ac8e","repo":"hyperledger/fabric","slug":"empty-creator","errorCode":null,"errorMessage":"empty creator","messagePattern":"empty creator","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/tx/endorser/parser.go","lineNumber":145,"sourceCode":"func (e *EndorserTx) validate() error {\n\tif e.Epoch != 0 {\n\t\treturn errors.Errorf(\"invalid epoch in ChannelHeader. Expected 0, got [%d]\", e.Epoch)\n\t}\n\n\tif e.Version != 0 {\n\t\treturn errors.Errorf(\"invalid version in ChannelHeader. Expected 0, got [%d]\", e.Version)\n\t}\n\n\tif err := ValidateChannelID(e.ChannelID); err != nil {\n\t\treturn err\n\t}\n\n\tif len(e.Nonce) == 0 {\n\t\treturn errors.New(\"empty nonce\")\n\t}\n\n\tif len(e.Creator) == 0 {\n\t\treturn errors.New(\"empty creator\")\n\t}\n\n\tif e.ChaincodeID == nil {\n\t\treturn errors.New(\"nil ChaincodeId\")\n\t}\n\n\tif e.ChaincodeID.Name == \"\" {\n\t\treturn errors.New(\"empty chaincode name in chaincode id\")\n\t}\n\n\t// TODO FAB-16170: check proposal hash\n\n\t// TODO FAB-16170: verify that txid matches the one in the header\n\n\t// TODO FAB-16170: check that header in the tx action and channel header match bitwise\n\n\treturn nil\n}","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/tx/endorser/parser.go#L127-L163","documentation":"This error is thrown by the endorser transaction parser's validate() method when the transaction's creator identity (serialized identity bytes in the proposal header) is empty. The library requires a non-empty creator to attribute the transaction to a client and later verify its signature. Without a creator the transaction cannot be authenticated, so it is rejected before further validation.","triggerScenarios":"Calling the transaction validation path on a SignedProposal/Payload whose SignatureHeader.Creator byte slice has length 0 — e.g. a programmatically constructed proposal where the creator was never set via a serialized identity.","commonSituations":"Building raw proposals or envelopes with the low-level protoutil APIs instead of the SDK; forgetting to call localmsp/identity serializer to fill SignatureHeader.Creator; test harnesses that populate nonce but not creator; protobuf unmarshalling failures silently leaving Creator nil.","solutions":["Set SignatureHeader.Creator to the serialized client identity (via mspmgmt.GetLocalSigningIdentityOrPanic().Serialize() or the SDK's identity context) before submitting.","If constructing a Payload programmatically, copy the Creator from a successfully-signed proposal generated by the SDK.","Add a pre-submit check len(sigHeader.Creator) > 0 in your client code to fail fast with a clearer message."],"exampleFix":"// before\nsh := &common.SignatureHeader{Nonce: nonce}\n// after\ncreator, err := mspmgmt.GetLocalMSP().GetDefaultSigningIdentity().Serialize()\nif err != nil { return err }\nsh := &common.SignatureHeader{Nonce: nonce, Creator: creator}","handlingStrategy":"validation","validationCode":"if len(sigHeader.Creator) == 0 { return errors.New(\"proposal creator identity is empty; set SignatureHeader.Creator\") }","typeGuard":"func hasCreator(sh *common.SignatureHeader) bool { return sh != nil && len(sh.Creator) > 0 }","tryCatchPattern":null,"preventionTips":["Always obtain creator bytes from the MSP signing identity serializer, never hand-roll them.","Build proposals through the SDK, which fills SignatureHeader automatically.","Add a submit-time assertion on all SignatureHeader fields (Nonce and Creator)."],"tags":["fabric","transaction-validation","identity"],"backgroundTag":"missing-transaction-creator","analyzedSha":"2736b63f8fd5932511d56fe68b7039d15977f7f6","analyzedAt":"2026-09-04T08:52:36.465Z","contentChangedAt":"2026-09-04T08:52:36.465Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}