Browse Source

Merge pull request #5860

9c27379 Reduce fingerprinting through timestamps in 'addr' messages. (Pieter Wuille)
0.13
Wladimir J. van der Laan 10 years ago
parent
commit
93a8c46807
No known key found for this signature in database
GPG Key ID: 74810B012346C9A6
  1. 3
      src/addrman.cpp
  2. 21
      src/main.cpp

3
src/addrman.cpp

@ -272,8 +272,9 @@ void CAddrMan::Good_(const CService& addr, int64_t nTime)
// update info // update info
info.nLastSuccess = nTime; info.nLastSuccess = nTime;
info.nLastTry = nTime; info.nLastTry = nTime;
info.nTime = nTime;
info.nAttempts = 0; 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 it is already in the tried set, don't do anything else
if (info.fInTried) if (info.fInTried)

21
src/main.cpp

@ -238,6 +238,10 @@ struct CBlockReject {
* and we're no longer holding the node's locks. * and we're no longer holding the node's locks.
*/ */
struct CNodeState { struct CNodeState {
//! The peer's address
CService address;
//! Whether we have a fully established connection.
bool fCurrentlyConnected;
//! Accumulated misbehaviour score for this peer. //! Accumulated misbehaviour score for this peer.
int nMisbehavior; int nMisbehavior;
//! Whether this peer should be disconnected and banned (unless whitelisted). //! Whether this peer should be disconnected and banned (unless whitelisted).
@ -262,6 +266,7 @@ struct CNodeState {
bool fPreferredDownload; bool fPreferredDownload;
CNodeState() { CNodeState() {
fCurrentlyConnected = false;
nMisbehavior = 0; nMisbehavior = 0;
fShouldBan = false; fShouldBan = false;
pindexBestKnownBlock = NULL; pindexBestKnownBlock = NULL;
@ -305,6 +310,7 @@ void InitializeNode(NodeId nodeid, const CNode *pnode) {
LOCK(cs_main); LOCK(cs_main);
CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second; CNodeState &state = mapNodeState.insert(std::make_pair(nodeid, CNodeState())).first->second;
state.name = pnode->addrName; state.name = pnode->addrName;
state.address = pnode->addr;
} }
void FinalizeNode(NodeId nodeid) { void FinalizeNode(NodeId nodeid) {
@ -314,6 +320,10 @@ void FinalizeNode(NodeId nodeid) {
if (state->fSyncStarted) if (state->fSyncStarted)
nSyncStarted--; nSyncStarted--;
if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
AddressCurrentlyConnected(state->address);
}
BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight) BOOST_FOREACH(const QueuedBlock& entry, state->vBlocksInFlight)
mapBlocksInFlight.erase(entry.hash); mapBlocksInFlight.erase(entry.hash);
EraseOrphansFor(nodeid); EraseOrphansFor(nodeid);
@ -3627,6 +3637,12 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
else if (strCommand == "verack") else if (strCommand == "verack")
{ {
pfrom->SetRecvVersion(min(pfrom->nVersion, PROTOCOL_VERSION)); 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;
}
} }
@ -4271,11 +4287,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; return true;
} }

Loading…
Cancel
Save