diff --git a/src/seeder/bitcoin.h b/src/seeder/bitcoin.h --- a/src/seeder/bitcoin.h +++ b/src/seeder/bitcoin.h @@ -43,6 +43,8 @@ NotFound, }; +struct CServiceResult; + class CSeederNode { private: SOCKET sock; @@ -91,7 +93,6 @@ int GetStartingHeight() { return nStartingHeight; } }; -bool TestNode(const CService &cip, int &ban, int &client, std::string &clientSV, - int &blocks, std::vector *vAddr); +void TestNode(CServiceResult &nodeRecord, std::vector *vAddr); #endif // BITCOIN_SEEDER_BITCOIN_H diff --git a/src/seeder/bitcoin.cpp b/src/seeder/bitcoin.cpp --- a/src/seeder/bitcoin.cpp +++ b/src/seeder/bitcoin.cpp @@ -381,25 +381,26 @@ return (ban == 0) && res; } -bool TestNode(const CService &cip, int &ban, int &clientV, - std::string &clientSV, int &blocks, - std::vector *vAddr) { +void TestNode(CServiceResult &nodeRecord, std::vector *vAddr) { try { - CSeederNode node(cip, vAddr); + CSeederNode node(nodeRecord.service, vAddr); bool ret = node.Run(); if (!ret) { - ban = node.GetBan(); + nodeRecord.nBanTime = node.GetBan(); } else { - ban = 0; + nodeRecord.nBanTime = 0; } - clientV = node.GetClientVersion(); - clientSV = node.GetClientSubVersion(); - blocks = node.GetStartingHeight(); + nodeRecord.nClientV = node.GetClientVersion(); + nodeRecord.strClientV = node.GetClientSubVersion(); + nodeRecord.nHeight = node.GetStartingHeight(); // fprintf(stdout, "%s: %s!!!\n", cip.ToString().c_str(), ret ? "GOOD" : // "BAD"); - return ret; + nodeRecord.fGood = ret; + if (!nodeRecord.fGood && !nodeRecord.fReliable) { + nodeRecord.nBanTime = 100000; + } } catch (std::ios_base::failure &e) { - ban = 0; - return false; + nodeRecord.nBanTime = 0; + nodeRecord.fGood = false; } } diff --git a/src/seeder/db.h b/src/seeder/db.h --- a/src/seeder/db.h +++ b/src/seeder/db.h @@ -80,6 +80,7 @@ private: CService ip; uint64_t services; + int64_t timeFirstFound; int64_t lastTry; int64_t ourLastTry; int64_t ourLastSuccess; @@ -95,10 +96,20 @@ int success; std::string clientSubVersion; +protected: + bool hasBeenTriedBefore() const { return total > 0; } + int64_t timeSinceFoundOrLastSuccess() { + int64_t now = time(nullptr); + int64_t lastSuccessOrFirstFoundTime = + success > 0 ? ourLastSuccess : timeFirstFound; + return now - lastSuccessOrFirstFoundTime; + } + public: CAddrInfo() - : services(0), lastTry(0), ourLastTry(0), ourLastSuccess(0), - ignoreTill(0), clientVersion(0), blocks(0), total(0), success(0) {} + : services(0), timeFirstFound(time(nullptr)), lastTry(0), ourLastTry(0), + ourLastSuccess(0), ignoreTill(0), clientVersion(0), blocks(0), + total(0), success(0) {} CAddrReport GetReport() const { CAddrReport ret; @@ -221,6 +232,7 @@ return; } + READWRITE(timeFirstFound); READWRITE(ourLastTry); READWRITE(ignoreTill); READWRITE(stat2H); @@ -260,6 +272,7 @@ struct CServiceResult { CService service; bool fGood; + bool fReliable; int nBanTime; int nHeight; int nClientV; diff --git a/src/seeder/db.cpp b/src/seeder/db.cpp --- a/src/seeder/db.cpp +++ b/src/seeder/db.cpp @@ -69,6 +69,9 @@ } else { ip.service = idToInfo[ret].ip; ip.ourLastSuccess = idToInfo[ret].ourLastSuccess; + ip.fReliable = + idToInfo[ret].IsGood() && idToInfo[ret].hasBeenTriedBefore() && + idToInfo[ret].timeSinceFoundOrLastSuccess() > 2 * 86400; break; } } while (1); diff --git a/src/seeder/main.cpp b/src/seeder/main.cpp --- a/src/seeder/main.cpp +++ b/src/seeder/main.cpp @@ -191,9 +191,7 @@ res.nHeight = 0; res.strClientV = ""; bool getaddr = res.ourLastSuccess + 86400 < now; - res.fGood = TestNode(res.service, res.nBanTime, res.nClientV, - res.strClientV, res.nHeight, - getaddr ? &addr : nullptr); + TestNode(res, getaddr ? &addr : nullptr); } db.ResultMany(ips);