{"record":{"id":"471f2744d6ad7e90","repo":"hyperledger/fabric","slug":"chaincode-install-failed-received-nil-proposal-re","errorCode":null,"errorMessage":"chaincode install failed: received nil proposal response","messagePattern":"chaincode install failed: received nil proposal response","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/peer/lifecycle/chaincode/install.go","lineNumber":158,"sourceCode":"\t\treturn err\n\t}\n\n\tsignedProposal, err := signProposal(proposal, i.Signer)\n\tif err != nil {\n\t\treturn errors.WithMessage(err, \"failed to create signed proposal for chaincode install\")\n\t}\n\n\treturn i.submitInstallProposal(signedProposal)\n}\n\nfunc (i *Installer) submitInstallProposal(signedProposal *pb.SignedProposal) error {\n\tproposalResponse, err := i.EndorserClient.ProcessProposal(context.Background(), signedProposal)\n\tif err != nil {\n\t\treturn errors.WithMessage(err, \"failed to endorse chaincode install\")\n\t}\n\n\tif proposalResponse == nil {\n\t\treturn errors.New(\"chaincode install failed: received nil proposal response\")\n\t}\n\n\tif proposalResponse.Response == nil {\n\t\treturn errors.New(\"chaincode install failed: received proposal response with nil response\")\n\t}\n\n\tif proposalResponse.Response.Status != int32(cb.Status_SUCCESS) {\n\t\treturn errors.Errorf(\"chaincode install failed with status: %d - %s\", proposalResponse.Response.Status, proposalResponse.Response.Message)\n\t}\n\tlogger.Infof(\"Installed remotely: %v\", proposalResponse)\n\n\ticr := &lb.InstallChaincodeResult{}\n\terr = proto.Unmarshal(proposalResponse.Response.Payload, icr)\n\tif err != nil {\n\t\treturn errors.Wrap(err, \"failed to unmarshal proposal response's response payload\")\n\t}\n\tlogger.Infof(\"Chaincode code package identifier: %s\", icr.PackageId)\n","sourceCodeStart":140,"sourceCodeEnd":176,"githubUrl":"https://github.com/hyperledger/fabric/blob/2736b63f8fd5932511d56fe68b7039d15977f7f6/internal/peer/lifecycle/chaincode/install.go#L140-L176","documentation":"submitInstallProposal() got a nil *ProposalResponse from EndorserClient.ProcessProposal along with a nil error — an anomalous gRPC client state. The install could not be endorsed and there is no response object to inspect.","triggerScenarios":"ProcessProposal(context.Background(), signedProposal) returns (nil, nil) during chaincode install; in practice seen when a customized/intercepted endorser client returns nil, or edge cases in transport failure handling.","commonSituations":"Custom endorser client stubs in tests returning nil; proxy layers swallowing errors; Fabric client library edge-case bugs.","solutions":["Retry the install command; transient transport faults can produce empty responses.","Check peer connectivity and TLS settings (CORE_PEER_TLS_ENABLED, roots, addresses).","Inspect peer logs around the request time for dropped/aborted endorsements.","If using custom client code, ensure the endorser client never returns (nil, nil) — always an error with nil."],"exampleFix":"// before: test stub\nreturn nil, nil\n// after\nreturn nil, errors.New(\"endorsement failed: connection reset\")","handlingStrategy":"retry","validationCode":"// check endorser connectivity first\ncc, err := grpc.Dial(peerAddr, tlsOpts...)\nif err != nil { return err }\nendorser := pb.NewEndorserClient(cc)\n_ = endorser","typeGuard":"func validProposalResponse(r *pb.ProposalResponse) bool { return r != nil }","tryCatchPattern":"var resp *pb.ProposalResponse\nerr := backoff.Retry(func() error {\n    var e error\n    resp, e = endorser.ProcessProposal(ctx, sp)\n    if resp == nil && e == nil { return errors.New(\"nil response, retrying\") }\n    return e\n}, backoff.WithMaxRetries(backoff.NewExponentialBackOff(), 3))","preventionTips":["Verify TLS certs and peer address before install","Retry transient endorsement failures","Avoid custom endorser stubs returning (nil, nil)","Monitor peer logs during installs"],"tags":["fabric","endorsement","grpc","nil-response"],"backgroundTag":"nil-proposal-response","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"}