diff options
author | Péter Szilágyi <peterke@gmail.com> | 2018-02-28 19:29:58 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-02-28 19:29:58 +0800 |
commit | 8f43c9743311eed24fbb2ab011f33ccf3b8aa216 (patch) | |
tree | dd4f027f84dd556a38083d896512fcdf95d18b4f /consensus/ethash/algorithm.go | |
parent | 98ec5e50115b47670c1f3ffb2cc890ce4838c4d6 (diff) | |
parent | 17b0e226d3d6b3829a82ee1c142bd125cc9a0109 (diff) | |
download | dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.tar dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.tar.gz dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.tar.bz2 dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.tar.lz dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.tar.xz dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.tar.zst dexon-8f43c9743311eed24fbb2ab011f33ccf3b8aa216.zip |
Merge pull request #16207 from karalabe/drop-go1.7
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) |