aboutsummaryrefslogtreecommitdiff
path: root/src/bloom.h
diff options
context:
space:
mode:
authorGregory Maxwell <greg@xiph.org>2013-08-18 20:21:06 -0700
committerGregory Maxwell <greg@xiph.org>2013-08-20 02:27:26 -0700
commit37c6389c5a0ca63ae3573440ecdfe95d28ad8f07 (patch)
tree51ef4367b16dc75bd60d4de0da261b65cebf4f2d /src/bloom.h
parent4bc9a192696273c88966c39debf8d17f16ebe471 (diff)
Performance optimization for bloom filters.
This reduces a peer's ability to attack network resources by using a full bloom filter, but without reducing the usability of bloom filters. It sets a default match everything filter for peers and it generalizes a prior optimization to cover more cases.
Diffstat (limited to 'src/bloom.h')
-rw-r--r--src/bloom.h9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/bloom.h b/src/bloom.h
index 389ae748e6..f482bfcc10 100644
--- a/src/bloom.h
+++ b/src/bloom.h
@@ -42,6 +42,8 @@ class CBloomFilter
{
private:
std::vector<unsigned char> vData;
+ bool isFull;
+ bool isEmpty;
unsigned int nHashFuncs;
unsigned int nTweak;
unsigned char nFlags;
@@ -57,9 +59,7 @@ public:
// It should generally always be a random value (and is largely only exposed for unit testing)
// nFlags should be one of the BLOOM_UPDATE_* enums (not _MASK)
CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak, unsigned char nFlagsIn);
- // Using a filter initialized with this results in undefined behavior
- // Should only be used for deserialization
- CBloomFilter() {}
+ CBloomFilter() : isFull(true) {}
IMPLEMENT_SERIALIZE
(
@@ -83,6 +83,9 @@ public:
// Also adds any outputs which match the filter to the filter (to match their spending txes)
bool IsRelevantAndUpdate(const CTransaction& tx, const uint256& hash);
+
+ // Checks for empty and full filters to avoid wasting cpu
+ void UpdateEmptyFull();
};
#endif /* BITCOIN_BLOOM_H */