47 lines
1.4 KiB
Go
47 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"git.gammaspectra.live/P2Pool/p2pool-observer/monero/client"
|
|
"git.gammaspectra.live/P2Pool/p2pool-observer/types"
|
|
"golang.org/x/exp/maps"
|
|
"golang.org/x/exp/rand"
|
|
"lukechampine.com/uint128"
|
|
"sync"
|
|
)
|
|
|
|
var difficultyCache = make(map[uint64]types.Difficulty)
|
|
var difficultyCacheLock sync.RWMutex
|
|
|
|
func getHeightDifficulty(height uint64) (difficulty types.Difficulty, ok bool) {
|
|
difficultyCacheLock.RLock()
|
|
defer difficultyCacheLock.RUnlock()
|
|
difficulty, ok = difficultyCache[height]
|
|
return
|
|
}
|
|
|
|
func setHeightDifficulty(height uint64, difficulty types.Difficulty) {
|
|
difficultyCacheLock.Lock()
|
|
defer difficultyCacheLock.Unlock()
|
|
|
|
if len(difficultyCache) >= 1024 {
|
|
//Delete key at random
|
|
//TODO: FIFO
|
|
keys := maps.Keys(difficultyCache)
|
|
delete(difficultyCache, keys[rand.Intn(len(keys))])
|
|
}
|
|
|
|
difficultyCache[height] = difficulty
|
|
}
|
|
|
|
func cacheHeightDifficulty(height uint64) {
|
|
if _, ok := getHeightDifficulty(height); !ok {
|
|
if header, err := client.GetClient().GetBlockHeaderByHeight(height); err != nil {
|
|
if template, err := client.GetClient().GetBlockTemplate(types.DonationAddress); err != nil {
|
|
setHeightDifficulty(uint64(template.Height), types.Difficulty{Uint128: uint128.From64(uint64(template.Difficulty))})
|
|
}
|
|
} else {
|
|
setHeightDifficulty(header.BlockHeader.Height, types.Difficulty{Uint128: uint128.From64(header.BlockHeader.Difficulty)})
|
|
}
|
|
}
|
|
}
|