hyperledger/fabric · error

leader rotation must be turned off for this version or be un

Error message

leader rotation must be turned off for this version or be unspecified

What it means

This SmartBFT version does not support leader rotation. If the decoded smartbft.Options has LeaderRotation set to Options_ROTATION_ON, the config update is rejected outright. LeaderRotation must be OFF or left unspecified.

Source

Thrown at orderer/consensus/smartbft/configverifier.go:186

	consensusTypeConfigValue := conf.ChannelGroup.Groups["Orderer"].Values["ConsensusType"]

	if consensusTypeConfigValue == nil {
		return fmt.Errorf("missing consensus type property in config")
	}

	consensusTypeValue := &protosorderer.ConsensusType{}
	if err := proto.Unmarshal(consensusTypeConfigValue.Value, consensusTypeValue); err != nil {
		return fmt.Errorf("invalid consensus type property in config: %v", err)
	}

	configOptions := &smartbft.Options{}
	if err := proto.Unmarshal(consensusTypeValue.Metadata, configOptions); err != nil {
		return fmt.Errorf("invalid options encoded in consensus metadata: %v", err)
	}

	if configOptions.LeaderRotation == smartbft.Options_ROTATION_ON {
		return fmt.Errorf("leader rotation must be turned off for this version or be unspecified")
	}

	return nil
}

func (cbv *ConfigBlockValidator) verifyConfigUpdateMsg(outEnv *common.Envelope, confEnv *common.ConfigEnvelope, chdr *common.ChannelHeader) error {
	if confEnv == nil || confEnv.LastUpdate == nil || confEnv.Config == nil {
		return errors.New("invalid config envelope")
	}
	envPayload, err := protoutil.UnmarshalPayload(confEnv.LastUpdate.Payload)
	if err != nil {
		return err
	}

	if envPayload.Header == nil {
		return errors.New("inner header is nil")
	}

View on GitHub (pinned to 2736b63f8f)

Solutions

  1. Set LeaderRotation to Options_ROTATION_OFF (or omit it) in the ConsensusType metadata and re-submit the config update
  2. Update the profile in configtx.yaml so the BFT options do not set rotation on
  3. Regenerate the config with tooling from this Fabric version, which defaults rotation off

Example fix

// before
opts := &smartbft.Options{LeaderRotation: smartbft.Options_ROTATION_ON}
// after
opts := &smartbft.Options{LeaderRotation: smartbft.Options_ROTATION_OFF}
Defensive patterns

Strategy: validation

Validate before calling

if opts.LeaderRotation == smartbft.Options_ROTATION_ON {
    return errors.New("leader rotation is not supported; set ROTATION_OFF or omit it")
}

Prevention

When it happens

Trigger: checkConsentersMatchPolicy sees configOptions.LeaderRotation == smartbft.Options_ROTATION_ON in the proposed ConsensusType metadata during config update validation.

Common situations: Operator enables leader rotation in the BFT options section of the profile or configtx.yaml; upgrading a channel whose old config had rotation enabled; copying example configs that enable rotation.

Related errors


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