{"record":{"id":"436e45d213c198cb","repo":"hyperledger/fabric","slug":"nil-chaincodeendorsedaction","errorCode":null,"errorMessage":"nil ChaincodeEndorsedAction","messagePattern":"nil ChaincodeEndorsedAction","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"core/tx/endorser/parser.go","lineNumber":83,"sourceCode":"\t}\n\n\ttxAction := tx.GetActions()[0]\n\n\tif txAction == nil {\n\t\treturn nil, errors.New(\"nil action\")\n\t}\n\n\tif len(txAction.Payload) == 0 {\n\t\treturn nil, errors.New(\"empty ChaincodeActionPayload\")\n\t}\n\n\tccActionPayload, err := protoutil.UnmarshalChaincodeActionPayload(txAction.Payload)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif ccActionPayload.Action == nil {\n\t\treturn nil, errors.New(\"nil ChaincodeEndorsedAction\")\n\t}\n\n\tif len(ccActionPayload.Action.ProposalResponsePayload) == 0 {\n\t\treturn nil, errors.New(\"empty ProposalResponsePayload\")\n\t}\n\n\tproposalResponsePayload, err := protoutil.UnmarshalProposalResponsePayload(\n\t\tccActionPayload.Action.ProposalResponsePayload,\n\t)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif len(proposalResponsePayload.Extension) == 0 {\n\t\treturn nil, errors.New(\"nil Extension\")\n\t}\n\n\tccAction, err := protoutil.UnmarshalChaincodeAction(proposalResponsePayload.Extension)","sourceCodeStart":65,"sourceCodeEnd":101,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/tx/endorser/parser.go#L65-L101","documentation":"The ChaincodeActionPayload deserialized successfully but its Action field (the ChaincodeEndorsedAction holding the proposal response payload and endorsements) is nil. Without an endorsed action there are no endorsements or results to validate, so the parser rejects the transaction.","triggerScenarios":"UnmarshalEndorserTxAndValidate is given a transaction whose ChaincodeActionPayload.Action is nil — the payload was marshaled with only Endorsements or Extension set, or Action was omitted entirely.","commonSituations":"Custom transaction assembly that fills ChaincodeActionPayload but forgets the Action sub-message; protobufs built by tooling versions that left Action unset; corrupted payloads that unmarshal partially.","solutions":["Set ChaincodeActionPayload.Action to a populated ChaincodeEndorsedAction (ProposalResponsePayload + Endorsements) before marshaling.","Regenerate the transaction via the normal endorse/assemble flow so the endorsed action is always present.","Inspect the producer of the payload for a code path that constructs it without Action."],"exampleFix":"// before\nccPayload := &peer.ChaincodeActionPayload{Endorsements: endorsements} // Action missing\n// after\nccPayload := &peer.ChaincodeActionPayload{\n    Action: &peer.ChaincodeEndorsedAction{\n        ProposalResponsePayload: prpBytes,\n        Endorsements:            endorsements,\n    },\n}","handlingStrategy":"validation","validationCode":"func hasEndorsedAction(ccPayloadBytes []byte) bool {\n    p := &peer.ChaincodeActionPayload{}\n    if proto.Unmarshal(ccPayloadBytes, p) != nil {\n        return false\n    }\n    return p.GetAction() != nil\n}","typeGuard":"func isEndorsed(p *peer.ChaincodeActionPayload) bool {\n    return p.GetAction() != nil && len(p.GetAction().Endorsements) > 0\n}","tryCatchPattern":"tx, err := parser.UnmarshalEndorserTxAndValidate(env)\nif err != nil {\n    if strings.Contains(err.Error(), \"nil ChaincodeEndorsedAction\") {\n        // endorsed action missing: transaction has no endorsements, reject\n        return ErrNoEndorsement\n    }\n    return err\n}","preventionTips":["Populate ChaincodeActionPayload.Action with proposal response payload and endorsements.","Regenerate transactions through the standard endorse -> assemble flow.","Audit custom builders for fields left unset."],"tags":["hyperledger-fabric","transaction","validation"],"backgroundTag":"malformed-envelope-payload","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"}