diff --git a/main.cpp b/main.cpp index 89b42f76e..ae20e08dd 100644 --- a/main.cpp +++ b/main.cpp @@ -1960,8 +1960,8 @@ bool ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) // Send the rest of the chain if (pindex) pindex = pindex->pnext; - printf("getblocks %d to %s\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,16).c_str()); - int nLimit = 500; + int nLimit = 500 + locator.GetDistanceBack(); + printf("getblocks %d to %s limit %d\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,16).c_str(), nLimit); for (; pindex; pindex = pindex->pnext) { if (pindex->GetBlockHash() == hashStop) diff --git a/main.h b/main.h index 79f14c686..822045a57 100644 --- a/main.h +++ b/main.h @@ -1298,6 +1298,27 @@ public: vHave.push_back(hashGenesisBlock); } + int GetDistanceBack() + { + // Retrace how far back it was in the sender's branch + int nDistance = 0; + int nStep = 1; + foreach(const uint256& hash, vHave) + { + map::iterator mi = mapBlockIndex.find(hash); + if (mi != mapBlockIndex.end()) + { + CBlockIndex* pindex = (*mi).second; + if (pindex->IsInMainChain()) + return nDistance; + } + nDistance += nStep; + if (nDistance > 10) + nStep *= 2; + } + return nDistance; + } + CBlockIndex* GetBlockIndex() { // Find the first block the caller has in the main chain diff --git a/serialize.h b/serialize.h index aae821b6d..b2d948df9 100644 --- a/serialize.h +++ b/serialize.h @@ -20,7 +20,7 @@ class CDataStream; class CAutoFile; static const int VERSION = 106; -static const char* pszSubVer = " linux-test8"; +static const char* pszSubVer = " linux-test9";