{"record":{"id":"93995c792fbe0efa","repo":"hyperledger/fabric","slug":"nil-payload-header","errorCode":null,"errorMessage":"nil payload header","messagePattern":"nil payload header","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/tx/processor_factory.go","lineNumber":71,"sourceCode":"\n\tif len(txenv.Payload) == 0 {\n\t\treturn nil, &tx.InvalidErr{\n\t\t\tActualErr:      errors.New(\"nil envelope payload\"),\n\t\t\tValidationCode: peer.TxValidationCode_BAD_PAYLOAD,\n\t\t}\n\t}\n\n\tpayload, err := protoutil.UnmarshalPayload(txenv.Payload)\n\tif err != nil {\n\t\treturn nil, &tx.InvalidErr{\n\t\t\tActualErr:      err,\n\t\t\tValidationCode: peer.TxValidationCode_BAD_PAYLOAD,\n\t\t}\n\t}\n\n\tif payload.Header == nil {\n\t\treturn nil, &tx.InvalidErr{\n\t\t\tActualErr:      errors.New(\"nil payload header\"),\n\t\t\tValidationCode: peer.TxValidationCode_BAD_PAYLOAD,\n\t\t}\n\t}\n\n\tif len(payload.Header.ChannelHeader) == 0 {\n\t\treturn nil, &tx.InvalidErr{\n\t\t\tActualErr:      errors.New(\"nil payload channel header\"),\n\t\t\tValidationCode: peer.TxValidationCode_BAD_PAYLOAD,\n\t\t}\n\t}\n\n\tchdr, err := protoutil.UnmarshalChannelHeader(payload.Header.ChannelHeader)\n\tif err != nil {\n\t\treturn nil, &tx.InvalidErr{\n\t\t\tActualErr:      err,\n\t\t\tValidationCode: peer.TxValidationCode_BAD_PAYLOAD,\n\t\t}\n\t}","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/tx/processor_factory.go#L53-L89","documentation":"validateProtoAndConstructTxEnv requires payload.Header to be non-nil. A Payload whose Header is unset cannot be routed (no channel, type, or txid), so it is rejected with BAD_PAYLOAD. This check follows successful Payload unmarshalling.","triggerScenarios":"Unmarshalled payload bytes that describe only Data with no Header — e.g. payload := &common.Payload{Data: data} marshaled without setting Header.","commonSituations":"Hand-assembled payloads in tests; payloads built before ChannelHeader/SignatureHeader construction failed or was skipped; older clients producing header-less payloads after a protocol change.","solutions":["Set payload.Header = &common.Header{ChannelHeader: chdrBytes, SignatureHeader: shdrBytes} before marshaling.","Use protoutil.MakeChannelHeader + protoutil.MakePayloadHeader helpers to build a complete header.","Check payload.Header != nil before submit/marshal in client code."],"exampleFix":"// before\npayload := &common.Payload{Data: cceBytes}\n// after\npayload := &common.Payload{Header: protoutil.MakePayloadHeader(chdr, shdr), Data: cceBytes}","handlingStrategy":"validation","validationCode":"if payload.Header == nil { return errors.New(\"payload header is nil\") }","typeGuard":"func hasHeader(p *common.Payload) bool { return p != nil && p.Header != nil }","tryCatchPattern":null,"preventionTips":["Always construct payloads with protoutil.MakePayloadHeader.","After building a payload, assert Header, ChannelHeader, and SignatureHeader are all set before marshal.","Review any code path that constructs common.Payload manually."],"tags":["fabric","transaction-validation","payload"],"backgroundTag":"malformed-envelope","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"}