mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 14:52:17 +00:00
* ungitignore * add docs/.vuepress to enable local builds * config.js needs to be here, one less step * docs: make spec in sidebar nicer * docs: local build instructions
82 lines
4.3 KiB
Markdown
82 lines
4.3 KiB
Markdown
# Overview
|
|
|
|
This is a markdown specification of the Tendermint blockchain.
|
|
It defines the base data structures, how they are validated,
|
|
and how they are communicated over the network.
|
|
|
|
If you find discrepancies between the spec and the code that
|
|
do not have an associated issue or pull request on github,
|
|
please submit them to our [bug bounty](https://tendermint.com/security)!
|
|
|
|
## Contents
|
|
|
|
- [Overview](#overview)
|
|
|
|
### Data Structures
|
|
|
|
- [Encoding and Digests](https://github.com/tendermint/tendermint/blob/master/docs/spec/blockchain/encoding.md)
|
|
- [Blockchain](https://github.com/tendermint/tendermint/blob/master/docs/spec/blockchain/blockchain.md)
|
|
- [State](https://github.com/tendermint/tendermint/blob/master/docs/spec/blockchain/state.md)
|
|
|
|
### Consensus Protocol
|
|
|
|
- [Consensus Algorithm](/docs/spec/consensus/consensus.md)
|
|
- [Creating a proposal](/docs/spec/consensus/creating-proposal.md)
|
|
- [Time](/docs/spec/consensus/bft-time.md)
|
|
- [Light-Client](/docs/spec/consensus/light-client.md)
|
|
|
|
### P2P and Network Protocols
|
|
|
|
- [The Base P2P Layer](https://github.com/tendermint/tendermint/tree/master/docs/spec/p2p): multiplex the protocols ("reactors") on authenticated and encrypted TCP connections
|
|
- [Peer Exchange (PEX)](https://github.com/tendermint/tendermint/tree/master/docs/spec/reactors/pex): gossip known peer addresses so peers can find each other
|
|
- [Block Sync](https://github.com/tendermint/tendermint/tree/master/docs/spec/reactors/block_sync): gossip blocks so peers can catch up quickly
|
|
- [Consensus](https://github.com/tendermint/tendermint/tree/master/docs/spec/reactors/consensus): gossip votes and block parts so new blocks can be committed
|
|
- [Mempool](https://github.com/tendermint/tendermint/tree/master/docs/spec/reactors/mempool): gossip transactions so they get included in blocks
|
|
- Evidence: Forthcoming, see [this issue](https://github.com/tendermint/tendermint/issues/2329).
|
|
|
|
### Software
|
|
|
|
- [ABCI](/docs/spec/software/abci.md): Details about interactions between the
|
|
application and consensus engine over ABCI
|
|
- [Write-Ahead Log](/docs/spec/software/wal.md): Details about how the consensus
|
|
engine preserves data and recovers from crash failures
|
|
|
|
## Overview
|
|
|
|
Tendermint provides Byzantine Fault Tolerant State Machine Replication using
|
|
hash-linked batches of transactions. Such transaction batches are called "blocks".
|
|
Hence, Tendermint defines a "blockchain".
|
|
|
|
Each block in Tendermint has a unique index - its Height.
|
|
Height's in the blockchain are monotonic.
|
|
Each block is committed by a known set of weighted Validators.
|
|
Membership and weighting within this validator set may change over time.
|
|
Tendermint guarantees the safety and liveness of the blockchain
|
|
so long as less than 1/3 of the total weight of the Validator set
|
|
is malicious or faulty.
|
|
|
|
A commit in Tendermint is a set of signed messages from more than 2/3 of
|
|
the total weight of the current Validator set. Validators take turns proposing
|
|
blocks and voting on them. Once enough votes are received, the block is considered
|
|
committed. These votes are included in the _next_ block as proof that the previous block
|
|
was committed - they cannot be included in the current block, as that block has already been
|
|
created.
|
|
|
|
Once a block is committed, it can be executed against an application.
|
|
The application returns results for each of the transactions in the block.
|
|
The application can also return changes to be made to the validator set,
|
|
as well as a cryptographic digest of its latest state.
|
|
|
|
Tendermint is designed to enable efficient verification and authentication
|
|
of the latest state of the blockchain. To achieve this, it embeds
|
|
cryptographic commitments to certain information in the block "header".
|
|
This information includes the contents of the block (eg. the transactions),
|
|
the validator set committing the block, as well as the various results returned by the application.
|
|
Note, however, that block execution only occurs _after_ a block is committed.
|
|
Thus, application results can only be included in the _next_ block.
|
|
|
|
Also note that information like the transaction results and the validator set are never
|
|
directly included in the block - only their cryptographic digests (Merkle roots) are.
|
|
Hence, verification of a block requires a separate data structure to store this information.
|
|
We call this the `State`. Block verification also requires access to the previous block.
|