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 &registry{
		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

  1. Upgrade the fabric peer/orderer binaries to a release supporting the required capability.
  2. Lower the channel capability to a level all binaries support (via a channel config update) if downgrade is intended.
  3. Align all network nodes to the same fabric version.
  4. 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

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


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