From 2da02dd7749060b55fd5e14696277b64583b8100 Mon Sep 17 00:00:00 2001 From: s_nakamoto Date: Mon, 14 Dec 2009 02:12:01 +0000 Subject: [PATCH] filter out duplicate getblocks and don't relay inv messages during initial block download -- 0.2 rc2 --- main.cpp | 25 ++++++++++--------------- net.cpp | 21 +++++++++++++++++++-- net.h | 7 +++++++ serialize.h | 2 +- setup.nsi | 2 +- 5 files changed, 38 insertions(+), 19 deletions(-) diff --git a/main.cpp b/main.cpp index cb93e5486..4cc91cb1b 100644 --- a/main.cpp +++ b/main.cpp @@ -1274,7 +1274,7 @@ bool CBlock::AcceptBlock() if (!AddToBlockIndex(nFile, nBlockPos)) return error("AcceptBlock() : AddToBlockIndex failed"); - if (hashBestChain == hash) + if (hashBestChain == hash && nBestHeight > 28000) RelayInventory(CInv(MSG_BLOCK, hash)); // // Add atoms to user reviews for coins created @@ -1314,7 +1314,7 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) // Ask this guy to fill in what we're missing if (pfrom) - pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), GetOrphanRoot(pblock)); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock)); return true; } @@ -1816,7 +1816,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (!fAskedForBlocks && !pfrom->fClient) { fAskedForBlocks = true; - pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0)); + pfrom->PushGetBlocks(pindexBest, uint256(0)); } pfrom->fSuccessfullyConnected = true; @@ -1836,6 +1836,8 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { vector vAddr; vRecv >> vAddr; + if (vAddr.size() > 50000) // lower this to 1000 later + return error("message addr size() = %d", vAddr.size()); // Store the new addresses CAddrDB addrdb; @@ -1864,6 +1866,8 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { vector vInv; vRecv >> vInv; + if (vInv.size() > 50000) + return error("message inv size() = %d", vInv.size()); CTxDB txdb("r"); foreach(const CInv& inv, vInv) @@ -1878,7 +1882,7 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (!fAlreadyHave) pfrom->AskFor(inv); else if (inv.type == MSG_BLOCK && mapOrphanBlocks.count(inv.hash)) - pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), GetOrphanRoot(mapOrphanBlocks[inv.hash])); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash])); // Track requests for our stuff CRITICAL_BLOCK(cs_mapRequestCount) @@ -1895,6 +1899,8 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { vector vInv; vRecv >> vInv; + if (vInv.size() > 50000) + return error("message getdata size() = %d", vInv.size()); foreach(const CInv& inv, vInv) { @@ -2210,17 +2216,6 @@ bool SendMessages(CNode* pto) } } - // Clear inventory known periodically in case an inv message was missed, - // although usually they would just get it from another node. - static int64 nLastInventoryKnownClear; - if (GetTime() - nLastInventoryKnownClear > 2 * 60 * 60) // every 2 hours - { - nLastInventoryKnownClear = GetTime(); - CRITICAL_BLOCK(cs_vNodes) - foreach(CNode* pnode, vNodes) - pnode->setInventoryKnown.clear(); - } - // // Message: addr diff --git a/net.cpp b/net.cpp index 941e7c4dc..168651ca2 100644 --- a/net.cpp +++ b/net.cpp @@ -40,6 +40,23 @@ CAddress addrProxy("127.0.0.1:9050"); + + +void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) +{ + // Filter out duplicate requests + if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) + return; + pindexLastGetBlocksBegin = pindexBegin; + hashLastGetBlocksEnd = hashEnd; + + PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd); +} + + + + + bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet) { hSocketRet = INVALID_SOCKET; @@ -764,12 +781,12 @@ void ThreadSocketHandler2(void* parg) printf("socket no message in first 60 seconds, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0); pnode->fDisconnect = true; } - else if (GetTime() - pnode->nLastSend > 10 * 60 && GetTime() - pnode->nLastSendEmpty > 10 * 60) + else if (GetTime() - pnode->nLastSend > 90*60 && GetTime() - pnode->nLastSendEmpty > 90*60) { printf("socket not sending\n"); pnode->fDisconnect = true; } - else if (GetTime() - pnode->nLastRecv > (pnode->nVersion >= 107 ? 15*60 : 90*60)) + else if (GetTime() - pnode->nLastRecv > 90*60) { printf("socket inactivity timeout\n"); pnode->fDisconnect = true; diff --git a/net.h b/net.h index 7fe4a7c7d..90af3b4b1 100644 --- a/net.h +++ b/net.h @@ -7,6 +7,7 @@ class CAddress; class CInv; class CRequestTracker; class CNode; +class CBlockIndex; @@ -504,6 +505,8 @@ public: map mapRequests; CCriticalSection cs_mapRequests; uint256 hashContinue; + CBlockIndex* pindexLastGetBlocksBegin; + uint256 hashLastGetBlocksEnd; // flood vector vAddrToSend; @@ -541,6 +544,8 @@ public: nRefCount = 0; nReleaseTime = 0; hashContinue = 0; + pindexLastGetBlocksBegin = 0; + hashLastGetBlocksEnd = 0; fGetAddr = false; vfSubscribe.assign(256, false); @@ -635,6 +640,7 @@ public: } + void BeginMessage(const char* pszCommand) { cs_vSend.Enter(); @@ -900,6 +906,7 @@ public: + void PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd); bool IsSubscribed(unsigned int nChannel); void Subscribe(unsigned int nChannel, unsigned int nHops=0); void CancelSubscribe(unsigned int nChannel); diff --git a/serialize.h b/serialize.h index 8f925103b..ce4aff3cd 100644 --- a/serialize.h +++ b/serialize.h @@ -20,7 +20,7 @@ class CDataStream; class CAutoFile; static const int VERSION = 200; -static const char* pszSubVer = " rc1"; +static const char* pszSubVer = " rc2"; diff --git a/setup.nsi b/setup.nsi index a5a73366a..03322877a 100644 --- a/setup.nsi +++ b/setup.nsi @@ -42,7 +42,7 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile bitcoin-0.2.0-setup.exe +OutFile bitcoin-0.2.0-win32-setup.exe InstallDir $PROGRAMFILES\Bitcoin CRCCheck on XPStyle on