// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef __INCLUDED_PROTOCOL_H__ #define __INCLUDED_PROTOCOL_H__ #include "serialize.h" #include "netbase.h" #include #include #include #include "uint256.h" extern uint32_t nNetworkID; extern bool fTestNet; inline uint16_t GetDefaultPort() { return static_cast(fTestNet ? 17777 : 7777); } // Message header. // (4) network identifier. // (12) command. // (4) size. // (4) checksum. class CMessageHeader { public: CMessageHeader(); CMessageHeader(const char* pszCommand, unsigned int nMessageSizeIn); std::string GetCommand() const; bool IsValid() const; IMPLEMENT_SERIALIZE ( READWRITE(nNetworkID); READWRITE(FLATDATA(pchCommand)); READWRITE(nMessageSize); READWRITE(nChecksum); ) // TODO: make private (improves encapsulation) public: enum { MESSAGE_START_SIZE=4, COMMAND_SIZE=12, MESSAGE_SIZE_SIZE=4, CHECKSUM_SIZE=4, MESSAGE_SIZE_OFFSET=MESSAGE_START_SIZE+COMMAND_SIZE, CHECKSUM_OFFSET=MESSAGE_SIZE_OFFSET+MESSAGE_SIZE_SIZE }; uint32_t nNetworkID; char pchCommand[COMMAND_SIZE]; uint32_t nMessageSize; uint32_t nChecksum; }; /** nServices flags */ enum { NODE_NETWORK = (1 << 0) }; /** A CService with information about it as peer */ class CAddress : public CService { public: CAddress(); explicit CAddress(CService ipIn, uint64_t nServicesIn=NODE_NETWORK); IMPLEMENT_SERIALIZE ( CAddress* pthis = const_cast(this); CService* pip = (CService*)pthis; if (fRead) pthis->Init(); if (nType & SER_DISK) READWRITE(nVersion); if ((nType & SER_DISK) || (nVersion >= CADDR_TIME_VERSION && !(nType & SER_GETHASH))) READWRITE(nTime); READWRITE(nServices); READWRITE(*pip); ) // TODO: make private (improves encapsulation) public: uint64_t nServices; // disk and network only unsigned int nTime; // memory only int64_t nLastTry; }; /** inv message data */ class CInv { public: CInv(); CInv(int typeIn, const uint256& hashIn); CInv(const std::string& strType, const uint256& hashIn); IMPLEMENT_SERIALIZE ( READWRITE(type); READWRITE(hash); ) friend bool operator<(const CInv& a, const CInv& b); bool IsKnownType() const; const char* GetCommand() const; std::string ToString() const; int GetType() const { return type; } uint256 GetHash() const { return hash; } // TODO: make private (improves encapsulation) private: int type = 0; uint256 hash = 0; }; #endif // __INCLUDED_PROTOCOL_H__