1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2018 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 
6 #ifndef BITCOIN_SCRIPT_SIGCACHE_H
7 #define BITCOIN_SCRIPT_SIGCACHE_H
8 
9 #include <script/interpreter.h>
10 
11 #include <vector>
12 
13 // DoS prevention: limit cache size to 32MB (over 1000000 entries on 64-bit
14 // systems). Due to how we count cache size, actual memory usage is slightly
15 // more (~32.25 MB)
16 static const unsigned int DEFAULT_MAX_SIG_CACHE_SIZE = 32;
17 // Maximum sig cache size allowed
18 static const int64_t MAX_MAX_SIG_CACHE_SIZE = 16384;
19 
20 class CPubKey;
21 
22 /**
23  * We're hashing a nonce into the entries themselves, so we don't need extra
24  * blinding in the set hash computation.
25  *
26  * This may exhibit platform endian dependent behavior but because these are
27  * nonced hashes (random) and this state is only ever used locally it is safe.
28  * All that matters is local consistency.
29  */
30 class SignatureCacheHasher
31 {
32 public:
33     template <uint8_t hash_select>
operator()34     uint32_t operator()(const uint256& key) const
35     {
36         static_assert(hash_select <8, "SignatureCacheHasher only has 8 hashes available.");
37         uint32_t u;
38         std::memcpy(&u, key.begin()+4*hash_select, 4);
39         return u;
40     }
41 };
42 
43 class CachingTransactionSignatureChecker : public TransactionSignatureChecker
44 {
45 private:
46     bool store;
47 
48 public:
CachingTransactionSignatureChecker(const CTransaction * txToIn,unsigned int nInIn,const CAmount & amountIn,bool storeIn,PrecomputedTransactionData & txdataIn)49     CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, bool storeIn, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amountIn, txdataIn), store(storeIn) {}
50 
51     bool VerifySignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const override;
52 };
53 
54 void InitSignatureCache();
55 
56 #endif // BITCOIN_SCRIPT_SIGCACHE_H
57