consensus/monero/crypto/pool.go
2023-05-20 10:49:05 +02:00

63 lines
1.3 KiB
Go

package crypto
import (
"git.gammaspectra.live/P2Pool/edwards25519"
"git.gammaspectra.live/P2Pool/p2pool-observer/types"
"git.gammaspectra.live/P2Pool/sha3"
"runtime"
"sync"
)
var hasherPool, pointPool, scalarPool sync.Pool
func init() {
hasherPool.New = func() any {
return sha3.NewLegacyKeccak256()
}
pointPool.New = func() any {
p := new(edwards25519.Point)
runtime.SetFinalizer(p, PutEdwards25519Point)
return p
}
scalarPool.New = func() any {
s := new(edwards25519.Scalar)
runtime.SetFinalizer(s, PutEdwards25519Scalar)
return s
}
}
func GetKeccak256Hasher() *sha3.HasherState {
return hasherPool.Get().(*sha3.HasherState)
}
func PutKeccak256Hasher(h *sha3.HasherState) {
h.Reset()
hasherPool.Put(h)
}
func PooledKeccak256(data ...[]byte) (result types.Hash) {
h := GetKeccak256Hasher()
defer PutKeccak256Hasher(h)
for _, b := range data {
_, _ = h.Write(b)
}
HashFastSum(h, result[:])
return
}
func GetEdwards25519Point() *edwards25519.Point {
return pointPool.Get().(*edwards25519.Point)
}
func PutEdwards25519Point(p *edwards25519.Point) {
pointPool.Put(p)
}
func GetEdwards25519Scalar() *edwards25519.Scalar {
return scalarPool.Get().(*edwards25519.Scalar)
}
func PutEdwards25519Scalar(s *edwards25519.Scalar) {
scalarPool.Put(s)
}