|
|
|
@ -428,7 +428,7 @@ func (ethash *Ethash) cache(block uint64) []uint32 { |
|
|
|
|
current, future := ethash.caches[epoch], (*cache)(nil) |
|
|
|
|
if current == nil { |
|
|
|
|
// No in-memory cache, evict the oldest if the cache limit was reached
|
|
|
|
|
for len(ethash.caches) >= ethash.cachesinmem { |
|
|
|
|
for len(ethash.caches) > 0 && len(ethash.caches) >= ethash.cachesinmem { |
|
|
|
|
var evict *cache |
|
|
|
|
for _, cache := range ethash.caches { |
|
|
|
|
if evict == nil || evict.used.After(cache.used) { |
|
|
|
@ -480,22 +480,16 @@ func (ethash *Ethash) cache(block uint64) []uint32 { |
|
|
|
|
// Search implements PoW, attempting to find a nonce that satisfies the block's
|
|
|
|
|
// difficulty requirements.
|
|
|
|
|
func (ethash *Ethash) Search(block Block, stop <-chan struct{}) (uint64, []byte) { |
|
|
|
|
// Extract some data from the block
|
|
|
|
|
var ( |
|
|
|
|
hash = block.HashNoNonce().Bytes() |
|
|
|
|
diff = block.Difficulty() |
|
|
|
|
target = new(big.Int).Div(maxUint256, diff) |
|
|
|
|
) |
|
|
|
|
// Retrieve the mining dataset
|
|
|
|
|
dataset, size := ethash.dataset(block.NumberU64()), datasetSize(block.NumberU64()) |
|
|
|
|
|
|
|
|
|
// Start generating random nonces until we abort or find a good one
|
|
|
|
|
var ( |
|
|
|
|
hash = block.HashNoNonce().Bytes() |
|
|
|
|
diff = block.Difficulty() |
|
|
|
|
target = new(big.Int).Div(maxUint256, diff) |
|
|
|
|
dataset = ethash.dataset(block.NumberU64()) |
|
|
|
|
rand = rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
|
|
nonce = uint64(rand.Int63()) |
|
|
|
|
attempts int64 |
|
|
|
|
|
|
|
|
|
rand = rand.New(rand.NewSource(time.Now().UnixNano())) |
|
|
|
|
nonce = uint64(rand.Int63()) |
|
|
|
|
) |
|
|
|
|
// Start generating random nonces until we abort or find a good one
|
|
|
|
|
for { |
|
|
|
|
select { |
|
|
|
|
case <-stop: |
|
|
|
@ -511,7 +505,7 @@ func (ethash *Ethash) Search(block Block, stop <-chan struct{}) (uint64, []byte) |
|
|
|
|
attempts = 0 |
|
|
|
|
} |
|
|
|
|
// Compute the PoW value of this nonce
|
|
|
|
|
digest, result := hashimotoFull(size, dataset, hash, nonce) |
|
|
|
|
digest, result := hashimotoFull(dataset, hash, nonce) |
|
|
|
|
if new(big.Int).SetBytes(result).Cmp(target) <= 0 { |
|
|
|
|
return nonce, digest |
|
|
|
|
} |
|
|
|
@ -532,7 +526,7 @@ func (ethash *Ethash) dataset(block uint64) []uint32 { |
|
|
|
|
current, future := ethash.datasets[epoch], (*dataset)(nil) |
|
|
|
|
if current == nil { |
|
|
|
|
// No in-memory dataset, evict the oldest if the dataset limit was reached
|
|
|
|
|
for len(ethash.datasets) >= ethash.dagsinmem { |
|
|
|
|
for len(ethash.datasets) > 0 && len(ethash.datasets) >= ethash.dagsinmem { |
|
|
|
|
var evict *dataset |
|
|
|
|
for _, dataset := range ethash.datasets { |
|
|
|
|
if evict == nil || evict.used.After(dataset.used) { |
|
|
|
|