code: func New(config Config, notify []string, noverify bool) *Ethash {
  	if config.CachesInMem <= 0 {
  		log.Warn("One ethash cache must always be in memory", "requested", config.CachesInMem)
  		config.CachesInMem = 1
  	}
  	if config.CacheDir != "" && config.CachesOnDisk > 0 {
  		log.Info("Disk storage enabled for ethash caches", "dir", config.CacheDir, "count", config.CachesOnDisk)
  	}
  	if config.DatasetDir != "" && config.DatasetsOnDisk > 0 {
  		log.Info("Disk storage enabled for ethash DAGs", "dir", config.DatasetDir, "count", config.DatasetsOnDisk)
  	}
  	ethash := &Ethash{
  		config:       config,
  		caches:       newlru("cache", config.CachesInMem, newCache),
  		datasets:     newlru("dataset", config.DatasetsInMem, newDataset),
  		update:       make(chan struct{}),
  		hashrate:     metrics.NewMeterForced(),
  		workCh:       make(chan *sealTask),
  		fetchWorkCh:  make(chan *sealWork),
  		submitWorkCh: make(chan *mineResult),
  		fetchRateCh:  make(chan chan uint64),
  		submitRateCh: make(chan *hashrate),
  		exitCh:       make(chan chan error),
  	}
  	go ethash.remote(notify, noverify)
  	return ethash
  }
docs: // New creates a full sized ethash PoW scheme and starts a background thread for
  // remote mining, also optionally notifying a batch of remote services of new work
  // packages.