{"record":{"id":"3a33f5a3be0cdae0","repo":"hyperledger/fabric","slug":"no-payload-in-chaincodeactionpayload","errorCode":null,"errorMessage":"no payload in ChaincodeActionPayload","messagePattern":"no payload in ChaincodeActionPayload","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"protoutil/txutils.go","lineNumber":30,"sourceCode":"\tb64 \"encoding/base64\"\n\n\t\"github.com/hyperledger/fabric-protos-go-apiv2/common\"\n\t\"github.com/hyperledger/fabric-protos-go-apiv2/peer\"\n\t\"github.com/pkg/errors\"\n\t\"google.golang.org/protobuf/proto\"\n)\n\n// GetPayloads gets the underlying payload objects in a TransactionAction\nfunc GetPayloads(txActions *peer.TransactionAction) (*peer.ChaincodeActionPayload, *peer.ChaincodeAction, error) {\n\t// TODO: pass in the tx type (in what follows we're assuming the\n\t// type is ENDORSER_TRANSACTION)\n\tccPayload, err := UnmarshalChaincodeActionPayload(txActions.Payload)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tif ccPayload.Action == nil || ccPayload.Action.ProposalResponsePayload == nil {\n\t\treturn nil, nil, errors.New(\"no payload in ChaincodeActionPayload\")\n\t}\n\tpRespPayload, err := UnmarshalProposalResponsePayload(ccPayload.Action.ProposalResponsePayload)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tif pRespPayload.Extension == nil {\n\t\treturn nil, nil, errors.New(\"response payload is missing extension\")\n\t}\n\n\trespPayload, err := UnmarshalChaincodeAction(pRespPayload.Extension)\n\tif err != nil {\n\t\treturn ccPayload, nil, err\n\t}\n\treturn ccPayload, respPayload, nil\n}\n\n// GetEnvelopeFromBlock gets an envelope from a block's Data field.","sourceCodeStart":12,"sourceCodeEnd":48,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/protoutil/txutils.go#L12-L48","documentation":"GetPayloads walks a Transaction's ChaincodeActionPayload to extract the proposal response payloads (results and events) for a transaction. If ccPayload.Action or its ProposalResponsePayload is nil, the transaction action carries no results, and this error signals the missing payload.","triggerScenarios":"Calling GetPayloads (via GetActionFromEnvelopeMsg or getKeyModificationFromTran) on a transaction whose ChaincodeEndorsedAction has no ProposalResponsePayload — endorsements recorded without a proposal response, or truncated/corrupted transaction payloads.","commonSituations":"Inspecting blocks containing invalid/filtered transactions that were never fully endorsed; chaincode actions created by paths that only record events; corruption in block data consumed by event tools or explorers.","solutions":["Check the transaction validation code/status on the envelope — invalid transactions often lack full action payloads; skip them when walking blocks.","Verify the endorsing peers returned a ProposalResponsePayload and that the endorser path recorded it in the Transaction.","Re-unmarshal the block/envelope from a trusted source to rule out corruption.","If you only need results, guard for nil Action/ProposalResponsePayload and skip instead of treating it as fatal."],"exampleFix":"// before\nres, ev, err := protoutil.GetPayloads(txActions)\n\n// after\nif txActions == nil || txActions.Payload == nil {\n    return nil // nothing to process\n}\nccPayload, _ := protoutil.UnmarshalChaincodeActionPayload(txActions.Payload)\nif ccPayload.Action == nil || ccPayload.Action.ProposalResponsePayload == nil {\n    return nil // invalid/empty action, skip\n}","handlingStrategy":"validation","validationCode":"ccPayload, err := protoutil.UnmarshalChaincodeActionPayload(txActions.Payload)\nif err != nil {\n    return err\n}\nif ccPayload.Action == nil || ccPayload.Action.ProposalResponsePayload == nil {\n    return errors.New(\"transaction has no endorsed action payload; skipping\")\n}","typeGuard":"func hasActionPayload(cc *peer.ChaincodeActionPayload) bool {\n    return cc != nil && cc.Action != nil && cc.Action.ProposalResponsePayload != nil\n}","tryCatchPattern":"res, ev, err := protoutil.GetPayloads(txActions)\nif err != nil {\n    if strings.Contains(err.Error(), \"no payload in ChaincodeActionPayload\") {\n        return nil // invalid or empty transaction; skip in block walkers\n    }\n    return err\n}","preventionTips":["Check TxValidationCode on the envelope before extracting payloads; invalid txs often lack payloads.","In block/event processors, skip rather than fail on transactions without actions.","Verify endorsements returned full ProposalResponsePayloads during submission.","Re-fetch block data if corruption is suspected."],"tags":["fabric","transaction","payload","malformed-tx"],"backgroundTag":"missing-transaction-action-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"}