/ src / node / connection_types.h
connection_types.h
  1  // Copyright (c) 2022-present 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 <cstdint>
  9  #include <string>
 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       * Private broadcast connections are short-lived and only opened to
 81       * privacy networks (Tor, I2P) for relaying privacy-sensitive data (like
 82       * our own transactions) and closed afterwards.
 83       */
 84      PRIVATE_BROADCAST,
 85  };
 86  
 87  /** Convert ConnectionType enum to a string value */
 88  std::string ConnectionTypeAsString(ConnectionType conn_type);
 89  
 90  /** Transport layer version */
 91  enum class TransportProtocolType : uint8_t {
 92      DETECTING, //!< Peer could be v1 or v2
 93      V1, //!< Unencrypted, plaintext protocol
 94      V2, //!< BIP324 protocol
 95  };
 96  
 97  /** Convert TransportProtocolType enum to a string value */
 98  std::string TransportTypeAsString(TransportProtocolType transport_type);
 99  
100  #endif // BITCOIN_NODE_CONNECTION_TYPES_H