Replace pchMessageStart with nNetworkID
authorCryptoManiac <balthazar@yandex.ru>
Wed, 13 Apr 2016 21:05:30 +0000 (00:05 +0300)
committerCryptoManiac <balthazar@yandex.ru>
Wed, 13 Apr 2016 21:05:30 +0000 (00:05 +0300)
src/db.cpp
src/main.cpp
src/main.h
src/protocol.cpp
src/protocol.h

index 6364223..9ee6cea 100644 (file)
@@ -486,7 +486,7 @@ bool CAddrDB::Write(const CAddrMan& addr)
 
     // 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;
@@ -549,15 +549,13 @@ bool CAddrDB::Read(CAddrMan& addr)
     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;
     }
index fd1f25f..97ac69a 100644 (file)
@@ -2741,10 +2741,7 @@ bool LoadBlockIndex(bool fAllowNew)
 {
     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
@@ -2970,7 +2967,7 @@ bool LoadExternalBlockFile(FILE* fileIn, CClientUIInterface& uiInterface)
                         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);
                         };
@@ -3128,14 +3125,6 @@ bool static AlreadyHave(CTxDB& txdb, const CInv& inv)
     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;
@@ -3824,7 +3813,7 @@ bool ProcessMessages(CNode* pfrom)
             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)
         {
index 29e33a7..c0f03df 100644 (file)
@@ -85,7 +85,7 @@ extern const string strMessageMagic;
 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
@@ -1068,7 +1068,7 @@ public:
 
         // Write index header
         unsigned int nSize = fileout.GetSerializeSize(*this);
-        fileout << FLATDATA(pchMessageStart) << nSize;
+        fileout << nNetworkID << nSize;
 
         // Write block
         long fileOutPos = ftell(fileout);
index 78654e1..46ed4ac 100644 (file)
 # 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);
 }
 
@@ -37,7 +40,7 @@ std::string CMessageHeader::GetCommand() const
 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
index 88f4e4b..06165d8 100644 (file)
 #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.
@@ -42,7 +41,7 @@ class CMessageHeader
 
         IMPLEMENT_SERIALIZE
             (
-             READWRITE(FLATDATA(pchMessageStart));
+             READWRITE(nNetworkID);
              READWRITE(FLATDATA(pchCommand));
              READWRITE(nMessageSize);
              READWRITE(nChecksum);
@@ -51,18 +50,18 @@ class CMessageHeader
     // 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 */