hyperledger/fabric · error

received nil proposal response

Error message

received nil proposal response

What it means

InstalledQuerier.Query calls EndorserClient.ProcessProposal and checks the returned ProposalResponse. This error means the gRPC call succeeded but returned a nil ProposalResponse, so there is nothing to inspect for installed chaincodes. It guards against endorsers that return (nil, nil) or a nil message.

Source

Thrown at internal/peer/lifecycle/chaincode/queryinstalled.go:119

	}

	proposal, err := i.createProposal()
	if err != nil {
		return errors.WithMessage(err, "failed to create proposal")
	}

	signedProposal, err := signProposal(proposal, i.Signer)
	if err != nil {
		return errors.WithMessage(err, "failed to create signed proposal")
	}

	proposalResponse, err := i.EndorserClient.ProcessProposal(context.Background(), signedProposal)
	if err != nil {
		return errors.WithMessage(err, "failed to endorse proposal")
	}

	if proposalResponse == nil {
		return errors.New("received nil proposal response")
	}

	if proposalResponse.Response == nil {
		return errors.New("received proposal response with nil response")
	}

	if proposalResponse.Response.Status != int32(cb.Status_SUCCESS) {
		return errors.Errorf("query failed with status: %d - %s", proposalResponse.Response.Status, proposalResponse.Response.Message)
	}

	if strings.ToLower(i.Input.OutputFormat) == "json" {
		return printResponseAsJSON(proposalResponse, &lb.QueryInstalledChaincodesResult{}, i.Writer)
	}
	return i.printResponse(proposalResponse)
}

// printResponse prints the information included in the response
// from the server.

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Confirm --peerAddress/--tlsRootCertFile target a real v2.x Fabric peer
  2. Reconnect (rerun the command) to rule out a stale connection
  3. Query the peer directly, bypassing proxies
  4. Check peer logs for endorsement handling errors
Defensive patterns

Strategy: retry

Validate before calling

// verify connectivity before querying
conn, err := grpc.Dial(peerAddress, grpc.WithTransportCredentials(creds))
if err != nil { return err }
// confirm peer identity via peer channel list or health check first

Type guard

func hasProposalResponse(pr *pb.ProposalResponse) bool {
    return pr != nil
}

Try / catch

if err := q.Query(); err != nil {
    if strings.Contains(err.Error(), "received nil proposal response") {
        time.Sleep(backoff)
        return retry(q.Query, 3)
    }
    return err
}

Prevention

When it happens

Trigger: ProcessProposal on the _lifecycle QueryInstalledChaincodes proposal returns nil response without a transport error — e.g. misbehaving peer, closed stream, or a stub from a misconfigured endorser client.

Common situations: --peerAddress pointing at a non-Fabric or incompatible service; stale connection after peer restart; custom proxy dropping the response body.

Related errors


AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04). Data as JSON: /api/errors/7acac4964f0f9b3a. Report an issue: GitHub.