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
- Set LeaderRotation to Options_ROTATION_OFF (or omit it) in the ConsensusType metadata and re-submit the config update
- Update the profile in configtx.yaml so the BFT options do not set rotation on
- 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
- Leave LeaderRotation unset in profiles for this Fabric version
- Review release notes before enabling BFT options
- Lint configtx.yaml BFT options against supported values
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
- invalid BFT metadata configuration
- unexpected envelope type %s
- empty Config
- empty channel group
- no groups in channel group
AI-assisted analysis of hyperledger/fabric@2736b63f8f (2026-09-04).
Data as JSON: /api/errors/492fb04a0f5a0c6f.
Report an issue: GitHub.