Master Core  v0.0.9 - 49a5c0d97abf09ef2911ddfe8d9551df59f9efd3-dirty
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
bloom.h
Go to the documentation of this file.
1 // Copyright (c) 2012 The Bitcoin developers
2 // Distributed under the MIT/X11 software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #ifndef BITCOIN_BLOOM_H
6 #define BITCOIN_BLOOM_H
7 
8 #include "serialize.h"
9 
10 #include <vector>
11 
12 class COutPoint;
13 class CTransaction;
14 class uint256;
15 
16 // 20,000 items with fp rate < 0.1% or 10,000 items and <0.0001%
17 static const unsigned int MAX_BLOOM_FILTER_SIZE = 36000; // bytes
18 static const unsigned int MAX_HASH_FUNCS = 50;
19 
20 // First two bits of nFlags control how much IsRelevantAndUpdate actually updates
21 // The remaining bits are reserved
23 {
26  // Only adds outpoints to the filter if the output is a pay-to-pubkey/pay-to-multisig script
29 };
30 
43 {
44 private:
45  std::vector<unsigned char> vData;
46  bool isFull;
47  bool isEmpty;
48  unsigned int nHashFuncs;
49  unsigned int nTweak;
50  unsigned char nFlags;
51 
52  unsigned int Hash(unsigned int nHashNum, const std::vector<unsigned char>& vDataToHash) const;
53 
54 public:
55  // Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements
56  // Note that if the given parameters will result in a filter outside the bounds of the protocol limits,
57  // the filter created will be as close to the given parameters as possible within the protocol limits.
58  // This will apply if nFPRate is very low or nElements is unreasonably high.
59  // nTweak is a constant which is added to the seed value passed to the hash function
60  // It should generally always be a random value (and is largely only exposed for unit testing)
61  // nFlags should be one of the BLOOM_UPDATE_* enums (not _MASK)
62  CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak, unsigned char nFlagsIn);
63  CBloomFilter() : isFull(true) {}
64 
66  (
67  READWRITE(vData);
68  READWRITE(nHashFuncs);
69  READWRITE(nTweak);
70  READWRITE(nFlags);
71  )
72 
73  void insert(const std::vector<unsigned char>& vKey);
74  void insert(const COutPoint& outpoint);
75  void insert(const uint256& hash);
76 
77  bool contains(const std::vector<unsigned char>& vKey) const;
78  bool contains(const COutPoint& outpoint) const;
79  bool contains(const uint256& hash) const;
80 
81  // True if the size is <= MAX_BLOOM_FILTER_SIZE and the number of hash functions is <= MAX_HASH_FUNCS
82  // (catch a filter which was just deserialized which was too big)
83  bool IsWithinSizeConstraints() const;
84 
85  // Also adds any outputs which match the filter to the filter (to match their spending txes)
86  bool IsRelevantAndUpdate(const CTransaction& tx, const uint256& hash);
87 
88  // Checks for empty and full filters to avoid wasting cpu
89  void UpdateEmptyFull();
90 };
91 
92 #endif /* BITCOIN_BLOOM_H */
bloomflags
Definition: bloom.h:22
#define READWRITE(obj)
Definition: serialize.h:92
unsigned int nTweak
Definition: bloom.h:49
unsigned char nFlags
Definition: bloom.h:50
BloomFilter is a probabilistic filter which SPV clients provide so that we can filter the transaction...
Definition: bloom.h:42
unsigned int Hash(unsigned int nHashNum, const std::vector< unsigned char > &vDataToHash) const
Definition: bloom.cpp:34
bool isFull
Definition: bloom.h:46
static const unsigned int MAX_BLOOM_FILTER_SIZE
Definition: bloom.h:17
std::vector< unsigned char > vData
Definition: bloom.h:45
#define IMPLEMENT_SERIALIZE(statements)
Definition: serialize.h:54
unsigned int nHashFuncs
Definition: bloom.h:48
void insert(const uint256 &hash)
Definition: bloom.cpp:40
bool IsWithinSizeConstraints() const
Definition: bloom.cpp:97
bool contains(const std::vector< unsigned char > &vKey) const
Definition: bloom.cpp:67
CBloomFilter()
Definition: bloom.h:63
static const unsigned int MAX_HASH_FUNCS
Definition: bloom.h:18
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: core.h:22
256-bit unsigned integer
Definition: uint256.h:531
bool IsRelevantAndUpdate(const CTransaction &tx, const uint256 &hash)
Definition: bloom.cpp:102
void UpdateEmptyFull()
Definition: bloom.cpp:171
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: core.h:183
bool isEmpty
Definition: bloom.h:47