hyperledger/fabric · critical
%s capability %s is required but not supported
Error message
%s capability %s is required but not supported
What it means
capabilities.Supported iterates required capabilities in a channel config and returns this error when the runtime's capability provider does not implement any one of them. It blocks channel/chaincode operation because the binary cannot safely process a channel requiring features it doesn't understand.
Source
Thrown at common/capabilities/capabilities.go:48
capabilities map[string]*cb.Capability
}
func newRegistry(p provider, capabilities map[string]*cb.Capability) *registry {
return ®istry{
provider: p,
capabilities: capabilities,
}
}
// Supported checks that all of the required capabilities are supported by this binary.
func (r *registry) Supported() error {
for capabilityName := range r.capabilities {
if r.provider.HasCapability(capabilityName) {
logger.Debugf("%s capability %s is supported and is enabled", r.provider.Type(), capabilityName)
continue
}
return errors.Errorf("%s capability %s is required but not supported", r.provider.Type(), capabilityName)
}
return nil
}
View on GitHub (pinned to 2736b63f8f)
Solutions
- Upgrade the fabric peer/orderer binaries to a release supporting the required capability.
- Lower the channel capability to a level all binaries support (via a channel config update) if downgrade is intended.
- Align all network nodes to the same fabric version.
- Verify the channel's capabilities in its config before rolling out.
Example fix
// before # channel config requires V2_0 capability, binary is fabric 1.4 -> error // after # upgrade peers/orderers to fabric 2.x binary, or set Application.Capabilities to V1_4_2
Defensive patterns
Strategy: validation
Validate before calling
// compare required channel capabilities against binary support before joining/updating
for _, cap := range requiredCapabilities {
if !provider.HasCapability(cap) {
return fmt.Errorf("precheck: capability %s unsupported by this binary", cap)
}
} Try / catch
if err := capabilities.Supported(); err != nil {
var reqErr *errors.Error
if strings.Contains(err.Error(), "required but not supported") {
log.Fatalf("upgrade binaries or lower channel capability: %v", err)
}
} Prevention
- Keep all peers/orderers on the same fabric release.
- Review the capability roadmap before enabling V2_x capabilities.
- Test capability changes on a staging channel first.
- Pin fabric images via versioned tags, not :latest.
When it happens
Trigger: A channel's config (e.g. Application group) enables capability V2_0+ while the running fabric peer/orderer binary was built for an older release that only supports V1_x.
Common situations: Upgraded channel config to V2_0 capabilities but peers still on v1.4; mixed-version network where some orderers lack the capability; orderers joining a channel created by newer configtxgen.
Related errors
- application config does not exist for %s
- key level endorsement is not enabled, channel application ca
- purge private data is not enabled, channel application capab
- could not get application config for channel '%s'
- Wrong number of arguments for invocation lscc(%s): received
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/8872d8763da5263e.
Report an issue: GitHub.