Changeset View
Changeset View
Standalone View
Standalone View
src/seeder/bitcoin.cpp
#include "bitcoin.h" | #include "bitcoin.h" | ||||
#include "db.h" | #include "db.h" | ||||
#include "netbase.h" | #include "netbase.h" | ||||
#include "serialize.h" | #include "serialize.h" | ||||
#include "streams.h" | #include "streams.h" | ||||
#include "uint256.h" | #include "uint256.h" | ||||
#include <algorithm> | #include <algorithm> | ||||
#define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL | #define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL | ||||
static const uint32_t allones(-1); | |||||
class CNode { | class CNode { | ||||
SOCKET sock; | SOCKET sock; | ||||
CDataStream vSend; | CDataStream vSend; | ||||
CDataStream vRecv; | CDataStream vRecv; | ||||
unsigned int nHeaderStart; | uint32_t nHeaderStart; | ||||
unsigned int nMessageStart; | uint32_t nMessageStart; | ||||
int nVersion; | int nVersion; | ||||
std::string strSubVer; | std::string strSubVer; | ||||
int nStartingHeight; | int nStartingHeight; | ||||
std::vector<CAddress> *vAddr; | std::vector<CAddress> *vAddr; | ||||
int ban; | int ban; | ||||
int64_t doneAfter; | int64_t doneAfter; | ||||
CAddress you; | CAddress you; | ||||
int GetTimeout() { return you.IsTor() ? 120 : 30; } | int GetTimeout() { return you.IsTor() ? 120 : 30; } | ||||
void BeginMessage(const char *pszCommand) { | void BeginMessage(const char *pszCommand) { | ||||
if (nHeaderStart != -1) AbortMessage(); | if (nHeaderStart != allones) { | ||||
AbortMessage(); | |||||
} | |||||
nHeaderStart = vSend.size(); | nHeaderStart = vSend.size(); | ||||
vSend << CMessageHeader(pszCommand, 0); | vSend << CMessageHeader(pszCommand, 0); | ||||
nMessageStart = vSend.size(); | nMessageStart = vSend.size(); | ||||
// printf("%s: SEND %s\n", ToString(you).c_str(), pszCommand); | // printf("%s: SEND %s\n", ToString(you).c_str(), pszCommand); | ||||
} | } | ||||
void AbortMessage() { | void AbortMessage() { | ||||
if (nHeaderStart == -1) return; | if (nHeaderStart == allones) { | ||||
return; | |||||
} | |||||
vSend.resize(nHeaderStart); | vSend.resize(nHeaderStart); | ||||
nHeaderStart = -1; | nHeaderStart = allones; | ||||
nMessageStart = -1; | nMessageStart = allones; | ||||
} | } | ||||
void EndMessage() { | void EndMessage() { | ||||
if (nHeaderStart == -1) return; | if (nHeaderStart == allones) { | ||||
unsigned int nSize = vSend.size() - nMessageStart; | return; | ||||
} | |||||
uint32_t nSize = vSend.size() - nMessageStart; | |||||
memcpy((char *)&vSend[nHeaderStart] + | memcpy((char *)&vSend[nHeaderStart] + | ||||
offsetof(CMessageHeader, nMessageSize), | offsetof(CMessageHeader, nMessageSize), | ||||
&nSize, sizeof(nSize)); | &nSize, sizeof(nSize)); | ||||
if (vSend.GetVersion() >= 209) { | if (vSend.GetVersion() >= 209) { | ||||
uint256 hash = Hash(vSend.begin() + nMessageStart, vSend.end()); | uint256 hash = Hash(vSend.begin() + nMessageStart, vSend.end()); | ||||
unsigned int nChecksum = 0; | unsigned int nChecksum = 0; | ||||
memcpy(&nChecksum, &hash, sizeof(nChecksum)); | memcpy(&nChecksum, &hash, sizeof(nChecksum)); | ||||
assert(nMessageStart - nHeaderStart >= | assert(nMessageStart - nHeaderStart >= | ||||
offsetof(CMessageHeader, nChecksum) + sizeof(nChecksum)); | offsetof(CMessageHeader, nChecksum) + sizeof(nChecksum)); | ||||
memcpy((char *)&vSend[nHeaderStart] + | memcpy((char *)&vSend[nHeaderStart] + | ||||
offsetof(CMessageHeader, nChecksum), | offsetof(CMessageHeader, nChecksum), | ||||
&nChecksum, sizeof(nChecksum)); | &nChecksum, sizeof(nChecksum)); | ||||
} | } | ||||
nHeaderStart = -1; | nHeaderStart = allones; | ||||
nMessageStart = -1; | nMessageStart = allones; | ||||
} | } | ||||
void Send() { | void Send() { | ||||
if (sock == INVALID_SOCKET) return; | if (sock == INVALID_SOCKET) { | ||||
if (vSend.empty()) return; | return; | ||||
} | |||||
if (vSend.empty()) { | |||||
return; | |||||
} | |||||
int nBytes = send(sock, &vSend[0], vSend.size(), 0); | int nBytes = send(sock, &vSend[0], vSend.size(), 0); | ||||
if (nBytes > 0) { | if (nBytes > 0) { | ||||
vSend.erase(vSend.begin(), vSend.begin() + nBytes); | vSend.erase(vSend.begin(), vSend.begin() + nBytes); | ||||
} else { | } else { | ||||
close(sock); | close(sock); | ||||
sock = INVALID_SOCKET; | sock = INVALID_SOCKET; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | bool ProcessMessage(std::string strCommand, CDataStream &vRecv) { | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
bool ProcessMessages() { | bool ProcessMessages() { | ||||
if (vRecv.empty()) return false; | if (vRecv.empty()) { | ||||
return false; | |||||
} | |||||
do { | do { | ||||
CDataStream::iterator pstart = | CDataStream::iterator pstart = | ||||
search(vRecv.begin(), vRecv.end(), BEGIN(pchMessageStart), | search(vRecv.begin(), vRecv.end(), BEGIN(pchMessageStart), | ||||
END(pchMessageStart)); | END(pchMessageStart)); | ||||
int nHeaderSize = GetSerializeSize( | uint32_t nHeaderSize = GetSerializeSize( | ||||
CMessageHeader(), vRecv.GetType(), vRecv.GetVersion()); | CMessageHeader(), vRecv.GetType(), vRecv.GetVersion()); | ||||
if (vRecv.end() - pstart < nHeaderSize) { | if (vRecv.end() - pstart < nHeaderSize) { | ||||
if (vRecv.size() > nHeaderSize) { | if (vRecv.size() > nHeaderSize) { | ||||
vRecv.erase(vRecv.begin(), vRecv.end() - nHeaderSize); | vRecv.erase(vRecv.begin(), vRecv.end() - nHeaderSize); | ||||
} | } | ||||
break; | break; | ||||
} | } | ||||
vRecv.erase(vRecv.begin(), pstart); | vRecv.erase(vRecv.begin(), pstart); | ||||
Show All 33 Lines | bool ProcessMessages() { | ||||
// printf("%s: done processing %s\n", ToString(you).c_str(), | // printf("%s: done processing %s\n", ToString(you).c_str(), | ||||
// strCommand.c_str()); | // strCommand.c_str()); | ||||
} while (1); | } while (1); | ||||
return false; | return false; | ||||
} | } | ||||
public: | public: | ||||
CNode(const CService &ip, std::vector<CAddress> *vAddrIn) | CNode(const CService &ip, std::vector<CAddress> *vAddrIn) | ||||
: vSend(SER_NETWORK, 0), vRecv(SER_NETWORK, 0), you(ip), | : vSend(SER_NETWORK, 0), vRecv(SER_NETWORK, 0), nHeaderStart(-1), | ||||
nHeaderStart(-1), nMessageStart(-1), vAddr(vAddrIn), ban(0), | nMessageStart(-1), nVersion(0), vAddr(vAddrIn), ban(0), doneAfter(0), | ||||
doneAfter(0), nVersion(0) { | you(ip) { | ||||
if (time(nullptr) > 1329696000) { | if (time(nullptr) > 1329696000) { | ||||
vSend.SetVersion(209); | vSend.SetVersion(209); | ||||
vRecv.SetVersion(209); | vRecv.SetVersion(209); | ||||
} | } | ||||
} | } | ||||
bool Run() { | bool Run() { | ||||
bool res = true; | bool res = true; | ||||
▲ Show 20 Lines • Show All 91 Lines • Show Last 20 Lines |