aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2015-03-08 06:30:05 -0700
committerWladimir J. van der Laan <laanwj@gmail.com>2015-04-01 16:38:31 +0200
commitb78899425602085c759f7c889a6ddbb8ea5f6d38 (patch)
tree9797cbd6bf2796a457ccfa77205d6992b92d903a
parent90bef6638fc689c13924fc17d115d5866b425e6c (diff)
downloadbitcoin-b78899425602085c759f7c889a6ddbb8ea5f6d38.tar.xz
Switch addrman key from vector to uint256
Conflicts: src/addrman.cpp Rebased-From: b23add5521e4207085d41a0266617e94435fc22e Github-Pull: #5941
-rw-r--r--src/addrman.cpp14
-rw-r--r--src/addrman.h21
2 files changed, 23 insertions, 12 deletions
diff --git a/src/addrman.cpp b/src/addrman.cpp
index e4e001348e..c53d40f721 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -10,30 +10,30 @@
using namespace std;
-int CAddrInfo::GetTriedBucket(const std::vector<unsigned char>& nKey) const
+int CAddrInfo::GetTriedBucket(const uint256& nKey) const
{
CDataStream ss1(SER_GETHASH, 0);
std::vector<unsigned char> vchKey = GetKey();
- ss1 << nKey << vchKey;
+ ss1 << ((unsigned char)32) << nKey << vchKey;
uint64_t hash1 = Hash(ss1.begin(), ss1.end()).GetLow64();
CDataStream ss2(SER_GETHASH, 0);
std::vector<unsigned char> vchGroupKey = GetGroup();
- ss2 << nKey << vchGroupKey << (hash1 % ADDRMAN_TRIED_BUCKETS_PER_GROUP);
+ ss2 << ((unsigned char)32) << nKey << vchGroupKey << (hash1 % ADDRMAN_TRIED_BUCKETS_PER_GROUP);
uint64_t hash2 = Hash(ss2.begin(), ss2.end()).GetLow64();
return hash2 % ADDRMAN_TRIED_BUCKET_COUNT;
}
-int CAddrInfo::GetNewBucket(const std::vector<unsigned char>& nKey, const CNetAddr& src) const
+int CAddrInfo::GetNewBucket(const uint256& nKey, const CNetAddr& src) const
{
CDataStream ss1(SER_GETHASH, 0);
std::vector<unsigned char> vchGroupKey = GetGroup();
std::vector<unsigned char> vchSourceGroupKey = src.GetGroup();
- ss1 << nKey << vchGroupKey << vchSourceGroupKey;
+ ss1 << ((unsigned char)32) << nKey << vchGroupKey << vchSourceGroupKey;
uint64_t hash1 = Hash(ss1.begin(), ss1.end()).GetLow64();
CDataStream ss2(SER_GETHASH, 0);
- ss2 << nKey << vchSourceGroupKey << (hash1 % ADDRMAN_NEW_BUCKETS_PER_SOURCE_GROUP);
+ ss2 << ((unsigned char)32) << nKey << vchSourceGroupKey << (hash1 % ADDRMAN_NEW_BUCKETS_PER_SOURCE_GROUP);
uint64_t hash2 = Hash(ss2.begin(), ss2.end()).GetLow64();
return hash2 % ADDRMAN_NEW_BUCKET_COUNT;
}
@@ -483,6 +483,8 @@ int CAddrMan::Check_()
return -13;
if (mapNew.size())
return -15;
+ if (nKey.IsNull())
+ return -16;
return 0;
}
diff --git a/src/addrman.h b/src/addrman.h
index d47217683c..b73266f843 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -10,6 +10,7 @@
#include "random.h"
#include "sync.h"
#include "timedata.h"
+#include "uint256.h"
#include "util.h"
#include <map>
@@ -79,13 +80,13 @@ public:
}
//! Calculate in which "tried" bucket this entry belongs
- int GetTriedBucket(const std::vector<unsigned char> &nKey) const;
+ int GetTriedBucket(const uint256 &nKey) const;
//! Calculate in which "new" bucket this entry belongs, given a certain source
- int GetNewBucket(const std::vector<unsigned char> &nKey, const CNetAddr& src) const;
+ int GetNewBucket(const uint256 &nKey, const CNetAddr& src) const;
//! Calculate in which "new" bucket this entry belongs, using its default source
- int GetNewBucket(const std::vector<unsigned char> &nKey) const
+ int GetNewBucket(const uint256 &nKey) const
{
return GetNewBucket(nKey, source);
}
@@ -176,7 +177,7 @@ private:
mutable CCriticalSection cs;
//! secret key to randomize bucket select with
- std::vector<unsigned char> nKey;
+ uint256 nKey;
//! last used nId
int nIdCount;
@@ -284,6 +285,7 @@ public:
unsigned char nVersion = 0;
s << nVersion;
+ s << ((unsigned char)32);
s << nKey;
s << nNew;
s << nTried;
@@ -328,6 +330,9 @@ public:
unsigned char nVersion;
s >> nVersion;
+ unsigned char nKeySize;
+ s >> nKeySize;
+ if (nKeySize != 32) throw std::ios_base::failure("Incorrect keysize in addrman");
s >> nKey;
s >> nNew;
s >> nTried;
@@ -393,14 +398,18 @@ public:
CAddrMan() : vRandom(0), vvTried(ADDRMAN_TRIED_BUCKET_COUNT, std::vector<int>(0)), vvNew(ADDRMAN_NEW_BUCKET_COUNT, std::set<int>())
{
- nKey.resize(32);
- GetRandBytes(&nKey[0], 32);
+ nKey = GetRandHash();
nIdCount = 0;
nTried = 0;
nNew = 0;
}
+ ~CAddrMan()
+ {
+ nKey = uint256(0);
+ }
+
//! Return the number of (unique) addresses in all tables.
int size()
{