|
|
- Application Architecture Guide
- ==============================
-
- Here we provide a brief guide on the recommended architecture of a Tendermint blockchain
- application.
-
- The following diagram provides a superb example:
-
- https://drive.google.com/open?id=1yR2XpRi9YCY9H9uMfcw8-RMJpvDyvjz9
-
- The end-user application here is the Cosmos Voyager, at the bottom left.
- Voyager communicates with a REST API exposed by a local Light-Client Daemon.
- The Light-Client Daemon is an application specific program that communicates with
- Tendermint nodes and verifies Tendermint light-client proofs through the Tendermint Core RPC.
- The Tendermint Core process communicates with a local ABCI application, where the
- user query or transaction is actually processed.
-
- The ABCI application must be a deterministic result of the Tendermint consensus - any external influence
- on the application state that didn't come through Tendermint could cause a
- consensus failure. Thus *nothing* should communicate with the application except Tendermint via ABCI.
-
- If the application is written in Go, it can be compiled into the Tendermint binary.
- Otherwise, it should use a unix socket to communicate with Tendermint.
- If it's necessary to use TCP, extra care must be taken to encrypt and authenticate the connection.
-
- All reads from the app happen through the Tendermint `/abci_query` endpoint.
- All writes to the app happen through the Tendermint `/broadcast_tx_*` endpoints.
-
- The Light-Client Daemon is what provides light clients (end users) with nearly all the security of a full node.
- It formats and broadcasts transactions, and verifies proofs of queries and transaction results.
- Note that it need not be a daemon - the Light-Client logic could instead be implemented in the same process as the end-user application.
-
- Note for those ABCI applications with weaker security requirements, the functionality of the Light-Client Daemon can be moved
- into the ABCI application process itself. That said, exposing the application process to anything besides Tendermint over ABCI
- requires extreme caution, as all transactions, and possibly all queries, should still pass through Tendermint.
-
- See the following for more extensive documentation:
- - [Interchain Standard for the Light-Client REST API](https://github.com/cosmos/cosmos-sdk/pull/1028)
- - [Tendermint RPC Docs](https://tendermint.github.io/slate/)
- - [Tendermint in Production](https://github.com/tendermint/tendermint/pull/1618)
- - [Tendermint Basics](https://tendermint.readthedocs.io/en/master/using-tendermint.html)
- - [ABCI spec](https://github.com/tendermint/abci/blob/master/specification.rst)
|