]>
Commit | Line | Data |
---|---|---|
f914f1a7 | 1 | // Copyright (c) 2012-2014 The Bitcoin Core developers |
fa94b9d5 | 2 | // Distributed under the MIT software license, see the accompanying |
bd21612c | 3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
51ed9ec9 | 4 | |
bd21612c MC |
5 | #ifndef BITCOIN_BLOOM_H |
6 | #define BITCOIN_BLOOM_H | |
7 | ||
bd21612c MC |
8 | #include "serialize.h" |
9 | ||
51ed9ec9 BD |
10 | #include <vector> |
11 | ||
bd21612c MC |
12 | class COutPoint; |
13 | class CTransaction; | |
51ed9ec9 | 14 | class uint256; |
bd21612c | 15 | |
fa94b9d5 | 16 | //! 20,000 items with fp rate < 0.1% or 10,000 items and <0.0001% |
bd21612c MC |
17 | static const unsigned int MAX_BLOOM_FILTER_SIZE = 36000; // bytes |
18 | static const unsigned int MAX_HASH_FUNCS = 50; | |
19 | ||
fa94b9d5 MF |
20 | /** |
21 | * First two bits of nFlags control how much IsRelevantAndUpdate actually updates | |
22 | * The remaining bits are reserved | |
23 | */ | |
e1a4f377 MC |
24 | enum bloomflags |
25 | { | |
26 | BLOOM_UPDATE_NONE = 0, | |
27 | BLOOM_UPDATE_ALL = 1, | |
28 | // Only adds outpoints to the filter if the output is a pay-to-pubkey/pay-to-multisig script | |
29 | BLOOM_UPDATE_P2PUBKEY_ONLY = 2, | |
30 | BLOOM_UPDATE_MASK = 3, | |
31 | }; | |
bd21612c MC |
32 | |
33 | /** | |
34 | * BloomFilter is a probabilistic filter which SPV clients provide | |
35 | * so that we can filter the transactions we sends them. | |
36 | * | |
37 | * This allows for significantly more efficient transaction and block downloads. | |
38 | * | |
39 | * Because bloom filters are probabilistic, an SPV node can increase the false- | |
40 | * positive rate, making us send them transactions which aren't actually theirs, | |
41 | * allowing clients to trade more bandwidth for more privacy by obfuscating which | |
42 | * keys are owned by them. | |
43 | */ | |
44 | class CBloomFilter | |
45 | { | |
46 | private: | |
47 | std::vector<unsigned char> vData; | |
37c6389c GM |
48 | bool isFull; |
49 | bool isEmpty; | |
bd21612c | 50 | unsigned int nHashFuncs; |
b1f99bed | 51 | unsigned int nTweak; |
e1a4f377 | 52 | unsigned char nFlags; |
bd21612c MC |
53 | |
54 | unsigned int Hash(unsigned int nHashNum, const std::vector<unsigned char>& vDataToHash) const; | |
55 | ||
56 | public: | |
fa94b9d5 MF |
57 | /** |
58 | * Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements | |
59 | * Note that if the given parameters will result in a filter outside the bounds of the protocol limits, | |
60 | * the filter created will be as close to the given parameters as possible within the protocol limits. | |
61 | * This will apply if nFPRate is very low or nElements is unreasonably high. | |
62 | * nTweak is a constant which is added to the seed value passed to the hash function | |
63 | * It should generally always be a random value (and is largely only exposed for unit testing) | |
64 | * nFlags should be one of the BLOOM_UPDATE_* enums (not _MASK) | |
65 | */ | |
e1a4f377 | 66 | CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak, unsigned char nFlagsIn); |
8bdd2877 | 67 | CBloomFilter() : isFull(true), isEmpty(false), nHashFuncs(0), nTweak(0), nFlags(0) {} |
bd21612c | 68 | |
3f6540ad | 69 | ADD_SERIALIZE_METHODS; |
3d796f89 | 70 | |
84881f8c | 71 | template <typename Stream, typename Operation> |
31e9a838 | 72 | inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
bd21612c MC |
73 | READWRITE(vData); |
74 | READWRITE(nHashFuncs); | |
b1f99bed | 75 | READWRITE(nTweak); |
e1a4f377 | 76 | READWRITE(nFlags); |
3d796f89 | 77 | } |
bd21612c MC |
78 | |
79 | void insert(const std::vector<unsigned char>& vKey); | |
80 | void insert(const COutPoint& outpoint); | |
81 | void insert(const uint256& hash); | |
82 | ||
83 | bool contains(const std::vector<unsigned char>& vKey) const; | |
84 | bool contains(const COutPoint& outpoint) const; | |
85 | bool contains(const uint256& hash) const; | |
86 | ||
9c347313 TH |
87 | void clear(); |
88 | ||
fa94b9d5 MF |
89 | //! True if the size is <= MAX_BLOOM_FILTER_SIZE and the number of hash functions is <= MAX_HASH_FUNCS |
90 | //! (catch a filter which was just deserialized which was too big) | |
bd21612c MC |
91 | bool IsWithinSizeConstraints() const; |
92 | ||
fa94b9d5 | 93 | //! Also adds any outputs which match the filter to the filter (to match their spending txes) |
d38da59b | 94 | bool IsRelevantAndUpdate(const CTransaction& tx); |
37c6389c | 95 | |
fa94b9d5 | 96 | //! Checks for empty and full filters to avoid wasting cpu |
37c6389c | 97 | void UpdateEmptyFull(); |
bd21612c MC |
98 | }; |
99 | ||
093303a8 | 100 | #endif // BITCOIN_BLOOM_H |