Projects : bitcoin : bitcoin_db_shutdown_checkpoint_calming

bitcoin/src/protocol.h

Dir - Raw

1// Copyright (c) 2009-2010 Satoshi Nakamoto
2// Copyright (c) 2011 The Bitcoin developers
3// Distributed under the MIT/X11 software license, see the accompanying
4// file license.txt or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef __cplusplus
7# error This header can only be compiled as C++.
8#endif
9
10#ifndef __INCLUDED_PROTOCOL_H__
11#define __INCLUDED_PROTOCOL_H__
12
13#include "serialize.h"
14#include <string>
15#include "uint256.h"
16
17static inline unsigned short GetDefaultPort()
18{
19 return 8333;
20}
21
22//
23// Message header
24// (4) message start
25// (12) command
26// (4) size
27// (4) checksum
28
29extern unsigned char pchMessageStart[4];
30
31class CMessageHeader
32{
33 public:
34 CMessageHeader();
35 CMessageHeader(const char* pszCommand, unsigned int nMessageSizeIn);
36
37 std::string GetCommand() const;
38 bool IsValid() const;
39
40 IMPLEMENT_SERIALIZE
41 (
42 READWRITE(FLATDATA(pchMessageStart));
43 READWRITE(FLATDATA(pchCommand));
44 READWRITE(nMessageSize);
45 if (nVersion >= 209)
46 READWRITE(nChecksum);
47 )
48
49 // TODO: make private (improves encapsulation)
50 public:
51 enum { COMMAND_SIZE=12 };
52 char pchMessageStart[sizeof(::pchMessageStart)];
53 char pchCommand[COMMAND_SIZE];
54 unsigned int nMessageSize;
55 unsigned int nChecksum;
56};
57
58enum
59{
60 NODE_NETWORK = (1 << 0),
61};
62
63class CAddress
64{
65 public:
66 CAddress();
67 CAddress(unsigned int ipIn, unsigned short portIn=0, uint64 nServicesIn=NODE_NETWORK);
68 explicit CAddress(const struct sockaddr_in& sockaddr, uint64 nServicesIn=NODE_NETWORK);
69 explicit CAddress(const char* pszIn, int portIn, uint64 nServicesIn=NODE_NETWORK);
70 explicit CAddress(const char* pszIn, uint64 nServicesIn=NODE_NETWORK);
71 explicit CAddress(std::string strIn, int portIn, uint64 nServicesIn=NODE_NETWORK);
72 explicit CAddress(std::string strIn, uint64 nServicesIn=NODE_NETWORK);
73
74 void Init();
75
76 IMPLEMENT_SERIALIZE
77 (
78 if (fRead)
79 const_cast<CAddress*>(this)->Init();
80 if (nType & SER_DISK)
81 READWRITE(nVersion);
82 if ((nType & SER_DISK) || (nVersion >= 31402 && !(nType & SER_GETHASH)))
83 READWRITE(nTime);
84 READWRITE(nServices);
85 READWRITE(FLATDATA(pchReserved)); // for IPv6
86 READWRITE(ip);
87 READWRITE(port);
88 )
89
90 friend bool operator==(const CAddress& a, const CAddress& b);
91 friend bool operator!=(const CAddress& a, const CAddress& b);
92 friend bool operator<(const CAddress& a, const CAddress& b);
93
94 std::vector<unsigned char> GetKey() const;
95 struct sockaddr_in GetSockAddr() const;
96 bool IsIPv4() const;
97 bool IsRFC1918() const;
98 bool IsRFC3927() const;
99 bool IsLocal() const;
100 bool IsRoutable() const;
101 bool IsValid() const;
102 unsigned char GetByte(int n) const;
103 std::string ToStringIPPort() const;
104 std::string ToStringIP() const;
105 std::string ToStringPort() const;
106 std::string ToString() const;
107 void print() const;
108
109 // TODO: make private (improves encapsulation)
110 public:
111 uint64 nServices;
112 unsigned char pchReserved[12];
113 unsigned int ip;
114 unsigned short port;
115
116 // disk and network only
117 unsigned int nTime;
118
119 // memory only
120 unsigned int nLastTry;
121};
122
123class CInv
124{
125 public:
126 CInv();
127 CInv(int typeIn, const uint256& hashIn);
128 CInv(const std::string& strType, const uint256& hashIn);
129
130 IMPLEMENT_SERIALIZE
131 (
132 READWRITE(type);
133 READWRITE(hash);
134 )
135
136 friend bool operator<(const CInv& a, const CInv& b);
137
138 bool IsKnownType() const;
139 const char* GetCommand() const;
140 std::string ToString() const;
141 void print() const;
142
143 // TODO: make private (improves encapsulation)
144 public:
145 int type;
146 uint256 hash;
147};
148
149#endif // __INCLUDED_PROTOCOL_H__