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