Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
411766d
Refactor: AcceptConnection
Aug 13, 2015
fcb732b
Refactor: Bail early in AcceptConnection
Aug 13, 2015
fd7bab0
Refactor: Move failure conditions to the top of AcceptConnection
Aug 13, 2015
aa7ce9b
Record nMinPingUsecTime
Aug 13, 2015
a1c4aaf
AttemptToEvictConnection
Aug 13, 2015
0ca7ce3
Prefer to disconnect peers in favor of whitelisted peers
Aug 14, 2015
e92780d
Add comments to AttemptToEvictConnection
Aug 20, 2015
9c9e55b
RAII wrapper for CNode*
Aug 21, 2015
85886c9
Better support for nodes with non-standard nMaxConnections
Aug 22, 2015
b3f95e7
Return false early if vEvictionCandidates is empty
Aug 22, 2015
7aa827f
CNodeRef copy constructor and assignment operator
Aug 25, 2015
18af800
Acquire cs_vNodes before changing refrence counts
Aug 25, 2015
7f030fe
Fix comment
Aug 25, 2015
fabf358
Use network group instead of CNetAddr in final pass to select node to…
Aug 26, 2015
7962bcc
net: remove unused set
theuni Apr 16, 2016
9fd357d
net: use the exposed GetNodeSignals() rather than g_signals directly
theuni Apr 16, 2016
a5e278d
net: Drop CNodeRef for AttemptToEvictConnection
theuni Apr 18, 2016
4486d4e
net: make Ban/Unban/ClearBan functionality consistent
theuni Apr 18, 2016
851b6b4
net: No need to export DumpBanlist
theuni Apr 18, 2016
819295d
Stop using ConnectNode in layer 2 code
Fuzzbawls May 28, 2020
5cb5fd6
Stop exporting ConnectNode
Fuzzbawls May 28, 2020
7c03bd5
Add correct bool combiner for net signals
sipa Mar 5, 2015
e0bebbd
Rolling bloom filter class
gavinandresen Apr 24, 2015
14c88ee
Replace mruset setAddrKnown with CRollingBloomFilter addrKnown
gavinandresen Apr 25, 2015
89740ed
Use ring buffer of set iterators instead of deque of copies in mruset
sipa Apr 25, 2015
128d644
Better mruset unit test
sipa Apr 25, 2015
3230143
Add uint256 support to CRollingBloomFilter
petertodd Jul 17, 2015
dcd15bc
Reuse vector hashing code for uint256
sipa Jul 27, 2015
338d346
Make CRollingBloomFilter set nTweak for you
petertodd Jul 19, 2015
34ee777
Only use randomly created nonces in CRollingBloomFilter.
sipa Jul 27, 2015
9a59420
Keep track of recently rejected transactions
petertodd Jul 17, 2015
93e8c46
Move recentRejects initialization to top of InitBlockIndex
laanwj Jul 31, 2015
409aa83
Replace trickle nodes with per-node/message Poisson delays
sipa Apr 8, 2015
2e3b05c
Replace setInventoryKnown with a rolling bloom filter.
gmaxwell Nov 26, 2015
4f11eb2
Remove mruset as it is no longer used.
gmaxwell Nov 28, 2015
01273db
Rename setInventoryKnown filterInventoryKnown
Nov 29, 2015
9ac6b28
Only use filterInventoryKnown with MSG_TX inventory messages.
Nov 29, 2015
070b6fb
Actually only use filterInventoryKnown with MSG_TX inventory messages.
gmaxwell Nov 29, 2015
e6a1726
Added feeler connections increasing good addrs in the tried table.
EthanHeilman Jun 17, 2016
61c8ffe
Do not add random inbound peers to addrman.
gmaxwell Aug 25, 2016
efaf727
net: correctly initialize nMinPingUsecTime
laanwj Sep 4, 2015
6f41b3e
[QA] Missing mempool sync in pos_coldStaking and zc_publicspends tests
random-zebra Jun 23, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ BITCOIN_CORE_H = \
merkleblock.h \
messagesigner.h \
miner.h \
mruset.h \
net.h \
netaddress.h \
netbase.h \
Expand Down
1 change: 0 additions & 1 deletion src/Makefile.test.include
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,6 @@ BITCOIN_TESTS =\
test/main_tests.cpp \
test/mempool_tests.cpp \
test/merkle_tests.cpp \
test/mruset_tests.cpp \
test/multisig_tests.cpp \
test/net_tests.cpp \
test/netbase_tests.cpp \
Expand Down
5 changes: 2 additions & 3 deletions src/activemasternode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,12 @@ void CActiveMasternode::ManageStatus()

LogPrintf("CActiveMasternode::ManageStatus() - Checking inbound connection to '%s'\n", service.ToString());

