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
- Verify --peerAddresses (and --tlsRootCertFiles) are set and that validatePeerConnectionParameters passes before InitCmdFactory
- Check whether any code/test has overridden common.GetEndorserClientFnc and restore the default
- Upgrade to a fixed Fabric version if this occurs with valid flags, as it indicates a code bug
- 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
- Always pass --peerAddresses explicitly in scripts
- Do not override common.GetEndorserClientFnc outside tests
- Keep validatePeerConnectionParameters intact when embedding the CLI package
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
- no proposal responses received - this might indicate a bug
- empty header extension
- orderer is required, but no ordering endpoint or endorser cl
- ERROR - only a single deliver source is currently supported
- cannot create proposal, due to %s
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/4d4968d68fcc1305.
Report an issue: GitHub.