Dogecoin Core  1.14.2
P2P Digital Currency
protocol.h
Go to the documentation of this file.
1 // Copyright (c) 2009-2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2016 The Bitcoin Core developers
3 // Distributed under the MIT software license, see the accompanying
4 // file COPYING 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 BITCOIN_PROTOCOL_H
11 #define BITCOIN_PROTOCOL_H
12 
13 #include "netaddress.h"
14 #include "serialize.h"
15 #include "uint256.h"
16 #include "version.h"
17 
18 #include <stdint.h>
19 #include <string>
20 
28 {
29 public:
30  enum {
35 
39  };
40  typedef unsigned char MessageStartChars[MESSAGE_START_SIZE];
41 
42  CMessageHeader(const MessageStartChars& pchMessageStartIn);
43  CMessageHeader(const MessageStartChars& pchMessageStartIn, const char* pszCommand, unsigned int nMessageSizeIn);
44 
45  std::string GetCommand() const;
46  bool IsValid(const MessageStartChars& messageStart) const;
47 
49 
50  template <typename Stream, typename Operation>
51  inline void SerializationOp(Stream& s, Operation ser_action)
52  {
57  }
58 
61  uint32_t nMessageSize;
63 };
64 
69 namespace NetMsgType {
70 
76 extern const char *VERSION;
82 extern const char *VERACK;
88 extern const char *ADDR;
94 extern const char *INV;
99 extern const char *GETDATA;
106 extern const char *MERKLEBLOCK;
112 extern const char *GETBLOCKS;
119 extern const char *GETHEADERS;
124 extern const char *TX;
131 extern const char *HEADERS;
136 extern const char *BLOCK;
142 extern const char *GETADDR;
149 extern const char *MEMPOOL;
155 extern const char *PING;
162 extern const char *PONG;
169 extern const char *ALERT;
176 extern const char *NOTFOUND;
185 extern const char *FILTERLOAD;
194 extern const char *FILTERADD;
203 extern const char *FILTERCLEAR;
210 extern const char *REJECT;
217 extern const char *SENDHEADERS;
223 extern const char *FEEFILTER;
231 extern const char *SENDCMPCT;
237 extern const char *CMPCTBLOCK;
243 extern const char *GETBLOCKTXN;
249 extern const char *BLOCKTXN;
250 };
251 
252 /* Get a vector of all valid message types (see above) */
253 const std::vector<std::string> &getAllNetMessageTypes();
254 
256 enum ServiceFlags : uint64_t {
257  // Nothing
259  // NODE_NETWORK means that the node is capable of serving the block chain. It is currently
260  // set by all Bitcoin Core nodes, and is unset by SPV clients or other peers that just want
261  // network services but don't provide them.
262  NODE_NETWORK = (1 << 0),
263  // NODE_GETUTXO means the node is capable of responding to the getutxo protocol request.
264  // Bitcoin Core does not support this but a patch set called Bitcoin XT does.
265  // See BIP 64 for details on how this is implemented.
266  NODE_GETUTXO = (1 << 1),
267  // NODE_BLOOM means the node is capable and willing to handle bloom-filtered connections.
268  // Bitcoin Core nodes used to support this by default, without advertising this bit,
269  // but no longer do as of protocol version 70011 (= NO_BLOOM_VERSION)
270  NODE_BLOOM = (1 << 2),
271  // NODE_WITNESS indicates that a node can be asked for blocks and transactions including
272  // witness data.
273  NODE_WITNESS = (1 << 3),
274  // NODE_XTHIN means the node supports Xtreme Thinblocks
275  // If this is turned off then the node will not service nor make xthin requests
276  NODE_XTHIN = (1 << 4),
277 
278  // Bits 24-31 are reserved for temporary experiments. Just pick a bit that
279  // isn't getting used, or one not being used much, and notify the
280  // bitcoin-development mailing list. Remember that service bits are just
281  // unauthenticated advertisements, so your code must be robust against
282  // collisions and other cases where nodes may be advertising a service they
283  // do not actually support. Other service bits should be allocated via the
284  // BIP process.
285 };
286 
288 class CAddress : public CService
289 {
290 public:
291  CAddress();
292  explicit CAddress(CService ipIn, ServiceFlags nServicesIn);
293 
294  void Init();
295 
297 
298  template <typename Stream, typename Operation>
299  inline void SerializationOp(Stream& s, Operation ser_action)
300  {
301  if (ser_action.ForRead())
302  Init();
303  int nVersion = s.GetVersion();
304  if (s.GetType() & SER_DISK)
305  READWRITE(nVersion);
306  if ((s.GetType() & SER_DISK) ||
307  (nVersion >= CADDR_TIME_VERSION && !(s.GetType() & SER_GETHASH)))
308  READWRITE(nTime);
309  uint64_t nServicesInt = nServices;
310  READWRITE(nServicesInt);
311  nServices = (ServiceFlags)nServicesInt;
312  READWRITE(*(CService*)this);
313  }
314 
315  // TODO: make private (improves encapsulation)
316 public:
318 
319  // disk and network only
320  unsigned int nTime;
321 };
322 
324 const uint32_t MSG_WITNESS_FLAG = 1 << 30;
325 const uint32_t MSG_TYPE_MASK = 0xffffffff >> 2;
326 
332 {
334  MSG_TX = 1,
336  // The following can only occur in getdata. Invs always use TX or BLOCK.
342 };
343 
345 class CInv
346 {
347 public:
348  CInv();
349  CInv(int typeIn, const uint256& hashIn);
350 
352 
353  template <typename Stream, typename Operation>
354  inline void SerializationOp(Stream& s, Operation ser_action)
355  {
356  READWRITE(type);
357  READWRITE(hash);
358  }
359 
360  friend bool operator<(const CInv& a, const CInv& b);
361 
362  std::string GetCommand() const;
363  std::string ToString() const;
364 
365  // TODO: make private (improves encapsulation)
366 public:
367  int type;
369 };
370 
371 #endif // BITCOIN_PROTOCOL_H
A CService with information about it as peer.
Definition: protocol.h:289
ServiceFlags nServices
Definition: protocol.h:317
ADD_SERIALIZE_METHODS
Definition: protocol.h:296
void Init()
Definition: protocol.cpp:144
unsigned int nTime
Definition: protocol.h:320
void SerializationOp(Stream &s, Operation ser_action)
Definition: protocol.h:299
inv message data
Definition: protocol.h:346
friend bool operator<(const CInv &a, const CInv &b)
Definition: protocol.cpp:162
int type
Definition: protocol.h:367
ADD_SERIALIZE_METHODS
Definition: protocol.h:351
std::string ToString() const
Definition: protocol.cpp:184
std::string GetCommand() const
Definition: protocol.cpp:167
CInv()
Definition: protocol.cpp:150
void SerializationOp(Stream &s, Operation ser_action)
Definition: protocol.h:354
uint256 hash
Definition: protocol.h:368
Message header.
Definition: protocol.h:28
unsigned char MessageStartChars[MESSAGE_START_SIZE]
Definition: protocol.h:40
void SerializationOp(Stream &s, Operation ser_action)
Definition: protocol.h:51
@ MESSAGE_SIZE_SIZE
Definition: protocol.h:33
@ MESSAGE_START_SIZE
Definition: protocol.h:31
@ MESSAGE_SIZE_OFFSET
Definition: protocol.h:36
char pchMessageStart[MESSAGE_START_SIZE]
Definition: protocol.h:59
bool IsValid(const MessageStartChars &messageStart) const
Definition: protocol.cpp:101
char pchCommand[COMMAND_SIZE]
Definition: protocol.h:60
uint8_t pchChecksum[CHECKSUM_SIZE]
Definition: protocol.h:62
std::string GetCommand() const
Definition: protocol.cpp:96
uint32_t nMessageSize
Definition: protocol.h:61
CMessageHeader(const MessageStartChars &pchMessageStartIn)
Definition: protocol.cpp:79
A combination of a network address (CNetAddr) and a (TCP) port.
Definition: netaddress.h:134
256-bit opaque blob.
Definition: uint256.h:123
Bitcoin protocol message types.
Definition: protocol.cpp:15
const char * FILTERLOAD
The filterload message tells the receiving peer to filter all relayed transactions and requested merk...
Definition: protocol.cpp:33
const char * BLOCK
The block message transmits a single serialized block.
Definition: protocol.cpp:26
const char * FILTERCLEAR
The filterclear message tells the receiving peer to remove a previously-set bloom filter.
Definition: protocol.cpp:35
const char * HEADERS
The headers message sends one or more block headers to a node which previously requested certain head...
Definition: protocol.cpp:25
const char * SENDHEADERS
Indicates that a node prefers to receive new block announcements via a "headers" message rather than ...
Definition: protocol.cpp:37
const char * PONG
The pong message replies to a ping message, proving to the pinging node that the ponging node is stil...
Definition: protocol.cpp:30
const char * SENDCMPCT
Contains a 1-byte bool and 8-byte LE version number.
Definition: protocol.cpp:39
const char * GETADDR
The getaddr message requests an addr message from the receiving node, preferably one with lots of IP ...
Definition: protocol.cpp:27
const char * NOTFOUND
The notfound message is a reply to a getdata message which requested an object the receiving node doe...
Definition: protocol.cpp:32
const char * CMPCTBLOCK
Contains a CBlockHeaderAndShortTxIDs object - providing a header and list of "short txids".
Definition: protocol.cpp:40
const char * MEMPOOL
The mempool message requests the TXIDs of transactions that the receiving node has verified as valid ...
Definition: protocol.cpp:28
const char * TX
The tx message transmits a single transaction.
Definition: protocol.cpp:24
const char * FILTERADD
The filteradd message tells the receiving peer to add a single element to a previously-set bloom filt...
Definition: protocol.cpp:34
const char * ADDR
The addr (IP address) message relays connection information for peers on the network.
Definition: protocol.cpp:18
const char * VERSION
The version message provides information about the transmitting node to the receiving node at the beg...
Definition: protocol.cpp:16
const char * GETBLOCKS
The getblocks message requests an inv message that provides block header hashes starting from a parti...
Definition: protocol.cpp:22
const char * FEEFILTER
The feefilter message tells the receiving peer not to inv us any txs which do not meet the specified ...
Definition: protocol.cpp:38
const char * GETHEADERS
The getheaders message requests a headers message that provides block headers starting from a particu...
Definition: protocol.cpp:23
const char * GETDATA
The getdata message requests one or more data objects from another node.
Definition: protocol.cpp:20
const char * VERACK
The verack message acknowledges a previously-received version message, informing the connecting node ...
Definition: protocol.cpp:17
const char * BLOCKTXN
Contains a BlockTransactions.
Definition: protocol.cpp:42
const char * ALERT
The alert message warns nodes of problems that may affect them or the rest of the network.
Definition: protocol.cpp:31
const char * PING
The ping message is sent periodically to help confirm that the receiving peer is still connected.
Definition: protocol.cpp:29
const char * MERKLEBLOCK
The merkleblock message is a reply to a getdata message which requested a block using the inventory t...
Definition: protocol.cpp:21
const char * REJECT
The reject message informs the receiving node that one of its previous messages has been rejected.
Definition: protocol.cpp:36
const char * GETBLOCKTXN
Contains a BlockTransactionsRequest Peer should respond with "blocktxn" message.
Definition: protocol.cpp:41
const char * INV
The inv message (inventory message) transmits one or more inventories of objects known to the transmi...
Definition: protocol.cpp:19
const std::vector< std::string > & getAllNetMessageTypes()
Definition: protocol.cpp:193
const uint32_t MSG_WITNESS_FLAG
getdata message type flags
Definition: protocol.h:324
GetDataMsg
getdata / inv message types.
Definition: protocol.h:332
@ MSG_TX
Definition: protocol.h:334
@ MSG_FILTERED_BLOCK
Defined in BIP37.
Definition: protocol.h:337
@ MSG_BLOCK
Definition: protocol.h:335
@ UNDEFINED
Definition: protocol.h:333
@ MSG_CMPCT_BLOCK
Defined in BIP152.
Definition: protocol.h:338
@ MSG_WITNESS_BLOCK
Defined in BIP144.
Definition: protocol.h:339
@ MSG_WITNESS_TX
Defined in BIP144.
Definition: protocol.h:340
@ MSG_FILTERED_WITNESS_BLOCK
Definition: protocol.h:341
const uint32_t MSG_TYPE_MASK
Definition: protocol.h:325
ServiceFlags
nServices flags
Definition: protocol.h:256
@ NODE_NONE
Definition: protocol.h:258
@ NODE_GETUTXO
Definition: protocol.h:266
@ NODE_WITNESS
Definition: protocol.h:273
@ NODE_BLOOM
Definition: protocol.h:270
@ NODE_NETWORK
Definition: protocol.h:262
@ NODE_XTHIN
Definition: protocol.h:276
#define READWRITE(obj)
Definition: serialize.h:151
@ SER_DISK
Definition: serialize.h:147
@ SER_GETHASH
Definition: serialize.h:148
#define FLATDATA(obj)
Definition: serialize.h:347