1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2016 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.
6 #ifndef BITCOIN_SCRIPT_SIGCACHE_H
7 #define BITCOIN_SCRIPT_SIGCACHE_H
9 #include "script/interpreter.h"
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
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;
23 * We're hashing a nonce into the entries themselves, so we don't need extra
24 * blinding in the set hash computation.
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.
30 class SignatureCacheHasher
33 template <uint8_t hash_select
>
34 uint32_t operator()(const uint256
& key
) const
36 static_assert(hash_select
<8, "SignatureCacheHasher only has 8 hashes available.");
38 std::memcpy(&u
, key
.begin()+4*hash_select
, 4);
43 class CachingTransactionSignatureChecker
: public TransactionSignatureChecker
49 CachingTransactionSignatureChecker(const CTransaction
* txToIn
, unsigned int nInIn
, const CAmount
& amountIn
, bool storeIn
, PrecomputedTransactionData
& txdataIn
) : TransactionSignatureChecker(txToIn
, nInIn
, amountIn
, txdataIn
), store(storeIn
) {}
51 bool VerifySignature(const std::vector
<unsigned char>& vchSig
, const CPubKey
& vchPubKey
, const uint256
& sighash
) const override
;
54 void InitSignatureCache();
56 #endif // BITCOIN_SCRIPT_SIGCACHE_H