{"record":{"id":"df39fce950106173","repo":"hyperledger/fabric","slug":"nil-presppayload-extension","errorCode":null,"errorMessage":"nil pRespPayload.Extension","messagePattern":"nil pRespPayload\\.Extension","errorType":"validation","errorClass":"VSCCEndorsementPolicyError","httpStatus":null,"severity":"error","filePath":"core/handlers/validation/builtin/v12/validation_logic.go","lineNumber":567,"sourceCode":"\t\t// it can't match the name of one of the system chaincodes\n\t\tif _, in := systemChaincodeNames[ccName]; in {\n\t\t\treturn policyErr(errors.Errorf(\"chaincode name '%s' is reserved for system chaincodes\", ccName))\n\t\t}\n\n\t\t// validate chaincode version\n\t\tccVersion := cdsArgs.ChaincodeSpec.ChaincodeId.Version\n\t\t// it must comply with the lscc.ChaincodeVersionRegExp\n\t\tif !lscc.ChaincodeVersionRegExp.MatchString(ccVersion) {\n\t\t\treturn policyErr(errors.Errorf(\"invalid chaincode version '%s'\", ccVersion))\n\t\t}\n\n\t\t// get the rwset\n\t\tpRespPayload, err := protoutil.UnmarshalProposalResponsePayload(cap.Action.ProposalResponsePayload)\n\t\tif err != nil {\n\t\t\treturn policyErr(fmt.Errorf(\"GetProposalResponsePayload error %s\", err))\n\t\t}\n\t\tif pRespPayload.Extension == nil {\n\t\t\treturn policyErr(fmt.Errorf(\"nil pRespPayload.Extension\"))\n\t\t}\n\t\trespPayload, err := protoutil.UnmarshalChaincodeAction(pRespPayload.Extension)\n\t\tif err != nil {\n\t\t\treturn policyErr(fmt.Errorf(\"GetChaincodeAction error %s\", err))\n\t\t}\n\t\ttxRWSet := &rwsetutil.TxRwSet{}\n\t\tif err = txRWSet.FromProtoBytes(respPayload.Results); err != nil {\n\t\t\treturn policyErr(fmt.Errorf(\"txRWSet.FromProtoBytes error %s\", err))\n\t\t}\n\n\t\t// extract the rwset for lscc\n\t\tvar lsccrwset *kvrwset.KVRWSet\n\t\tfor _, ns := range txRWSet.NsRwSets {\n\t\t\tlogger.Debugf(\"Namespace %s\", ns.NameSpace)\n\t\t\tif ns.NameSpace == \"lscc\" {\n\t\t\t\tlsccrwset = ns.KvRwSet\n\t\t\t\tbreak\n\t\t\t}","sourceCodeStart":549,"sourceCodeEnd":585,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/core/handlers/validation/builtin/v12/validation_logic.go#L549-L585","documentation":"After decoding the ProposalResponsePayload, VSCC requires a non-nil Extension field, which carries the ChaincodeAction (results, events, response). A nil Extension means the endorser response payload was empty/malformed, so the lscc transaction is rejected as a policy error.","triggerScenarios":"The ProposalResponsePayload in an lscc transaction was constructed without its Extension (ChaincodeAction) — e.g. the proposal response was created manually or the endorser returned a payload lacking the extension.","commonSituations":"Custom transaction builders omitting the extension, endorsers running modified/buggy code, or payload stripping by proxies; also seen in adversarial/fuzzed transactions rejected at commit validation.","solutions":["Build the transaction from a genuine endorser response (its Payload already contains the ProposalResponsePayload with Extension populated).","Verify the endorsing peer returned a complete ProposalResponsePayload (inspect with protoutil.UnmarshalProposalResponsePayload locally before signing).","Fix or replace custom payload-assembly code so ChaincodeAction is embedded as the extension."],"exampleFix":"// before\nprp := &pb.ProposalResponsePayload{} // Extension empty\n// after\nprp := &pb.ProposalResponsePayload{\n    ProposalHash: hash,\n    Extension:    chaincodeActionBytes,\n}","handlingStrategy":"validation","validationCode":"prp, err := protoutil.UnmarshalProposalResponsePayload(cap.Action.ProposalResponsePayload)\nif err != nil || prp.Extension == nil {\n    return errors.New(\"proposal response payload missing ChaincodeAction extension\")\n}","typeGuard":"func hasChaincodeAction(prp *pb.ProposalResponsePayload) bool {\n    return prp != nil && prp.Extension != nil\n}","tryCatchPattern":"if prp.Extension == nil {\n    logger.Warn(\"endorser returned payload without ChaincodeAction; rejecting tx\")\n    return policyErr(errors.New(\"nil pRespPayload.Extension\"))\n}","preventionTips":["Build transactions from genuine endorser responses, never synthesized payloads.","Verify endorsers are running unmodified, healthy Fabric code.","Inspect ProposalResponsePayload completeness before endorsement collection."],"tags":["fabric","vscc","lscc","endorsement","validation"],"backgroundTag":"malformed-transaction-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"}