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
- Relax or fix the ExclusionFilter passed to Endorsers so it doesn't eliminate all eligible peers
- Ensure at least the policy-required number of peers per org group are online and have the chaincode installed
- Verify the chaincode endorsement policy (or --signature-policy) matches the network's actual membership
- 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
- Keep at least the policy-required peers per org online with the chaincode installed
- Use exclusion filters that match reality (exclude only peers without the chaincode)
- Review the chaincode endorsement policy against actual network membership
- Wait for gossip membership/ledger sync before selecting endorsers on fresh peers
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
- expected ValidationParameter '%x' does not match passed Vali
- lscc's state for [%s] is invalid, policy field must be set
- chaincode definition for [%s] is invalid, policy field must
- must provide an instantiation policy
- not found
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/f51c46ce5346de57.
Report an issue: GitHub.