hyperledger/fabric · error

no endorsement combination can be satisfied

Error message

no endorsement combination can be satisfied

What it means

Endorsers in discovery/client/client.go:280 selects endorsers for a chaincode by evaluating each endorsement layout (group-to-count requirements) against available peers via selectPeersForLayout. If no layout can be satisfied with the given filter, it returns errors.New("no endorsement combination can be satisfied").

Source

Thrown at discovery/client/client.go:280

	}]

	if !exists {
		return nil, ErrNotFound
	}

	desc := res.(*endorsementDescriptor)
	var seed [32]byte
	_, _ = crand.Read(seed[:])
	r := rand.New(rand.NewChaCha8(seed))
	// We iterate over all layouts to find one that we have enough peers to select
	for _, index := range r.Perm(len(desc.layouts)) {
		layout := desc.layouts[index]
		endorsers, canLayoutBeSatisfied := selectPeersForLayout(desc.endorsersByGroups, layout, f)
		if canLayoutBeSatisfied {
			return endorsers, nil
		}
	}
	return nil, errors.New("no endorsement combination can be satisfied")
}

type filter struct {
	ef ExclusionFilter
	ps PrioritySelector
}

// NewFilter returns an endorser filter that uses the given exclusion filter and priority selector
// to filter and sort the endorsers
func NewFilter(ps PrioritySelector, ef ExclusionFilter) Filter {
	return &filter{
		ef: ef,
		ps: ps,
	}
}

// Filter returns a filtered and sorted list of endorsers
func (f *filter) Filter(endorsers Endorsers) Endorsers {

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Relax or fix the ExclusionFilter passed to Endorsers so it doesn't eliminate all eligible peers
  2. Ensure at least the policy-required number of peers per org group are online and have the chaincode installed
  3. Verify the chaincode endorsement policy (or --signature-policy) matches the network's actual membership
  4. Retry after gossip has propagated membership/ledger heights for recently started peers

Example fix

// before: filter rejecting every peer
f := discovery.Filter{ExclusionFilter: filters.SelectAllExclusionFilter{}}

// after: exclude only peers without the chaincode
f := discovery.Filter{
    ExclusionFilter: filters.HasChaincode(ccName).Negate(),
}
Defensive patterns

Strategy: fallback

Validate before calling

// Ensure each org group required by the policy has online peers
if len(onlinePeersByOrg) < requiredCountForEveryGroup {
    return errors.New("insufficient online endorsing peers for policy")
}

Try / catch

endorsers, err := client.Endorsers(ctx, ccName, auth, filter, priority)
if err != nil && strings.Contains(err.Error(), "no endorsement combination can be satisfied") {
    // retry with a relaxed filter or wait for peers to come online
}

Prevention

When it happens

Trigger: Calling Endorsers when for every layout in the chaincode's endorsement policy descriptor, no combination of peers from the required groups passes the ExclusionFilter or meets the required count.

Common situations: Too few peers online in one of the policy's required org groups; custom exclusion filters rejecting all candidates (e.g. filtering out peers without the chaincode); chaincode endorsement policy requiring orgs that have no endorsing peers; peers not yet synced via gossip.

Related errors


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