Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10907599
bloom.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Subscribers
None
bloom.h
View Options
// Copyright (c) 2012 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#ifndef BITCOIN_BLOOM_H
#define BITCOIN_BLOOM_H
#include
<vector>
#include
"uint256.h"
#include
"serialize.h"
class
COutPoint
;
class
CTransaction
;
// 20,000 items with fp rate < 0.1% or 10,000 items and <0.0001%
static
const
unsigned
int
MAX_BLOOM_FILTER_SIZE
=
36000
;
// bytes
static
const
unsigned
int
MAX_HASH_FUNCS
=
50
;
// First two bits of nFlags control how much IsRelevantAndUpdate actually updates
// The remaining bits are reserved
enum
bloomflags
{
BLOOM_UPDATE_NONE
=
0
,
BLOOM_UPDATE_ALL
=
1
,
// Only adds outpoints to the filter if the output is a pay-to-pubkey/pay-to-multisig script
BLOOM_UPDATE_P2PUBKEY_ONLY
=
2
,
BLOOM_UPDATE_MASK
=
3
,
};
/**
* BloomFilter is a probabilistic filter which SPV clients provide
* so that we can filter the transactions we sends them.
*
* This allows for significantly more efficient transaction and block downloads.
*
* Because bloom filters are probabilistic, an SPV node can increase the false-
* positive rate, making us send them transactions which aren't actually theirs,
* allowing clients to trade more bandwidth for more privacy by obfuscating which
* keys are owned by them.
*/
class
CBloomFilter
{
private
:
std
::
vector
<
unsigned
char
>
vData
;
unsigned
int
nHashFuncs
;
unsigned
int
nTweak
;
unsigned
char
nFlags
;
unsigned
int
Hash
(
unsigned
int
nHashNum
,
const
std
::
vector
<
unsigned
char
>&
vDataToHash
)
const
;
public
:
// Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements
// Note that if the given parameters will result in a filter outside the bounds of the protocol limits,
// the filter created will be as close to the given parameters as possible within the protocol limits.
// This will apply if nFPRate is very low or nElements is unreasonably high.
// nTweak is a constant which is added to the seed value passed to the hash function
// 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
()
{}
IMPLEMENT_SERIALIZE
(
READWRITE
(
vData
);
READWRITE
(
nHashFuncs
);
READWRITE
(
nTweak
);
READWRITE
(
nFlags
);
)
void
insert
(
const
std
::
vector
<
unsigned
char
>&
vKey
);
void
insert
(
const
COutPoint
&
outpoint
);
void
insert
(
const
uint256
&
hash
);
bool
contains
(
const
std
::
vector
<
unsigned
char
>&
vKey
)
const
;
bool
contains
(
const
COutPoint
&
outpoint
)
const
;
bool
contains
(
const
uint256
&
hash
)
const
;
// True if the size is <= MAX_BLOOM_FILTER_SIZE and the number of hash functions is <= MAX_HASH_FUNCS
// (catch a filter which was just deserialized which was too big)
bool
IsWithinSizeConstraints
()
const
;
// Also adds any outputs which match the filter to the filter (to match their spending txes)
bool
IsRelevantAndUpdate
(
const
CTransaction
&
tx
,
const
uint256
&
hash
);
};
#endif
/* BITCOIN_BLOOM_H */
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Mon, Nov 25, 08:05 (1 d, 19 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4511297
Default Alt Text
bloom.h (3 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment