// serialize addresses, checksum data up to that point, then append csum
CDataStream ssPeers(SER_DISK, CLIENT_VERSION);
- ssPeers << FLATDATA(pchMessageStart);
+ ssPeers << nNetworkID;
ssPeers << addr;
uint256 hash = Hash(ssPeers.begin(), ssPeers.end());
ssPeers << hash;
if (hashIn != hashTmp)
return error("CAddrman::Read() : checksum mismatch; data corrupted");
- unsigned char pchMsgTmp[4];
+ uint32_t nMsgNetID;
try {
// de-serialize file header (pchMessageStart magic number) and
- ssPeers >> FLATDATA(pchMsgTmp);
-
+ ssPeers >> nMsgNetID;
// verify the network matches ours
- if (memcmp(pchMsgTmp, pchMessageStart, sizeof(pchMsgTmp)))
+ if (nMsgNetID != nNetworkID)
return error("CAddrman::Read() : invalid network magic number");
-
// de-serialize address data into one CAddrMan object
ssPeers >> addr;
}
{
if (fTestNet)
{
- pchMessageStart[0] = 0xcd;
- pchMessageStart[1] = 0xf2;
- pchMessageStart[2] = 0xc0;
- pchMessageStart[3] = 0xef;
+ nNetworkID = 0xefc0f2cd;
bnProofOfWorkLimit = bnProofOfWorkLimitTestNet; // 16 bits PoW target limit for testnet
nStakeMinAge = 2 * nOneHour; // test net min age is 2 hours
auto nBlockLength = *reinterpret_cast<const uint32_t*>(&(*(it+4)));
auto SeekToNext = [&pchData, &it, &nPos, &nBlockLength]() {
auto previt = it;
- it = search(it+8, pchData.end(), BEGIN(pchMessageStart), END(pchMessageStart));
+ it = search(it+8, pchData.end(), BEGIN(nNetworkID), END(nNetworkID));
if (it != pchData.end())
nPos += (it - previt);
};
return true;
}
-
-
-
-// The message start string is designed to be unlikely to occur in normal data.
-// The characters are rarely used upper ASCII, not valid as UTF-8, and produce
-// a large 4-byte int at any alignment.
-uint8_t pchMessageStart[4] = { 0xe4, 0xe8, 0xe9, 0xe5 };
-
bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
{
static map<CService, CPubKey> mapReuseKey;
break;
// Scan for message start
- CDataStream::iterator pstart = search(vRecv.begin(), vRecv.end(), BEGIN(pchMessageStart), END(pchMessageStart));
+ CDataStream::iterator pstart = search(vRecv.begin(), vRecv.end(), BEGIN(nNetworkID), END(nNetworkID));
int nHeaderSize = vRecv.GetSerializeSize(CMessageHeader());
if (vRecv.end() - pstart < nHeaderSize)
{
extern int64_t nTimeBestReceived;
extern CCriticalSection cs_setpwalletRegistered;
extern set<CWallet*> setpwalletRegistered;
-extern uint8_t pchMessageStart[4];
+extern uint32_t nNetworkID;
extern map<uint256, CBlock*> mapOrphanBlocks;
// Settings
// Write index header
unsigned int nSize = fileout.GetSerializeSize(*this);
- fileout << FLATDATA(pchMessageStart) << nSize;
+ fileout << nNetworkID << nSize;
// Write block
long fileOutPos = ftell(fileout);
# include <arpa/inet.h>
#endif
+// Network ID, previously known as pchMessageStart
+uint32_t nNetworkID = 0xe5e9e8e4;
+
static const std::vector<const char*> vpszTypeName = { "ERROR", "tx", "block" };
CMessageHeader::CMessageHeader() : nMessageSize(std::numeric_limits<uint32_t>::max()), nChecksum(0)
{
- memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart));
+ nNetworkID = ::nNetworkID;
memset(pchCommand, 0, sizeof(pchCommand));
pchCommand[1] = 1;
}
CMessageHeader::CMessageHeader(const char* pszCommand, unsigned int nMessageSizeIn) : nMessageSize(nMessageSizeIn), nChecksum(0)
{
- memcpy(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart));
+ nNetworkID = ::nNetworkID;
strncpy(pchCommand, pszCommand, COMMAND_SIZE);
}
bool CMessageHeader::IsValid() const
{
// Check start string
- if (memcmp(pchMessageStart, ::pchMessageStart, sizeof(pchMessageStart)) != 0)
+ if (nNetworkID != ::nNetworkID)
return false;
// Check the command string for errors
#include <vector>
#include "uint256.h"
+extern uint32_t nNetworkID;
extern bool fTestNet;
inline uint16_t GetDefaultPort()
{
return static_cast<uint16_t>(fTestNet ? 17777 : 7777);
}
-extern uint8_t pchMessageStart[4];
-
/** Message header.
- * (4) message start.
+ * (4) network identifier.
* (12) command.
* (4) size.
* (4) checksum.
IMPLEMENT_SERIALIZE
(
- READWRITE(FLATDATA(pchMessageStart));
+ READWRITE(nNetworkID);
READWRITE(FLATDATA(pchCommand));
READWRITE(nMessageSize);
READWRITE(nChecksum);
// TODO: make private (improves encapsulation)
public:
enum {
- MESSAGE_START_SIZE=sizeof(::pchMessageStart),
+ MESSAGE_START_SIZE=4,
COMMAND_SIZE=12,
- MESSAGE_SIZE_SIZE=sizeof(int),
- CHECKSUM_SIZE=sizeof(int),
+ MESSAGE_SIZE_SIZE=4,
+ CHECKSUM_SIZE=4,
MESSAGE_SIZE_OFFSET=MESSAGE_START_SIZE+COMMAND_SIZE,
CHECKSUM_OFFSET=MESSAGE_SIZE_OFFSET+MESSAGE_SIZE_SIZE
};
- char pchMessageStart[MESSAGE_START_SIZE];
+ uint32_t nNetworkID;
char pchCommand[COMMAND_SIZE];
- unsigned int nMessageSize;
- unsigned int nChecksum;
+ uint32_t nMessageSize;
+ uint32_t nChecksum;
};
/** nServices flags */