== What is Dshackle

Dshackle is an L7 Blockchain API Load Balancer with automatic discovery and health checking, authentication, and TLS termination.
It is designed to work as an edge proxy, middle proxy, or API gateway.

Dshackle provides a high level aggregated API on top of several underlying upstreams.
I.e. to blockchain nodes such as Bitcoind, Geth, Parity, or providers like Infura, and so on.
It automatically verifies their availability and the current status of the network, executes commands making sure that the response is consistent and/or data successfully broadcasted to the network.

Example use cases:

- Read a _transaction_ - Dshackle tries to find it on different nodes and retries until it's found or there is a consistent answer from upstreams that the transaction doesn't exist
- Get _nonce_ to send a transaction - Dshackle makes sure it finds the highest value across several nodes
- Send _transaction_ - Dshackle distributes it to several nodes in parallel

Availability and fault tolerance:

- Dshackle connects to several upstreams via JSON RPC, Websockets or gRPC protocol
- It verifies if a node ("upstream") is fully synchronized (not in initial sync mode), has enough peers and its height
  is not behind other nodes
- If upstream lags behind, lost peers, started to resync, or goes down then Dshackle temporarily excludes it from
  routing and returns back when the upstream's problem is fixed

Main goals:

- separate application services and blockchain nodes
- make blockchain access compatible with modern microservice oriented architecture
- provide secure access to a blockchain, on both protocol and data level