connection_types.h raw

   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
 101