diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 6010309a2..7b6ba5c3c 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -20,8 +20,8 @@ }, { "ImportPath": "github.com/ethereum/ethash", - "Comment": "v23.1-240-ga524c9f", - "Rev": "a524c9f7d55cb8925567dc201b44ba555862056d" + "Comment": "v23.1-242-gbc9ba4d", + "Rev": "bc9ba4d6a83a0fe308fefd8c6001b8ed1607137f" }, { "ImportPath": "github.com/fatih/color", diff --git a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go index ad59dd5e3..60121bb3b 100644 --- a/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go +++ b/Godeps/_workspace/src/github.com/ethereum/ethash/ethash.go @@ -108,10 +108,13 @@ func freeCache(cache *cache) { // Light implements the Verify half of the proof of work. It uses a few small // in-memory caches to verify the nonces found by Full. type Light struct { - test bool // if set use a smaller cache size - mu sync.Mutex // protects the per-epoch map of DAGs - caches map[uint64]*cache // currently cached verification DAGs - NumCaches int // Maximum number of DAGs to cache before eviction (only init, don't modify) + test bool // If set, use a smaller cache size + + mu sync.Mutex // Protects the per-epoch map of verification caches + caches map[uint64]*cache // Currently maintained verification caches + future *cache // Pre-generated cache for the estimated future DAG + + NumCaches int // Maximum number of caches to keep before eviction (only init, don't modify) } // Verify checks whether the block's nonce is valid. @@ -192,12 +195,25 @@ func (l *Light) getCache(blockNum uint64) *cache { evict = cache } } - glog.V(logger.Info).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch) + glog.V(logger.Debug).Infof("Evicting DAG for epoch %d in favour of epoch %d", evict.epoch, epoch) delete(l.caches, evict.epoch) } - // Create and return a new DAG for the epoch - c = &cache{epoch: epoch, test: l.test} + // If we have the new DAG pre-generated, use that, otherwise create a new one + if l.future != nil && l.future.epoch == epoch { + glog.V(logger.Debug).Infof("Using pre-generated DAG for epoch %d", epoch) + c, l.future = l.future, nil + } else { + glog.V(logger.Debug).Infof("No pre-generated DAG available, creating new for epoch %d", epoch) + c = &cache{epoch: epoch, test: l.test} + } l.caches[epoch] = c + + // If we just used up the future cache, or need a refresh, regenerate + if l.future == nil || l.future.epoch <= epoch { + glog.V(logger.Debug).Infof("Pre-generating DAG for epoch %d", epoch+1) + l.future = &cache{epoch: epoch + 1, test: l.test} + go l.future.generate() + } } c.used = time.Now() l.mu.Unlock()