1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#![deny(missing_docs, unsafe_code, unstable_features)]
//! A Rust crate for creating ABCI applications.
//!
//! ## ABCI Overview
//!
//! ABCI is the interface between Tendermint (a state-machine replication engine) and your application (the actual state
//! machine). It consists of a set of methods, where each method has a corresponding `Request` and `Response` message type.
//! Tendermint calls the ABCI methods on the ABCI application by sending the `Request` messages and receiving the `Response`
//! messages in return.
//!
//! ABCI methods are split across 3 separate ABCI connections:
//!
//! - `Consensus` Connection: `InitChain`, `BeginBlock`, `DeliverTx`, `EndBlock`, `Commit`
//! - `Mempool` Connection: `CheckTx`
//! - `Info` Connection: `Info`, `SetOption`, `Query`
//!
//! Additionally, there is a `Flush` method that is called on every connection, and an `Echo` method that is just for
//! debugging.
//!
//! To know more about ABCI protocol specifications, go to official ABCI [documentation](https://tendermint.com/docs/spec/abci/).
//!
//! ## Usage
//!
//! Add `abci-rs` in your `Cargo.toml`'s `dependencies` section:
//!
//! ```toml
//! [dependencies]
//! abci-rs = "0.3"
//! ```
//!
//! Each ABCI application has to implement three core traits corresponding to all three ABCI connections, `Consensus`,
//! `Mempool` and `Info`.
//!
//! > Note: Implementations of these traits are expected to be `Send + Sync` and methods take immutable reference of `self`.
//! So, internal mutability must be handled using thread safe (`Arc`, `Mutex`, etc.) constructs.
//!
//! After implementing all three above mentioned `trait`s, you can create a `Server` object and use `Server::run()`to start
//! ABCI application.
//!
//! `Server::run()` is an `async` function and returns a `Future`. So, you'll need an executor to run `Future` returned from
//! `Server::run()`. `async-std` and `tokio` are two popular options. In `counter` example, we use `async-std`'s executor.
//!
//! To know more, go to `examples/` to see a sample ABCI application.
//!
//! ### Features
//!
//! - `uds`: Enables support for running ABCI server over Unix Domain Socket (UDS)
//!   - Supported on **Unix** only.
//!   - **Disabled** by default.
//!
//! ## Supported Versions
//!
//! - Tendermint v0.32.0
//! - ABCI v0.16.0
mod application;
mod proto;
mod server;

pub mod types;

/// Utility macro for implementing [`Consensus`](trait.Consensus.html), [`Mempool`](trait.Mempool.html) and
/// [`Info`](trait.Info.html) traits.
pub use async_trait::async_trait;

pub use self::application::{Consensus, Info, Mempool};
pub use self::server::{Address, Server};