github.com/aquanetwork/aquachain@v1.7.8/consensus/aquahash/algorithm_go1.8.go (about)

     1  // Copyright 2017 The aquachain Authors
     2  // This file is part of the aquachain library.
     3  //
     4  // The aquachain library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The aquachain library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the aquachain library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  // +build go1.8
    18  
    19  package aquahash
    20  
    21  import "math/big"
    22  
    23  // cacheSize returns the size of the aquahash verification cache that belongs to a certain
    24  // block number.
    25  func cacheSize(block uint64) uint64 {
    26  	epoch := int(block / epochLength)
    27  	if epoch < maxEpoch {
    28  		return cacheSizes[epoch]
    29  	}
    30  	return calcCacheSize(epoch)
    31  }
    32  
    33  // calcCacheSize calculates the cache size for epoch. The cache size grows linearly,
    34  // however, we always take the highest prime below the linearly growing threshold in order
    35  // to reduce the risk of accidental regularities leading to cyclic behavior.
    36  func calcCacheSize(epoch int) uint64 {
    37  	size := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes
    38  	for !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64
    39  		size -= 2 * hashBytes
    40  	}
    41  	return size
    42  }
    43  
    44  // datasetSize returns the size of the aquahash mining dataset that belongs to a certain
    45  // block number.
    46  func datasetSize(block uint64) uint64 {
    47  	epoch := int(block / epochLength)
    48  	if epoch < maxEpoch {
    49  		return datasetSizes[epoch]
    50  	}
    51  	return calcDatasetSize(epoch)
    52  }
    53  
    54  // calcDatasetSize calculates the dataset size for epoch. The dataset size grows linearly,
    55  // however, we always take the highest prime below the linearly growing threshold in order
    56  // to reduce the risk of accidental regularities leading to cyclic behavior.
    57  func calcDatasetSize(epoch int) uint64 {
    58  	size := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes
    59  	for !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64
    60  		size -= 2 * mixBytes
    61  	}
    62  	return size
    63  }