/ src / node / connection_types.h
connection_types.h
 1  // Copyright (c) 2022 The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #ifndef BITCOIN_NODE_CONNECTION_TYPES_H
 6  #define BITCOIN_NODE_CONNECTION_TYPES_H
 7  
 8  #include <string>
 9  #include <stdint.h>
10  
11  /** Different types of connections to a peer. This enum encapsulates the
12   * information we have available at the time of opening or accepting the
13   * connection. Aside from INBOUND, all types are initiated by us.
14   *
15   * If adding or removing types, please update CONNECTION_TYPE_DOC in
16   * src/rpc/net.cpp and src/qt/rpcconsole.cpp, as well as the descriptions in
17   * src/qt/guiutil.cpp and src/bitcoin-cli.cpp::NetinfoRequestHandler. */
18  enum class ConnectionType {
19      /**
20       * Inbound connections are those initiated by a peer. This is the only
21       * property we know at the time of connection, until P2P messages are
22       * exchanged.
23       */
24      INBOUND,
25  
26      /**
27       * These are the default connections that we use to connect with the
28       * network. There is no restriction on what is relayed; by default we relay
29       * blocks, addresses & transactions. We automatically attempt to open
30       * MAX_OUTBOUND_FULL_RELAY_CONNECTIONS using addresses from our AddrMan.
31       */
32      OUTBOUND_FULL_RELAY,
33  
34  
35      /**
36       * We open manual connections to addresses that users explicitly requested
37       * via the addnode RPC or the -addnode/-connect configuration options. Even if a
38       * manual connection is misbehaving, we do not automatically disconnect or
39       * add it to our discouragement filter.
40       */
41      MANUAL,
42  
43      /**
44       * Feeler connections are short-lived connections made to check that a node
45       * is alive. They can be useful for:
46       * - test-before-evict: if one of the peers is considered for eviction from
47       *   our AddrMan because another peer is mapped to the same slot in the tried table,
48       *   evict only if this longer-known peer is offline.
49       * - move node addresses from New to Tried table, so that we have more
50       *   connectable addresses in our AddrMan.
51       * Note that in the literature ("Eclipse Attacks on Bitcoin’s Peer-to-Peer Network")
52       * only the latter feature is referred to as "feeler connections",
53       * although in our codebase feeler connections encompass test-before-evict as well.
54       * We make these connections approximately every FEELER_INTERVAL:
55       * first we resolve previously found collisions if they exist (test-before-evict),
56       * otherwise we connect to a node from the new table.
57       */
58      FEELER,
59  
60      /**
61       * We use block-relay-only connections to help prevent against partition
62       * attacks. By not relaying transactions or addresses, these connections
63       * are harder to detect by a third party, thus helping obfuscate the
64       * network topology. We automatically attempt to open
65       * MAX_BLOCK_RELAY_ONLY_ANCHORS using addresses from our anchors.dat. Then
66       * addresses from our AddrMan if MAX_BLOCK_RELAY_ONLY_CONNECTIONS
67       * isn't reached yet.
68       */
69      BLOCK_RELAY,
70  
71      /**
72       * AddrFetch connections are short lived connections used to solicit
73       * addresses from peers. These are initiated to addresses submitted via the
74       * -seednode command line argument, or under certain conditions when the
75       * AddrMan is empty.
76       */
77      ADDR_FETCH,
78  };
79  
80  /** Convert ConnectionType enum to a string value */
81  std::string ConnectionTypeAsString(ConnectionType conn_type);
82  
83  /** Transport layer version */
84  enum class TransportProtocolType : uint8_t {
85      DETECTING, //!< Peer could be v1 or v2
86      V1, //!< Unencrypted, plaintext protocol
87      V2, //!< BIP324 protocol
88  };
89  
90  /** Convert TransportProtocolType enum to a string value */
91  std::string TransportTypeAsString(TransportProtocolType transport_type);
92  
93  #endif // BITCOIN_NODE_CONNECTION_TYPES_H