Line data Source code
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> 34 33971436 : 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 33971436 : std::memcpy(&u, key.begin()+4*hash_select, 4); 39 33971436 : return u; 40 : } 41 : }; 42 : 43 676041 : class CachingTransactionSignatureChecker : public TransactionSignatureChecker 44 : { 45 : private: 46 : bool store; 47 : 48 : public: 49 676456 : 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