|
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)
|