aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2015-03-05 04:01:22 -0800
committerWladimir J. van der Laan <laanwj@gmail.com>2015-03-17 16:39:10 +0100
commitca301bf98c5929e19abf63773b29b7a53a327e41 (patch)
tree3165ccb3527e237e5984d7cb50ec6ca863a586eb
parent2c0840631d560c5621063d163728932212e8db60 (diff)
downloadbitcoin-ca301bf98c5929e19abf63773b29b7a53a327e41.tar.xz
Reduce fingerprinting through timestamps in 'addr' messages.
Suggested by Jonas Nick. Rebased-From: 9c2737901b5203f267d21d728019d64b46f1d9f3 Github-Pull: #5860
-rw-r--r--src/addrman.cpp3
-rw-r--r--src/main.cpp21
2 files changed, 18 insertions, 6 deletions
diff --git a/src/addrman.cpp b/src/addrman.cpp
index 1982db52ae..e4e001348e 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -272,8 +272,9 @@ void CAddrMan::Good_(const CService& addr, int64_t nTime)
// update info
info.nLastSuccess = nTime;
info.nLastTry = nTime;
- info.nTime = nTime;
info.nAttempts = 0;
+ // nTime is not updated here, to avoid leaking information about
+ // currently-connected peers.
// if it is already in the tried set, don't do anything else
if (info.fInTried)
diff --git a/src/main.cpp b/src/main.cpp
index ebc9418891..8bedae6dd8 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -231,6 +231,10 @@ struct CBlockReject {
* and we're no longer holding the node's locks.
*/
struct CNodeState {
+ //! The peer's address
+ CService address;
+ //! Whether we have a fully established connection.
+ bool fCurrentlyConnected;
//! Accumulated misbehaviour score for this peer.
int nMisbehavior;
//! Whether this peer should be disconnected and banned (unless whitelisted).
@@ -255,6 +259,7 @@ struct CNodeState {
bool fPreferredDownload;
CNodeState() {
+ fCurrentlyConnected = false;
nMisbehavior = 0;
fShouldBan = false;
pindexBestKnownBlock = NULL;
@@ -298,6 +303,7 @@ void InitializeNode(NodeId nodeid, const CNode *pnode) {
LOCK(cs_main);
CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second;
state.name = pnode->addrName;
+ state.address = pnode->addr;
}
void FinalizeNode(NodeId nodeid) {
@@ -307,6 +313,10 @@ void FinalizeNode(NodeId nodeid) {
if (state->fSyncStarted)
nSyncStarted--;
+ if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
+ AddressCurrentlyConnected(state->address);
+ }
+
BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight)
mapBlocksInFlight.erase(entry.hash);
EraseOrphansFor(nodeid);
@@ -3563,6 +3573,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
else if (strCommand == "verack")
{
pfrom->SetRecvVersion(min(pfrom->nVersion, PROTOCOL_VERSION));
+
+ // Mark this node as currently connected, so we update its timestamp later.
+ if (pfrom->fNetworkNode) {
+ LOCK(cs_main);
+ State(pfrom->GetId())->fCurrentlyConnected = true;
+ }
}
@@ -4207,11 +4223,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
}
- // Update the last seen time for this node's address
- if (pfrom->fNetworkNode)
- if (strCommand == "version" || strCommand == "addr" || strCommand == "inv" || strCommand == "getdata" || strCommand == "ping")
- AddressCurrentlyConnected(pfrom->addr);
-
return true;
}