17 #include <shared_mutex>
31 CSHA256 m_salted_hasher_schnorr;
34 std::shared_mutex cs_sigcache;
44 static constexpr
unsigned char PADDING_ECDSA[32] = {
'E'};
45 static constexpr
unsigned char PADDING_SCHNORR[32] = {
'S'};
46 m_salted_hasher_ecdsa.
Write(
nonce.begin(), 32);
47 m_salted_hasher_ecdsa.
Write(PADDING_ECDSA, 32);
48 m_salted_hasher_schnorr.
Write(
nonce.begin(), 32);
49 m_salted_hasher_schnorr.
Write(PADDING_SCHNORR, 32);
53 ComputeEntryECDSA(
uint256& entry,
const uint256 &hash,
const std::vector<unsigned char>& vchSig,
const CPubKey& pubkey)
const
55 CSHA256 hasher = m_salted_hasher_ecdsa;
62 CSHA256 hasher = m_salted_hasher_schnorr;
67 Get(
const uint256& entry,
const bool erase)
69 std::shared_lock<std::shared_mutex> lock(cs_sigcache);
70 return setValid.contains(entry, erase);
75 std::unique_lock<std::shared_mutex> lock(cs_sigcache);
76 setValid.insert(entry);
78 uint32_t setup_bytes(
size_t n)
80 return setValid.setup_bytes(n);
90 static CSignatureCache signatureCache;
100 size_t nElems = signatureCache.setup_bytes(nMaxCacheSize);
101 LogPrintf(
"Using %zu MiB out of %zu/2 requested for signature cache, able to store %zu elements\n",
102 (nElems*
sizeof(
uint256)) >>20, (nMaxCacheSize*2)>>20, nElems);
108 signatureCache.ComputeEntryECDSA(entry, sighash, vchSig, pubkey);
109 if (signatureCache.Get(entry, !
store))
114 signatureCache.Set(entry);
121 signatureCache.ComputeEntrySchnorr(entry, sighash, sig, pubkey);
122 if (signatureCache.Get(entry, !
store))
return true;
124 if (
store) signatureCache.Set(entry);