CNode* pnode = ConnectNode(CAddress(service, NODE_NETWORK), NULL, true);
if (!pnode) {
CAddress addr(service, NODE_NETWORK);
if (!OpenNetworkConnection(addr, true, nullptr)) {
notCapableReason = "Could not connect to " + service.ToString();
LogPrintf("CActiveMasternode::ManageStatus() - not capable: %s\n", notCapableReason);
return;
}
pnode->Release();

// Choose coins to use
CPubKey pubKeyCollateralAddress;
Expand Down
99 changes: 86 additions & 13 deletions src/bloom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "primitives/transaction.h"
#include "script/script.h"
#include "script/standard.h"
#include "random.h"
#include "streams.h"

#include <math.h>
Expand All @@ -24,22 +25,33 @@


CBloomFilter::CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweakIn, unsigned char nFlagsIn) :
/**
* The ideal size for a bloom filter with a given number of elements and false positive rate is:
* - nElements * log(fp rate) / ln(2)^2
* We ignore filter parameters which will create a bloom filter larger than the protocol limits
*/
/**
* The ideal size for a bloom filter with a given number of elements and false positive rate is:
* - nElements * log(fp rate) / ln(2)^2
* We ignore filter parameters which will create a bloom filter larger than the protocol limits
*/
vData(std::min((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)), MAX_BLOOM_FILTER_SIZE * 8) / 8),
/**
* The ideal number of hash functions is filter size * ln(2) / number of elements
* Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits
* See https://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas
*/
/**
* The ideal number of hash functions is filter size * ln(2) / number of elements
* Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits
* See https://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas
*/
isFull(false),
isEmpty(false),
nHashFuncs(std::min((unsigned int)(vData.size() * 8 / nElements * LN2), MAX_HASH_FUNCS)),
nTweak(nTweakIn),
nFlags(nFlagsIn)
nHashFuncs(std::min((unsigned int)(vData.size() * 8 / nElements * LN2), MAX_HASH_FUNCS)),
nTweak(nTweakIn),
nFlags(nFlagsIn)
{
}

// Private constructor used by CRollingBloomFilter
CBloomFilter::CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweakIn) :
vData((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)) / 8),
isFull(false),
isEmpty(true),
nHashFuncs((unsigned int)(vData.size() * 8 / nElements * LN2)),
nTweak(nTweakIn),
nFlags(BLOOM_UPDATE_NONE)
{
}

Expand Down Expand Up @@ -118,6 +130,12 @@ void CBloomFilter::clear()
isEmpty = true;
}

void CBloomFilter::reset(unsigned int nNewTweak)
{
clear();
nTweak = nNewTweak;
}

bool CBloomFilter::IsWithinSizeConstraints() const
{
return vData.size() <= MAX_BLOOM_FILTER_SIZE && nHashFuncs <= MAX_HASH_FUNCS;
Expand Down Expand Up @@ -243,3 +261,58 @@ void CBloomFilter::UpdateEmptyFull()
isFull = full;
isEmpty = empty;
}

CRollingBloomFilter::CRollingBloomFilter(unsigned int nElements, double fpRate) :
b1(nElements * 2, fpRate, 0), b2(nElements * 2, fpRate, 0)
{
// Implemented using two bloom filters of 2 * nElements each.
// We fill them up, and clear them, staggered, every nElements
// inserted, so at least one always contains the last nElements
// inserted.
nInsertions = 0;
nBloomSize = nElements * 2;

reset();
}

void CRollingBloomFilter::insert(const std::vector<unsigned char>& vKey)
{
if (nInsertions == 0) {
b1.clear();
} else if (nInsertions == nBloomSize / 2) {
b2.clear();
}
b1.insert(vKey);
b2.insert(vKey);
if (++nInsertions == nBloomSize) {
nInsertions = 0;
}
}

void CRollingBloomFilter::insert(const uint256& hash)
{
std::vector<unsigned char> data(hash.begin(), hash.end());
insert(data);
}

bool CRollingBloomFilter::contains(const std::vector<unsigned char>& vKey) const
{
if (nInsertions < nBloomSize / 2) {
return b2.contains(vKey);
}
return b1.contains(vKey);
}

bool CRollingBloomFilter::contains(const uint256& hash) const
{
std::vector<unsigned char> data(hash.begin(), hash.end());
return contains(data);
}

void CRollingBloomFilter::reset()
{
unsigned int nNewTweak = GetRand(std::numeric_limits<unsigned int>::max());
b1.reset(nNewTweak);
b2.reset(nNewTweak);
nInsertions = 0;
}
38 changes: 38 additions & 0 deletions src/bloom.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,10 @@ class CBloomFilter

unsigned int Hash(unsigned int nHashNum, const std::vector<unsigned char>& vDataToHash) const;

// Private constructor for CRollingBloomFilter, no restrictions on size
CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak);
friend class CRollingBloomFilter;

public:
/**
* Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements
Expand Down Expand Up @@ -89,6 +93,7 @@ class CBloomFilter
bool contains(const uint256& hash) const;

void clear();
void reset(unsigned int nNewTweak);

//! 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)
Expand All @@ -104,4 +109,37 @@ class CBloomFilter
void UpdateEmptyFull();
};

/**
* RollingBloomFilter is a probabilistic "keep track of most recently inserted" set.
* Construct it with the number of items to keep track of, and a false-positive
* rate. Unlike CBloomFilter, by default nTweak is set to a cryptographically
* secure random value for you. Similarly rather than clear() the method
* reset() is provided, which also changes nTweak to decrease the impact of
* false-positives.
*
* contains(item) will always return true if item was one of the last N things
* insert()'ed ... but may also return true for items that were not inserted.
*/
class CRollingBloomFilter
{
public:
// A random bloom filter calls GetRand() at creation time.
// Don't create global CRollingBloomFilter objects, as they may be
// constructed before the randomizer is properly initialized.
CRollingBloomFilter(unsigned int nElements, double nFPRate);

void insert(const std::vector<unsigned char>& vKey);
void insert(const uint256& hash);
bool contains(const std::vector<unsigned char>& vKey) const;
bool contains(const uint256& hash) const;

void reset();

private:
unsigned int nBloomSize;
unsigned int nInsertions;
CBloomFilter b1, b2;
};


#endif // BITCOIN_BLOOM_H
Loading