git.gammaspectra.live/P2Pool/consensus/v3@v3.8.0/monero/crypto/pool.go (about)

     1  package crypto
     2  
     3  import (
     4  	"git.gammaspectra.live/P2Pool/consensus/v3/types"
     5  	"git.gammaspectra.live/P2Pool/edwards25519"
     6  	"git.gammaspectra.live/P2Pool/sha3"
     7  	"runtime"
     8  	"sync"
     9  )
    10  
    11  var hasherPool, pointPool, scalarPool sync.Pool
    12  
    13  func init() {
    14  	hasherPool.New = func() any {
    15  		return sha3.NewLegacyKeccak256()
    16  	}
    17  	pointPool.New = func() any {
    18  		p := new(edwards25519.Point)
    19  		runtime.SetFinalizer(p, PutEdwards25519Point)
    20  		return p
    21  	}
    22  	scalarPool.New = func() any {
    23  		s := new(edwards25519.Scalar)
    24  		runtime.SetFinalizer(s, PutEdwards25519Scalar)
    25  		return s
    26  	}
    27  }
    28  
    29  func GetKeccak256Hasher() *sha3.HasherState {
    30  	return hasherPool.Get().(*sha3.HasherState)
    31  }
    32  
    33  func PutKeccak256Hasher(h *sha3.HasherState) {
    34  	h.Reset()
    35  	hasherPool.Put(h)
    36  }
    37  
    38  func PooledKeccak256(data ...[]byte) (result types.Hash) {
    39  	h := GetKeccak256Hasher()
    40  	defer PutKeccak256Hasher(h)
    41  	for _, b := range data {
    42  		_, _ = h.Write(b)
    43  	}
    44  	HashFastSum(h, result[:])
    45  	return
    46  }
    47  
    48  func GetEdwards25519Point() *edwards25519.Point {
    49  	return pointPool.Get().(*edwards25519.Point)
    50  }
    51  
    52  func PutEdwards25519Point(p *edwards25519.Point) {
    53  	pointPool.Put(p)
    54  }
    55  
    56  func GetEdwards25519Scalar() *edwards25519.Scalar {
    57  	return scalarPool.Get().(*edwards25519.Scalar)
    58  }
    59  
    60  func PutEdwards25519Scalar(s *edwards25519.Scalar) {
    61  	scalarPool.Put(s)
    62  }