Bitcoin Core  27.99.0
P2P Digital Currency
sigcache.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2022 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 <consensus/amount.h>
10 #include <crypto/sha256.h>
11 #include <cuckoocache.h>
12 #include <script/interpreter.h>
13 #include <span.h>
14 #include <uint256.h>
15 #include <util/hasher.h>
16 
17 #include <cstddef>
18 #include <shared_mutex>
19 #include <vector>
20 
21 class CPubKey;
22 class CTransaction;
23 class XOnlyPubKey;
24 
25 // DoS prevention: limit cache size to 32MiB (over 1000000 entries on 64-bit
26 // systems). Due to how we count cache size, actual memory usage is slightly
27 // more (~32.25 MiB)
28 static constexpr size_t DEFAULT_VALIDATION_CACHE_BYTES{32 << 20};
32 
39 {
40 private:
46  std::shared_mutex cs_sigcache;
47 
48 public:
49  SignatureCache(size_t max_size_bytes);
50 
51  SignatureCache(const SignatureCache&) = delete;
53 
54  void ComputeEntryECDSA(uint256& entry, const uint256 &hash, const std::vector<unsigned char>& vchSig, const CPubKey& pubkey) const;
55 
56  void ComputeEntrySchnorr(uint256& entry, const uint256 &hash, Span<const unsigned char> sig, const XOnlyPubKey& pubkey) const;
57 
58  bool Get(const uint256& entry, const bool erase);
59 
60  void Set(const uint256& entry);
61 };
62 
64 {
65 private:
66  bool store;
68 
69 public:
70  CachingTransactionSignatureChecker(const CTransaction* txToIn, unsigned int nInIn, const CAmount& amountIn, bool storeIn, SignatureCache& signature_cache, PrecomputedTransactionData& txdataIn) : TransactionSignatureChecker(txToIn, nInIn, amountIn, txdataIn, MissingDataBehavior::ASSERT_FAIL), store(storeIn), m_signature_cache(signature_cache) {}
71 
72  bool VerifyECDSASignature(const std::vector<unsigned char>& vchSig, const CPubKey& vchPubKey, const uint256& sighash) const override;
73  bool VerifySchnorrSignature(Span<const unsigned char> sig, const XOnlyPubKey& pubkey, const uint256& sighash) const override;
74 };
75 
76 #endif // BITCOIN_SCRIPT_SIGCACHE_H
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
An encapsulated public key.
Definition: pubkey.h:34
A hasher class for SHA-256.
Definition: sha256.h:14
The basic transaction that is broadcasted on the network and contained in blocks.
Definition: transaction.h:296
CachingTransactionSignatureChecker(const CTransaction *txToIn, unsigned int nInIn, const CAmount &amountIn, bool storeIn, SignatureCache &signature_cache, PrecomputedTransactionData &txdataIn)
Definition: sigcache.h:70
bool VerifySchnorrSignature(Span< const unsigned char > sig, const XOnlyPubKey &pubkey, const uint256 &sighash) const override
Definition: sigcache.cpp:76
SignatureCache & m_signature_cache
Definition: sigcache.h:67
bool VerifyECDSASignature(const std::vector< unsigned char > &vchSig, const CPubKey &vchPubKey, const uint256 &sighash) const override
Definition: sigcache.cpp:63
Valid signature cache, to avoid doing expensive ECDSA signature checking twice for every transaction ...
Definition: sigcache.h:39
SignatureCache(size_t max_size_bytes)
Definition: sigcache.cpp:20
CSHA256 m_salted_hasher_schnorr
Definition: sigcache.h:43
void ComputeEntrySchnorr(uint256 &entry, const uint256 &hash, Span< const unsigned char > sig, const XOnlyPubKey &pubkey) const
Definition: sigcache.cpp:45
void ComputeEntryECDSA(uint256 &entry, const uint256 &hash, const std::vector< unsigned char > &vchSig, const CPubKey &pubkey) const
Definition: sigcache.cpp:39
map_type setValid
Definition: sigcache.h:45
std::shared_mutex cs_sigcache
Definition: sigcache.h:46
SignatureCache(const SignatureCache &)=delete
CSHA256 m_salted_hasher_ecdsa
Entries are SHA256(nonce || 'E' or 'S' || 31 zero bytes || signature hash || public key || signature)...
Definition: sigcache.h:42
CuckooCache::cache< uint256, SignatureCacheHasher > map_type
Definition: sigcache.h:44
bool Get(const uint256 &entry, const bool erase)
Definition: sigcache.cpp:51
void Set(const uint256 &entry)
Definition: sigcache.cpp:57
SignatureCache & operator=(const SignatureCache &)=delete
256-bit opaque blob.
Definition: uint256.h:127
MissingDataBehavior
Enum to specify what *TransactionSignatureChecker's behavior should be when dealing with missing tran...
Definition: interpreter.h:275
@ ASSERT_FAIL
Abort execution through assertion failure (for consensus code)
static constexpr size_t DEFAULT_SIGNATURE_CACHE_BYTES
Definition: sigcache.h:29
static constexpr size_t DEFAULT_SCRIPT_EXECUTION_CACHE_BYTES
Definition: sigcache.h:30
static constexpr size_t DEFAULT_VALIDATION_CACHE_BYTES
Definition: sigcache.h:28