code: func (b *Bundle) validateMigrationStep(oc Orderer, noc Orderer) error {
  	oldType := oc.ConsensusType()
  	oldState := oc.ConsensusMigrationState()
  	oldContext := oc.ConsensusMigrationContext()
  	newType := noc.ConsensusType()
  	newState := noc.ConsensusMigrationState()
  	newContext := noc.ConsensusMigrationContext()
  	_, isSys := b.ConsortiumsConfig()
  
  	logger.Debugf("Validating potential consensus-type migration, system=%t; Old: %s / %s / %d;"+
  		" New: %s / %s / %d; (Type/State/Context)", isSys, oldType, oldState, oldContext, newType, newState, newContext)
  
  	if isSys {
  		return validateMigrationStepSystem(oldType, newType, oldState, newState, newContext)
  	} else {
  		return validateMigrationStepStandard(oldType, newType, oldState, newState, oldContext, newContext)
  	}
  }
docs: // validateMigrationStep checks the validity of the state transitions of a possible migration step.
  // The system channel is identified in order to more accurately evaluate the state transitions of
  // system vs. standard channels. The migration state machine (for both types of channels) is enforced
  // in the chain implementation, after ordering.
  //
  // Consensus-type changes from Kafka to Raft in the "green" path:
  // - The system channel starts the migration
  // - A standard channel prepares the context, type change Kafka to Raft
  // - The system channel commits the migration, type change Kafka to Raft
  // Consensus-type changes from Raft to Kafka in the "abort" path:
  // - The system channel starts the migration
  // - A standard channel prepares the context, type change Kafka to Raft
  // - The system channel aborts the migration
  // - The standard channel reverts the type back, type change Raft to Kafka
  //