hyperledger/fabric · error

no endorser clients retrieved - this might indicate a bug

Error message

no endorser clients retrieved - this might indicate a bug

What it means

InitCmdFactory builds the client factory (endorser, deliver, broadcast clients) for peer chaincode commands. When the endorser is required, it iterates over the configured --peerAddresses and appends successfully created endorser clients; if none were created, it throws this error because it is assumed validatePeerConnectionParameters guarantees at least one address, so an empty list indicates a bug.

Source

Thrown at internal/peer/chaincode/common.go:395

		}
		for i, address := range peerAddresses {
			var tlsRootCertFile string
			if tlsRootCertFiles != nil {
				tlsRootCertFile = tlsRootCertFiles[i]
			}
			endorserClient, err := common.GetEndorserClientFnc(address, tlsRootCertFile)
			if err != nil {
				return nil, errors.WithMessagef(err, "error getting endorser client for %s", cmdName)
			}
			endorserClients = append(endorserClients, endorserClient)
			deliverClient, err := common.GetPeerDeliverClientFnc(address, tlsRootCertFile)
			if err != nil {
				return nil, errors.WithMessagef(err, "error getting deliver client for %s", cmdName)
			}
			deliverClients = append(deliverClients, deliverClient)
		}
		if len(endorserClients) == 0 {
			return nil, errors.New("no endorser clients retrieved - this might indicate a bug")
		}
	}
	certificate, err := common.GetClientCertificateFnc()
	if err != nil {
		return nil, errors.WithMessage(err, "error getting client certificate")
	}

	signer, err := common.GetDefaultSignerFnc()
	if err != nil {
		return nil, errors.WithMessage(err, "error getting default signer")
	}

	var broadcastClient common.BroadcastClient
	if isOrdererRequired {
		if len(common.OrderingEndpoint) == 0 {
			if len(endorserClients) == 0 {
				return nil, errors.New("orderer is required, but no ordering endpoint or endorser client supplied")
			}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Verify --peerAddresses (and --tlsRootCertFiles) are set and that validatePeerConnectionParameters passes before InitCmdFactory
  2. Check whether any code/test has overridden common.GetEndorserClientFnc and restore the default
  3. Upgrade to a fixed Fabric version if this occurs with valid flags, as it indicates a code bug
  4. File a bug with the command flags and stack context if the standard CLI reproduces it

Example fix

// before (hook override in test/setup leaving no clients)
common.GetEndorserClientFnc = func(...) (pb.EndorserClient, error) { return nil, nil }
// after
common.GetEndorserClientFnc = common.GetEndorserClient // restore default
Defensive patterns

Strategy: validation

Validate before calling

if len(peerAddresses) == 0 {
    return fmt.Errorf("at least one --peerAddresses is required for invoke/query")
}

Prevention

When it happens

Trigger: Calling chaincode invoke/query with isEndorserRequired=true while the endorserClients slice ends up empty after the peerAddresses loop — e.g. peerAddresses was emptied by test hook overrides (GetEndorserClientFnc returning nil,nil) or the address loop silently skipped all entries.

Common situations: Custom builds or tests that swap GetEndorserClientFnc; embedding the peer CLI library and clearing global peerAddresses; internal regressions in validatePeerConnectionParameters.

Related errors


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