Crate zebra_network[−][src]
Networking code for Zebra. 🦓
The Zcash network protocol is inherited from Bitcoin, which uses a stateful network protocol in which messages can arrive in any order (even before a handshake is complete!), and the same message may be a request or a response depending on context.
This crate translates the legacy Bitcoin/Zcash network protocol
into a stateless, request-response oriented protocol defined by
the Request
and Response
enums, and completely
encapsulates all peer handling code behind a single
tower::Service
representing "the network" which load-balances
outbound Request
s over available peers.
Unlike the underlying legacy network protocol the provided
tower::Service
guarantees that each Request
future will resolve to
the correct Response
, not a potentially random unrelated Response
.
Each peer connection is a distinct task, which interprets incoming
Bitcoin/Zcash messages either as Response
s to pending
Request
s, or as an inbound Request
s to an internal
tower::Service
representing "this node". All connection state
is isolated to the peer in question, so as a side effect the
design is structurally immune to the recent ping
attack.
Because tower::Service
s provide backpressure information, we
can dynamically manage the size of the connection pool according
to inbound and outbound demand. The inbound service can shed load
when it is not ready for requests, causing those peer connections
to close, and the outbound service can connect to additional peers
when it is overloaded.
Modules
constants | Definitions of constants. |
types | Types used in the definition of |
Structs
AddressBook | A database of peers, their advertised services, and information on when they were last seen. |
Config | Configuration for networking code. |
RetryErrors | A very basic retry policy that always retries failed requests. |
RetryLimit | A very basic retry policy with a limited number of retry attempts. |
Enums
Request | A network request, represented in internal format. |
Response | A response to a network request, represented in internal format. |
Functions
connect_isolated | Use the provided TCP connection to create a Zcash connection completely isolated from all other node state. |
init | Initialize a peer set. |
Type Definitions
BoxError | Type alias to make working with tower traits easier. |