Browse Source

add startingheight to output

pull/1/head
Pieter Wuille 13 years ago
parent
commit
2b29f0a760
  1. 7
      bitcoin.cpp
  2. 2
      bitcoin.h
  3. 3
      db.cpp
  4. 17
      db.h
  5. 9
      main.cpp

7
bitcoin.cpp

@ -258,9 +258,13 @@ public:
std::string GetClientSubVersion() { std::string GetClientSubVersion() {
return strSubVer; return strSubVer;
} }
int GetStartingHeight() {
return nStartingHeight;
}
}; };
bool TestNode(const CService &cip, int &ban, int &clientV, std::string &clientSV, vector<CAddress>& vAddr) { bool TestNode(const CService &cip, int &ban, int &clientV, std::string &clientSV, int &blocks, vector<CAddress>& vAddr) {
try { try {
CNode node(cip, vAddr); CNode node(cip, vAddr);
bool ret = node.Run(); bool ret = node.Run();
@ -271,6 +275,7 @@ bool TestNode(const CService &cip, int &ban, int &clientV, std::string &clientSV
} }
clientV = node.GetClientVersion(); clientV = node.GetClientVersion();
clientSV = node.GetClientSubVersion(); clientSV = node.GetClientSubVersion();
blocks = node.GetStartingHeight();
// printf("%s: %s!!!\n", cip.ToString().c_str(), ret ? "GOOD" : "BAD"); // printf("%s: %s!!!\n", cip.ToString().c_str(), ret ? "GOOD" : "BAD");
return ret; return ret;
} catch(std::ios_base::failure& e) { } catch(std::ios_base::failure& e) {

2
bitcoin.h

@ -3,6 +3,6 @@
#include "protocol.h" #include "protocol.h"
bool TestNode(const CService &cip, int &ban, int &client, std::string &clientSV, std::vector<CAddress>& vAddr); bool TestNode(const CService &cip, int &ban, int &client, std::string &clientSV, int &blocks, std::vector<CAddress>& vAddr);
#endif #endif

3
db.cpp

@ -84,7 +84,7 @@ int CAddrDb::Lookup_(const CService &ip) {
return -1; return -1;
} }
void CAddrDb::Good_(const CService &addr, int clientV, std::string clientSV) { void CAddrDb::Good_(const CService &addr, int clientV, std::string clientSV, int blocks) {
int id = Lookup_(addr); int id = Lookup_(addr);
if (id == -1) return; if (id == -1) return;
unkId.erase(id); unkId.erase(id);
@ -92,6 +92,7 @@ void CAddrDb::Good_(const CService &addr, int clientV, std::string clientSV) {
CAddrInfo &info = idToInfo[id]; CAddrInfo &info = idToInfo[id];
info.clientVersion = clientV; info.clientVersion = clientV;
info.clientSubVersion = clientSV; info.clientSubVersion = clientSV;
info.blocks = blocks;
info.Update(true); info.Update(true);
if (info.IsGood() && goodId.count(id)==0) { if (info.IsGood() && goodId.count(id)==0) {
goodId.insert(id); goodId.insert(id);

17
db.h

@ -46,6 +46,7 @@ class CAddrReport {
public: public:
CService ip; CService ip;
int clientVersion; int clientVersion;
int blocks;
double uptime[5]; double uptime[5];
std::string clientSubVersion; std::string clientSubVersion;
}; };
@ -64,17 +65,19 @@ private:
CAddrStat stat1W; CAddrStat stat1W;
CAddrStat stat1M; CAddrStat stat1M;
int clientVersion; int clientVersion;
int blocks;
int total; int total;
int success; int success;
std::string clientSubVersion; std::string clientSubVersion;
public: public:
CAddrInfo() : services(0), lastTry(0), ourLastTry(0), ignoreTill(0), clientVersion(0), total(0), success(0) {} CAddrInfo() : services(0), lastTry(0), ourLastTry(0), ignoreTill(0), clientVersion(0), blocks(0), total(0), success(0) {}
CAddrReport GetReport() const { CAddrReport GetReport() const {
CAddrReport ret; CAddrReport ret;
ret.ip = ip; ret.ip = ip;
ret.clientVersion = clientVersion; ret.clientVersion = clientVersion;
ret.clientSubVersion = clientSubVersion; ret.clientSubVersion = clientSubVersion;
ret.blocks = blocks;
ret.uptime[0] = stat2H.reliability; ret.uptime[0] = stat2H.reliability;
ret.uptime[1] = stat8H.reliability; ret.uptime[1] = stat8H.reliability;
ret.uptime[2] = stat1D.reliability; ret.uptime[2] = stat1D.reliability;
@ -118,7 +121,7 @@ public:
friend class CAddrDb; friend class CAddrDb;
IMPLEMENT_SERIALIZE ( IMPLEMENT_SERIALIZE (
unsigned char version = 2; unsigned char version = 3;
READWRITE(version); READWRITE(version);
READWRITE(ip); READWRITE(ip);
READWRITE(services); READWRITE(services);
@ -142,6 +145,8 @@ public:
READWRITE(clientVersion); READWRITE(clientVersion);
if (version >= 2) if (version >= 2)
READWRITE(clientSubVersion); READWRITE(clientSubVersion);
if (version >= 3)
READWRITE(blocks);
} }
) )
}; };
@ -179,11 +184,11 @@ protected:
// internal routines that assume proper locks are acquired // internal routines that assume proper locks are acquired
void Add_(const CAddress &addr, bool force); // add an address void Add_(const CAddress &addr, bool force); // add an address
bool Get_(CService &ip, int& wait); // get an IP to test (must call Good_, Bad_, or Skipped_ on result afterwards) bool Get_(CService &ip, int& wait); // get an IP to test (must call Good_, Bad_, or Skipped_ on result afterwards)
void Good_(const CService &ip, int clientV, std::string clientSV); // mark an IP as good (must have been returned by Get_) void Good_(const CService &ip, int clientV, std::string clientSV, int blocks); // mark an IP as good (must have been returned by Get_)
void Bad_(const CService &ip, int ban); // mark an IP as bad (and optionally ban it) (must have been returned by Get_) void Bad_(const CService &ip, int ban); // mark an IP as bad (and optionally ban it) (must have been returned by Get_)
void Skipped_(const CService &ip); // mark an IP as skipped (must have been returned by Get_) void Skipped_(const CService &ip); // mark an IP as skipped (must have been returned by Get_)
int Lookup_(const CService &ip); // look up id of an IP int Lookup_(const CService &ip); // look up id of an IP
void GetIPs_(std::set<CNetAddr>& ips, int max, const bool* nets); // get a random set of IPs (shared lock only) void GetIPs_(std::set<CNetAddr>& ips, int max, const bool *nets); // get a random set of IPs (shared lock only)
public: public:
std::map<CService, time_t> banned; // nodes that are banned, with their unban time (a) std::map<CService, time_t> banned; // nodes that are banned, with their unban time (a)
@ -271,9 +276,9 @@ public:
for (int i=0; i<vAddr.size(); i++) for (int i=0; i<vAddr.size(); i++)
Add_(vAddr[i], fForce); Add_(vAddr[i], fForce);
} }
void Good(const CService &addr, int clientVersion, std::string clientSubVersion) { void Good(const CService &addr, int clientVersion, std::string clientSubVersion, int blocks) {
CRITICAL_BLOCK(cs) CRITICAL_BLOCK(cs)
Good_(addr, clientVersion, clientSubVersion); Good_(addr, clientVersion, clientSubVersion, blocks);
} }
void Skipped(const CService &addr) { void Skipped(const CService &addr) {
CRITICAL_BLOCK(cs) CRITICAL_BLOCK(cs)

9
main.cpp

@ -116,11 +116,12 @@ extern "C" void* ThreadCrawler(void* data) {
int ban = 0; int ban = 0;
vector<CAddress> addr; vector<CAddress> addr;
int clientV = 0; int clientV = 0;
int blocks = 0;
std::string clientSV; std::string clientSV;
bool ret = TestNode(ip,ban,clientV,clientSV,addr); bool ret = TestNode(ip,ban,clientV,clientSV,blocks,addr);
db.Add(addr); db.Add(addr);
if (ret) { if (ret) {
db.Good(ip, clientV, clientSV); db.Good(ip, clientV, clientSV, blocks);
} else { } else {
db.Bad(ip, ban); db.Bad(ip, ban);
} }
@ -256,11 +257,11 @@ extern "C" void* ThreadDumper(void*) {
FILE *d = fopen("dnsseed.dump", "w"); FILE *d = fopen("dnsseed.dump", "w");
vector<CAddrReport> v = db.GetAll(); vector<CAddrReport> v = db.GetAll();
sort(v.begin(), v.end(), StatCompare); sort(v.begin(), v.end(), StatCompare);
fprintf(d, "# address \t%%(2h)\t%%(8h)\t%%(1d)\t%%(7d)\t%%(30d)\tversion\n"); fprintf(d, "# address \t%%(2h)\t%%(8h)\t%%(1d)\t%%(7d)\t%%(30d)\tblocks\tversion\n");
double stat[5]={0,0,0,0,0}; double stat[5]={0,0,0,0,0};
for (vector<CAddrReport>::const_iterator it = v.begin(); it < v.end(); it++) { for (vector<CAddrReport>::const_iterator it = v.begin(); it < v.end(); it++) {
CAddrReport rep = *it; CAddrReport rep = *it;
fprintf(d, "%s\t%.2f%%\t%.2f%%\t%.2f%%\t%.2f%%\t%.2f%%\t%i \"%s\"\n", rep.ip.ToString().c_str(), 100.0*rep.uptime[0], 100.0*rep.uptime[1], 100.0*rep.uptime[2], 100.0*rep.uptime[3], 100.0*rep.uptime[4], rep.clientVersion, rep.clientSubVersion.c_str()); fprintf(d, "%s\t%.2f%%\t%.2f%%\t%.2f%%\t%.2f%%\t%.2f%%\t%i\t%i \"%s\"\n", rep.ip.ToString().c_str(), 100.0*rep.uptime[0], 100.0*rep.uptime[1], 100.0*rep.uptime[2], 100.0*rep.uptime[3], 100.0*rep.uptime[4], rep.blocks, rep.clientVersion, rep.clientSubVersion.c_str());
stat[0] += rep.uptime[0]; stat[0] += rep.uptime[0];
stat[1] += rep.uptime[1]; stat[1] += rep.uptime[1];
stat[2] += rep.uptime[2]; stat[2] += rep.uptime[2];

Loading…
Cancel
Save