diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-02-28 00:25:56 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2018-02-28 00:25:56 +0800 |
commit | 17b0e226d3d6b3829a82ee1c142bd125cc9a0109 (patch) | |
tree | cbb284467bb1f59d8397c2430ab34722a05c4478 /consensus/ethash/algorithm.go | |
parent | b574b5776695eb30e034fd8c7a468b3f03d4c6b9 (diff) | |
download | go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.tar go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.tar.gz go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.tar.bz2 go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.tar.lz go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.tar.xz go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.tar.zst go-tangerine-17b0e226d3d6b3829a82ee1c142bd125cc9a0109.zip |
travis, build, consensus: drop support for Go 1.7
Diffstat (limited to 'consensus/ethash/algorithm.go')
-rw-r--r-- | consensus/ethash/algorithm.go | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/consensus/ethash/algorithm.go b/consensus/ethash/algorithm.go index 10767bb31..905a7b1ea 100644 --- a/consensus/ethash/algorithm.go +++ b/consensus/ethash/algorithm.go @@ -19,6 +19,7 @@ package ethash import ( "encoding/binary" "hash" + "math/big" "reflect" "runtime" "sync" @@ -47,6 +48,48 @@ const ( loopAccesses = 64 // Number of accesses in hashimoto loop ) +// cacheSize returns the size of the ethash verification cache that belongs to a certain +// block number. +func cacheSize(block uint64) uint64 { + epoch := int(block / epochLength) + if epoch < maxEpoch { + return cacheSizes[epoch] + } + return calcCacheSize(epoch) +} + +// calcCacheSize calculates the cache size for epoch. The cache size grows linearly, +// however, we always take the highest prime below the linearly growing threshold in order +// to reduce the risk of accidental regularities leading to cyclic behavior. +func calcCacheSize(epoch int) uint64 { + size := cacheInitBytes + cacheGrowthBytes*uint64(epoch) - hashBytes + for !new(big.Int).SetUint64(size / hashBytes).ProbablyPrime(1) { // Always accurate for n < 2^64 + size -= 2 * hashBytes + } + return size +} + +// datasetSize returns the size of the ethash mining dataset that belongs to a certain +// block number. +func datasetSize(block uint64) uint64 { + epoch := int(block / epochLength) + if epoch < maxEpoch { + return datasetSizes[epoch] + } + return calcDatasetSize(epoch) +} + +// calcDatasetSize calculates the dataset size for epoch. The dataset size grows linearly, +// however, we always take the highest prime below the linearly growing threshold in order +// to reduce the risk of accidental regularities leading to cyclic behavior. +func calcDatasetSize(epoch int) uint64 { + size := datasetInitBytes + datasetGrowthBytes*uint64(epoch) - mixBytes + for !new(big.Int).SetUint64(size / mixBytes).ProbablyPrime(1) { // Always accurate for n < 2^64 + size -= 2 * mixBytes + } + return size +} + // hasher is a repetitive hasher allowing the same hash data structures to be // reused between hash runs instead of requiring new ones to be created. type hasher func(dest []byte, data []byte) |