aboutsummaryrefslogtreecommitdiffstats
path: root/consensus/ethash/algorithm.go
diff options
context:
space:
mode:
authorPéter Szilágyi <peterke@gmail.com>2018-02-28 00:25:56 +0800
committerPéter Szilágyi <peterke@gmail.com>2018-02-28 00:25:56 +0800
commit17b0e226d3d6b3829a82ee1c142bd125cc9a0109 (patch)
treecbb284467bb1f59d8397c2430ab34722a05c4478 /consensus/ethash/algorithm.go
parentb574b5776695eb30e034fd8c7a468b3f03d4c6b9 (diff)
downloadgo-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.go43
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)