hyperledger/fabric · error
failed creating endorser object
Error message
failed creating endorser object
What it means
createEndorsementDescriptor wraps any failure from the endorser() helper (which converts a discovery Peer into a client Peer) with "failed creating endorser object". The inner error is usually an empty MembershipInfo/StateInfo envelope, gossip envelope unmarshalling failure, or alive/stateInfo validation failure. It means a peer listed as an endorser had malformed or missing discovery data.
Source
Thrown at discovery/client/client.go:521
endorsersByGroups: make(map[string][]*Peer),
}
for _, l := range desc.Layouts {
currentLayout := make(map[string]int)
descriptor.layouts = append(descriptor.layouts, currentLayout)
for grp, count := range l.QuantitiesByGroup {
if _, exists := desc.EndorsersByGroups[grp]; !exists {
return nil, errors.Errorf("group %s isn't mapped to endorsers, but exists in a layout", grp)
}
currentLayout[grp] = int(count)
}
}
for grp, peers := range desc.EndorsersByGroups {
var endorsers []*Peer
for _, p := range peers.Peers {
peer, err := endorser(p, desc.Chaincode, channel)
if err != nil {
return nil, errors.Wrap(err, "failed creating endorser object")
}
endorsers = append(endorsers, peer)
}
descriptor.endorsersByGroups[grp] = endorsers
}
return descriptor, nil
}
func endorser(peer *discovery.Peer, chaincode, channel string) (*Peer, error) {
if peer.MembershipInfo == nil || peer.StateInfo == nil {
return nil, errors.Errorf("received empty envelope(s) for endorsers for chaincode %s, channel %s", chaincode, channel)
}
aliveMsg, err := gprotoext.EnvelopeToGossipMessage(peer.MembershipInfo)
if err != nil {
return nil, errors.Wrap(err, "failed unmarshalling gossip envelope to alive message")
}
stateInfMsg, err := gprotoext.EnvelopeToGossipMessage(peer.StateInfo)View on GitHub (pinned to 2736b63f8f)
Solutions
- Unwrap the inner error (errors.Cause) to see whether envelopes were empty, unmarshalling failed, or validation failed
- Ensure all endorsing peers are fully joined and synchronized with the channel
- Retry the discovery query — a peer mid-join often produces transient empty envelopes
- Check Fabric version consistency between client and all peers in the channel
- Verify TLS and MSP configuration so gossip envelopes are signed/encrypted as expected
Example fix
// before: only wrapper shown
return nil, errors.Wrap(err, "failed creating endorser object")
// after: surface the cause
log.Printf("%+v", errors.Cause(err)) Defensive patterns
Strategy: try-catch
Validate before calling
// Filter peers lacking envelopes before descriptor creation
usable := peers.Peers[:0]
for _, p := range peers.Peers {
if p.MembershipInfo != nil && p.StateInfo != nil {
usable = append(usable, p)
}
} Try / catch
peer, err := endorser(p, cc, channel)
if err != nil {
log.Printf("endorsers of %s: %v (cause: %v)", channel, err, errors.Cause(err))
continue // or retry the query
} Prevention
- Skip peers with nil MembershipInfo/StateInfo and retry later
- Ensure peers complete channel join before serving discovery
- Keep Fabric versions consistent across client and peers
- Retry discovery queries that fail on a subset of endorsers
When it happens
Trigger: Iterating desc.EndorsersByGroups peers where a discovery.Peer has nil MembershipInfo or StateInfo, gossip envelopes that fail EnvelopeToGossipMessage, or payloads failing validateAliveMessage/validateStateInfoMessage.
Common situations: Peer recently joined and hasn't published StateInfo yet; discovery server returning partial data under load; corrupted or cross-version gossip payloads (v1 peer data read by v2 client); TLS/identity mismatch causing invalid envelopes.
Related errors
- group %s isn't mapped to endorsers, but exists in a layout
- received empty envelope(s) for endorsers for chaincode %s, c
- message isn't an alive message
- membership is empty
- timestamp is nil
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/7225fca20db85113.
Report an issue: GitHub.