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> | ||||
// Weither we are on testnet or mainnet. | // Weither we are on testnet or mainnet. | ||||
bool fTestNet; | bool fTestNet; | ||||
// The network magic to use. | // The network magic to use. | ||||
CSeederMessageHeader::MessageMagic netMagic = {0xe3, 0xe1, 0xf3, 0xe8}; | CMessageHeader::MessageMagic netMagic = {0xe3, 0xe1, 0xf3, 0xe8}; | ||||
#define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL | #define BITCOIN_SEED_NONCE 0x0539a019ca550825ULL | ||||
static const uint32_t allones(-1); | static const uint32_t allones(-1); | ||||
class CNode { | class CNode { | ||||
SOCKET sock; | SOCKET sock; | ||||
CDataStream vSend; | CDataStream vSend; | ||||
Show All 10 Lines | class CNode { | ||||
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 != allones) { | if (nHeaderStart != allones) { | ||||
AbortMessage(); | AbortMessage(); | ||||
} | } | ||||
nHeaderStart = vSend.size(); | nHeaderStart = vSend.size(); | ||||
vSend << CSeederMessageHeader(pszCommand, 0); | vSend << CMessageHeader(netMagic, 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 == allones) { | if (nHeaderStart == allones) { | ||||
return; | return; | ||||
} | } | ||||
vSend.resize(nHeaderStart); | vSend.resize(nHeaderStart); | ||||
nHeaderStart = allones; | nHeaderStart = allones; | ||||
nMessageStart = allones; | nMessageStart = allones; | ||||
} | } | ||||
void EndMessage() { | void EndMessage() { | ||||
if (nHeaderStart == allones) { | if (nHeaderStart == allones) { | ||||
return; | return; | ||||
} | } | ||||
uint32_t nSize = vSend.size() - nMessageStart; | uint32_t nSize = vSend.size() - nMessageStart; | ||||
memcpy((char *)&vSend[nHeaderStart] + | memcpy((char *)&vSend[nHeaderStart] + | ||||
offsetof(CSeederMessageHeader, 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(CSeederMessageHeader, nChecksum) + | offsetof(CMessageHeader, pchChecksum) + sizeof(nChecksum)); | ||||
sizeof(nChecksum)); | |||||
memcpy((char *)&vSend[nHeaderStart] + | memcpy((char *)&vSend[nHeaderStart] + | ||||
offsetof(CSeederMessageHeader, nChecksum), | offsetof(CMessageHeader, pchChecksum), | ||||
&nChecksum, sizeof(nChecksum)); | &nChecksum, sizeof(nChecksum)); | ||||
} | } | ||||
nHeaderStart = allones; | nHeaderStart = allones; | ||||
nMessageStart = allones; | nMessageStart = allones; | ||||
} | } | ||||
void Send() { | void Send() { | ||||
if (sock == INVALID_SOCKET) { | if (sock == INVALID_SOCKET) { | ||||
▲ Show 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | bool ProcessMessages() { | ||||
if (vRecv.empty()) { | if (vRecv.empty()) { | ||||
return false; | return false; | ||||
} | } | ||||
do { | do { | ||||
CDataStream::iterator pstart = search( | CDataStream::iterator pstart = search( | ||||
vRecv.begin(), vRecv.end(), BEGIN(netMagic), END(netMagic)); | vRecv.begin(), vRecv.end(), BEGIN(netMagic), END(netMagic)); | ||||
uint32_t nHeaderSize = GetSerializeSize( | uint32_t nHeaderSize = GetSerializeSize( | ||||
CSeederMessageHeader(), vRecv.GetType(), vRecv.GetVersion()); | CMessageHeader(netMagic), 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); | ||||
std::vector<char> vHeaderSave(vRecv.begin(), | std::vector<char> vHeaderSave(vRecv.begin(), | ||||
vRecv.begin() + nHeaderSize); | vRecv.begin() + nHeaderSize); | ||||
CSeederMessageHeader hdr; | CMessageHeader hdr(netMagic); | ||||
vRecv >> hdr; | vRecv >> hdr; | ||||
if (!hdr.IsValid()) { | if (!hdr.IsValid(netMagic)) { | ||||
// printf("%s: BAD (invalid header)\n", ToString(you).c_str()); | // printf("%s: BAD (invalid header)\n", ToString(you).c_str()); | ||||
ban = 100000; | ban = 100000; | ||||
return true; | return true; | ||||
} | } | ||||
std::string strCommand = hdr.GetCommand(); | std::string strCommand = hdr.GetCommand(); | ||||
unsigned int nMessageSize = hdr.nMessageSize; | unsigned int nMessageSize = hdr.nMessageSize; | ||||
if (nMessageSize > MAX_SIZE) { | if (nMessageSize > MAX_SIZE) { | ||||
// printf("%s: BAD (message too large)\n", | // printf("%s: BAD (message too large)\n", | ||||
// ToString(you).c_str()); | // ToString(you).c_str()); | ||||
ban = 100000; | ban = 100000; | ||||
return true; | return true; | ||||
} | } | ||||
if (nMessageSize > vRecv.size()) { | if (nMessageSize > vRecv.size()) { | ||||
vRecv.insert(vRecv.begin(), vHeaderSave.begin(), | vRecv.insert(vRecv.begin(), vHeaderSave.begin(), | ||||
vHeaderSave.end()); | vHeaderSave.end()); | ||||
break; | break; | ||||
} | } | ||||
if (vRecv.GetVersion() >= 209) { | if (vRecv.GetVersion() >= 209) { | ||||
uint256 hash = | uint256 hash = | ||||
Hash(vRecv.begin(), vRecv.begin() + nMessageSize); | Hash(vRecv.begin(), vRecv.begin() + nMessageSize); | ||||
unsigned int nChecksum = 0; | if (memcmp(hash.begin(), hdr.pchChecksum, | ||||
memcpy(&nChecksum, &hash, sizeof(nChecksum)); | CMessageHeader::CHECKSUM_SIZE) != 0) { | ||||
if (nChecksum != hdr.nChecksum) continue; | continue; | ||||
} | |||||
} | } | ||||
CDataStream vMsg(vRecv.begin(), vRecv.begin() + nMessageSize, | CDataStream vMsg(vRecv.begin(), vRecv.begin() + nMessageSize, | ||||
vRecv.GetType(), vRecv.GetVersion()); | vRecv.GetType(), vRecv.GetVersion()); | ||||
vRecv.ignore(nMessageSize); | vRecv.ignore(nMessageSize); | ||||
if (ProcessMessage(strCommand, vMsg)) return true; | if (ProcessMessage(strCommand, vMsg)) return true; | ||||
// 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); | ||||
▲ Show 20 Lines • Show All 113 Lines • Show Last 20 Lines |