67 lines
2.1 KiB
Nim
67 lines
2.1 KiB
Nim
|
# Nimbus
|
||
|
# Copyright (c) 2018 Status Research & Development GmbH
|
||
|
# Licensed under either of
|
||
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0)
|
||
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
||
|
# http://opensource.org/licenses/MIT)
|
||
|
# at your option. This file may not be copied, modified, or distributed except
|
||
|
# according to those terms.
|
||
|
|
||
|
## Hash Cache
|
||
|
## ==========
|
||
|
##
|
||
|
## provide LRU hash, indexed by epoch
|
||
|
|
||
|
import
|
||
|
../../utils/lru_cache,
|
||
|
ethash,
|
||
|
nimcrypto,
|
||
|
tables
|
||
|
|
||
|
type
|
||
|
BlockEpoch = distinct uint64
|
||
|
|
||
|
EpochHashDigest* = seq[MDigest[512]]
|
||
|
EpochHashCache* = LruCache[uint64,BlockEpoch,EpochHashDigest,void]
|
||
|
|
||
|
{.push raises: [Defect,CatchableError].}
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Private cache management functions
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
# needed for table key to work
|
||
|
proc `==`(a,b: BlockEpoch): bool {.borrow.}
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Public functions
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
proc initEpochHashCache*(cache: var EpochHashCache; cacheMaxItems = 10) =
|
||
|
## Initialise a new cache indexed by block epoch
|
||
|
|
||
|
template bnToEpoch(num: uint64): BlockEpoch =
|
||
|
BlockEpoch(blockNumber div EPOCH_LENGTH)
|
||
|
|
||
|
var toKey: LruKey[uint64,BlockEpoch] =
|
||
|
proc(blockNumber: uint64): BlockEpoch =
|
||
|
blockNumber.bnToEpoch
|
||
|
|
||
|
var toValue: LruValue[uint64,EpochHashDigest,void] =
|
||
|
proc(blockNumber: uint64): Result[EpochHashDigest,void] =
|
||
|
let top = blockNumber.bnToEpoch.uint64 * EPOCH_LENGTH
|
||
|
ok( mkcache( getCacheSize(top), getSeedhash(top)))
|
||
|
|
||
|
cache.initLruCache(toKey, toValue, cacheMaxItems)
|
||
|
|
||
|
|
||
|
proc getEpochHash*(cache: var EpochHashCache;
|
||
|
blockNumber: uint64): auto {.inline.} =
|
||
|
## Return hash list, indexed by epoch of argument `blockNumber`
|
||
|
cache.getLruItem(blockNumber).value
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# End
|
||
|
# ------------------------------------------------------------------------------
|