github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/peer/doc.go (about)

     1  // Copyright (c) 2015-2016 The btcsuite developers
     2  // Copyright (c) 2016 The Dash developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  /*
     7  Package peer provides a common base for creating and managing Bitcoin network
     8  peers.
     9  
    10  Overview
    11  
    12  This package builds upon the wire package, which provides the fundamental
    13  primitives necessary to speak the bitcoin wire protocol, in order to simplify
    14  the process of creating fully functional peers.  In essence, it provides a
    15  common base for creating concurrent safe fully validating nodes, Simplified
    16  Payment Verification (SPV) nodes, proxies, etc.
    17  
    18  A quick overview of the major features peer provides are as follows:
    19  
    20   - Provides a basic concurrent safe bitcoin peer for handling bitcoin
    21     communications via the peer-to-peer protocol
    22   - Full duplex reading and writing of bitcoin protocol messages
    23   - Automatic handling of the initial handshake process including protocol
    24     version negotiation
    25   - Asynchronous message queuing of outbound messages with optional channel for
    26     notification when the message is actually sent
    27   - Flexible peer configuration
    28     - Caller is responsible for creating outgoing connections and listening for
    29       incoming connections so they have flexibility to establish connections as
    30       they see fit (proxies, etc)
    31     - User agent name and version
    32     - Bitcoin network
    33     - Service support signalling (full nodes, bloom filters, etc)
    34     - Maximum supported protocol version
    35     - Ability to register callbacks for handling bitcoin protocol messages
    36   - Inventory message batching and send trickling with known inventory detection
    37     and avoidance
    38   - Automatic periodic keep-alive pinging and pong responses
    39   - Random nonce generation and self connection detection
    40   - Proper handling of bloom filter related commands when the caller does not
    41     specify the related flag to signal support
    42     - Disconnects the peer when the protocol version is high enough
    43     - Does not invoke the related callbacks for older protocol versions
    44   - Snapshottable peer statistics such as the total number of bytes read and
    45     written, the remote address, user agent, and negotiated protocol version
    46   - Helper functions pushing addresses, getblocks, getheaders, and reject
    47     messages
    48     - These could all be sent manually via the standard message output function,
    49       but the helpers provide additional nice functionality such as duplicate
    50       filtering and address randomization
    51   - Ability to wait for shutdown/disconnect
    52   - Comprehensive test coverage
    53  
    54  Peer Configuration
    55  
    56  All peer configuration is handled with the Config struct.  This allows the
    57  caller to specify things such as the user agent name and version, the bitcoin
    58  network to use, which services it supports, and callbacks to invoke when bitcoin
    59  messages are received.  See the documentation for each field of the Config
    60  struct for more details.
    61  
    62  Inbound and Outbound Peers
    63  
    64  A peer can either be inbound or outbound.  The caller is responsible for
    65  establishing the connection to remote peers and listening for incoming peers.
    66  This provides high flexibility for things such as connecting via proxies, acting
    67  as a proxy, creating bridge peers, choosing whether to listen for inbound peers,
    68  etc.
    69  
    70  NewOutboundPeer and NewInboundPeer functions must be followed by calling Connect
    71  with a net.Conn instance to the peer.  This will start all async I/O goroutines
    72  and initiate the protocol negotiation process.  Once finished with the peer call
    73  Disconnect to disconnect from the peer and clean up all resources.
    74  WaitForDisconnect can be used to block until peer disconnection and resource
    75  cleanup has completed.
    76  
    77  Callbacks
    78  
    79  In order to do anything useful with a peer, it is necessary to react to bitcoin
    80  messages.  This is accomplished by creating an instance of the MessageListeners
    81  struct with the callbacks to be invoke specified and setting the Listeners field
    82  of the Config struct specified when creating a peer to it.
    83  
    84  For convenience, a callback hook for all of the currently supported bitcoin
    85  messages is exposed which receives the peer instance and the concrete message
    86  type.  In addition, a hook for OnRead is provided so even custom messages types
    87  for which this package does not directly provide a hook, as long as they
    88  implement the wire.Message interface, can be used.  Finally, the OnWrite hook
    89  is provided, which in conjunction with OnRead, can be used to track server-wide
    90  byte counts.
    91  
    92  It is often useful to use closures which encapsulate state when specifying the
    93  callback handlers.  This provides a clean method for accessing that state when
    94  callbacks are invoked.
    95  
    96  Queuing Messages and Inventory
    97  
    98  The QueueMessage function provides the fundamental means to send messages to the
    99  remote peer.  As the name implies, this employs a non-blocking queue.  A done
   100  channel which will be notified when the message is actually sent can optionally
   101  be specified.  There are certain message types which are better sent using other
   102  functions which provide additional functionality.
   103  
   104  Of special interest are inventory messages.  Rather than manually sending MsgInv
   105  messages via Queuemessage, the inventory vectors should be queued using the
   106  QueueInventory function.  It employs batching and trickling along with
   107  intelligent known remote peer inventory detection and avoidance through the use
   108  of a most-recently used algorithm.
   109  
   110  Message Sending Helper Functions
   111  
   112  In addition to the bare QueueMessage function previously described, the
   113  PushAddrMsg, PushGetBlocksMsg, PushGetHeadersMsg, and PushRejectMsg functions
   114  are provided as a convenience.  While it is of course possible to create and
   115  send these message manually via QueueMessage, these helper functions provided
   116  additional useful functionality that is typically desired.
   117  
   118  For example, the PushAddrMsg function automatically limits the addresses to the
   119  maximum number allowed by the message and randomizes the chosen addresses when
   120  there are too many.  This allows the caller to simply provide a slice of known
   121  addresses, such as that returned by the addrmgr package, without having to worry
   122  about the details.
   123  
   124  Next, the PushGetBlocksMsg and PushGetHeadersMsg functions will construct proper
   125  messages using a block locator and ignore back to back duplicate requests.
   126  
   127  Finally, the PushRejectMsg function can be used to easily create and send an
   128  appropriate reject message based on the provided parameters as well as
   129  optionally provides a flag to cause it to block until the message is actually
   130  sent.
   131  
   132  Peer Statistics
   133  
   134  A snapshot of the current peer statistics can be obtained with the StatsSnapshot
   135  function.  This includes statistics such as the total number of bytes read and
   136  written, the remote address, user agent, and negotiated protocol version.
   137  
   138  Logging
   139  
   140  This package provides extensive logging capabilities through the UseLogger
   141  function which allows a btclog.Logger to be specified.  For example, logging at
   142  the debug level provides summaries of every message sent and received, and
   143  logging at the trace level provides full dumps of parsed messages as well as the
   144  raw message bytes using a format similar to hexdump -C.
   145  
   146  Bitcoin Improvement Proposals
   147  
   148  This package supports all BIPS supported by the wire package.
   149  (https://godoc.org/github.com/dashpay/godash/wire#hdr-Bitcoin_Improvement_Proposals)
   150  */
   151  package peer