README

Tendermint

Byzantine-Fault Tolerant State Machines. Or Blockchain, for short.

version API Reference Go version riot.im license

Branch Tests Coverage
master CircleCI codecov
develop CircleCI codecov

Tendermint Core is Byzantine Fault Tolerant (BFT) middleware that takes a state transition machine - written in any programming language - and securely replicates it on many machines.

For protocol details, see the specification.

For detailed analysis of the consensus protocol, including safety and liveness proofs, see our recent paper, "The latest gossip on BFT consensus".

A Note on Production Readiness

While Tendermint is being used in production in private, permissioned environments, we are still working actively to harden and audit it in preparation for use in public blockchains, such as the Cosmos Network. We are also still making breaking changes to the protocol and the APIs. Thus, we tag the releases as alpha software.

In any case, if you intend to run Tendermint in production, please contact us and join the chat.

Security

To report a security vulnerability, see our bug bounty program

For examples of the kinds of bugs we're looking for, see SECURITY.md

Minimum requirements

Requirement Notes
Go version Go1.11.4 or higher

Documentation

Complete documentation can be found on the website.

Install

See the install instructions

Quick Start

Contributing

Please abide by the Code of Conduct in all interactions, and the contributing guidelines when submitting code.

Join the larger community on the forum and the chat.

To learn more about the structure of the software, watch the Developer Sessions and read some Architectural Decision Records.

Learn more by reading the code and comparing it to the specification.

Versioning

Semantic Versioning

Tendermint uses Semantic Versioning to determine when and how the version changes. According to SemVer, anything in the public API can change at any time before version 1.0.0

To provide some stability to Tendermint users in these 0.X.X days, the MINOR version is used to signal breaking changes across a subset of the total public API. This subset includes all interfaces exposed to other processes (cli, rpc, p2p, etc.), but does not include the in-process Go APIs.

That said, breaking changes in the following packages will be documented in the CHANGELOG even if they don't lead to MINOR version bumps:

  • crypto
  • types
  • rpc/client
  • config
  • node
  • libs
    • bech32
    • common
    • db
    • errors
    • log

Exported objects in these packages that are not covered by the versioning scheme are explicitly marked by // UNSTABLE in their go doc comment and may change at any time without notice. Functions, types, and values in any other package may also change at any time.

Upgrades

In an effort to avoid accumulating technical debt prior to 1.0.0, we do not guarantee that breaking changes (ie. bumps in the MINOR version) will work with existing tendermint blockchains. In these cases you will have to start a new blockchain, or write something custom to get the old data into the new chain.

However, any bump in the PATCH version should be compatible with existing histories (if not please open an issue).

For more information on upgrading, see UPGRADING.md

Resources

Tendermint Core

For details about the blockchain data structures and the p2p protocols, see the Tendermint specification.

For details on using the software, see the documentation which is also hosted at: https://tendermint.com/docs/

Tools

Benchmarking and monitoring is provided by tm-bench and tm-monitor, respectively. Their code is found here and these binaries need to be built seperately. Additional documentation is found here.

Sub-projects
  • Amino, reflection-based proto3, with interfaces
  • IAVL, Merkleized IAVL+ Tree implementation
Applications
Research
Expand ▾ Collapse ▴

Directories

Path Synopsis
abci/client
abci/cmd/abci-cli
abci/example
abci/example/code
abci/example/counter
abci/example/kvstore
abci/server
abci/tests
abci/tests/benchmarks
abci/tests/benchmarks/parallel
abci/tests/benchmarks/simple
abci/tests/server
abci/tests/test_app
abci/types
abci/version
benchmarks
benchmarks/proto Package test is a generated protocol buffer package.
benchmarks/simu
blockchain
cmd/priv_val_server
cmd/tendermint
cmd/tendermint/commands
config
consensus
consensus/types
crypto
crypto/armor
crypto/ed25519
crypto/encoding/amino
crypto/internal/benchmarking
crypto/merkle Package merkle computes a deterministic minimal height Merkle tree hash.
crypto/multisig
crypto/multisig/bitarray
crypto/secp256k1
crypto/secp256k1/internal/secp256k1 Package secp256k1 wraps the bitcoin secp256k1 C library.
crypto/tmhash
crypto/xchacha20poly1305 Package xchacha20poly1305 creates an AEAD using hchacha, chacha, and poly1305 This allows for randomized nonces to be used in conjunction with chacha.
crypto/xsalsa20symmetric
docs/spec/scripts
evidence
libs/autofile
libs/autofile/cmd
libs/bech32
libs/cli
libs/cli/flags
libs/clist
libs/common
libs/db
libs/db/remotedb remotedb is a package for connecting to distributed Tendermint db.DB instances.
libs/db/remotedb/grpcdb grpcdb is the distribution of Tendermint's db.DB instances using the gRPC transport to decouple local db.DB usages from applications, to using them over a network in a highly performant manner.
libs/db/remotedb/proto Package protodb is a generated protocol buffer package.
libs/errors Package errors contains errors that are thrown across packages.
libs/events Package events - Pub-Sub in go with event caching
libs/fail
libs/flowrate Package flowrate provides the tools for monitoring and limiting the flow rate of an arbitrary data stream.
libs/log
libs/pubsub Package pubsub implements a pub-sub model with a single publisher (Server) and multiple subscribers (clients).
libs/pubsub/query Package query provides a parser for a custom query format: abci.invoice.number=22 AND abci.invoice.owner=Ivan See query.peg for the grammar, which is a https://en.wikipedia.org/wiki/Parsing_expression_grammar.
libs/pubsub/query/fuzz_test
libs/test
libs/version
lite Package lite allows you to securely validate headers without a full node.
lite/client Package client defines a provider that uses a rpcclient to get information, which is used to get new headers and validators directly from a Tendermint client.
lite/errors
lite/proxy
mempool
node
p2p
p2p/conn
p2p/mock
p2p/pex
p2p/trust
p2p/upnp Taken from taipei-torrent.
privval Package privval provides different implementations of the types.PrivValidator.
proxy
rpc/client
rpc/client/mock
rpc/core # Introduction Tendermint supports the following RPC protocols: * URI over HTTP * JSONRPC over HTTP * JSONRPC over websockets Tendermint RPC is built using our own RPC library which contains its own set of documentation and tests.
rpc/core/types
rpc/grpc
rpc/lib HTTP RPC server supporting calls via uri params, jsonrpc, and jsonrpc over websockets Client Requests Suppose we want to expose the rpc function `HelloWorld(name string, num int)`.
rpc/lib/client
rpc/lib/server Commons for HTTP handling
rpc/lib/test
rpc/lib/types
rpc/test
scripts
scripts/json2wal
scripts/wal2json
state
state/txindex
state/txindex/kv
state/txindex/null
test/app
tools/tm-bench
tools/tm-monitor
tools/tm-monitor/eventmeter eventmeter - generic system to subscribe to events and record their frequency.
tools/tm-monitor/mock
tools/tm-monitor/monitor
tools/tm-signer-harness
tools/tm-signer-harness/internal
types
types/proto3
types/time
version