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

  1. Unwrap the inner error (errors.Cause) to see whether envelopes were empty, unmarshalling failed, or validation failed
  2. Ensure all endorsing peers are fully joined and synchronized with the channel
  3. Retry the discovery query — a peer mid-join often produces transient empty envelopes
  4. Check Fabric version consistency between client and all peers in the channel
  5. 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

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


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