// Copyright (c) 2009-2010 Satoshi Nakamoto
-// Copyright (c) 2011 The Bitcoin developers
+// Copyright (c) 2009-2012 The Bitcoin developers
// Distributed under the MIT/X11 software license, see the accompanying
-// file license.txt or http://www.opensource.org/licenses/mit-license.php.
-
-#ifndef __cplusplus
-# error This header can only be compiled as C++.
-#endif
+// 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 <string>
+#include <limits>
+#include <vector>
+#include "uint256.h"
-//
-// Message header
-// (4) message start
-// (12) command
-// (4) size
-// (4) checksum
-
-extern unsigned char pchMessageStart[4];
+extern uint32_t nNetworkID;
+extern bool fTestNet;
+inline uint16_t GetDefaultPort()
+{
+ return static_cast<uint16_t>(fTestNet ? 17777 : 7777);
+}
+// Message header.
+// (4) network identifier.
+// (12) command.
+// (4) size.
+// (4) checksum.
class CMessageHeader
{
public:
IMPLEMENT_SERIALIZE
(
- READWRITE(FLATDATA(pchMessageStart));
+ READWRITE(nNetworkID);
READWRITE(FLATDATA(pchCommand));
READWRITE(nMessageSize);
- if (nVersion >= 209)
READWRITE(nChecksum);
)
// TODO: make private (improves encapsulation)
public:
- enum { COMMAND_SIZE=12 };
- char pchMessageStart[sizeof(::pchMessageStart)];
+ 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];
- unsigned int nMessageSize;
- unsigned int nChecksum;
+ 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<CAddress*>(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__