2018-06-05 10:14:17 -04:00
|
|
|
# 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)
|
2018-06-22 18:16:51 -04:00
|
|
|
- [ABCI spec](https://github.com/tendermint/tendermint/blob/develop/abci/docs/abci-spec.md)
|