|
\section{Definitions} \label{sec:definitions}
|
|
|
|
\subsection{Model}
|
|
|
|
We consider a system of processes that communicate by exchanging messages.
|
|
Processes can be correct or faulty, where a faulty process can behave in an
|
|
arbitrary way, i.e., we consider Byzantine faults. We assume that each process
|
|
has some amount of voting power (voting power of a process can be $0$).
|
|
Processes in our model are not part of a single administrative domain;
|
|
therefore we cannot enforce a direct network connectivity between all
|
|
processes. Instead, we assume that each process is connected to a subset of
|
|
processes called peers, such that there is an indirect communication channel
|
|
between all correct processes. Communication between processes is established
|
|
using a gossip protocol \cite{Dem1987:gossip}.
|
|
|
|
Formally, we model the network communication using a variant of the \emph{partially
|
|
synchronous system model}~\cite{DLS88:jacm}: in all executions of the system
|
|
there is a bound $\Delta$ and an instant GST (Global Stabilization Time) such
|
|
that all communication among correct processes after GST is reliable and
|
|
$\Delta$-timely, i.e., if a correct process $p$ sends message $m$ at time $t
|
|
\ge GST$ to a correct process $q$, then $q$ will receive $m$ before $t +
|
|
\Delta$\footnote{Note that as we do not assume direct communication channels
|
|
among all correct processes, this implies that before the message $m$
|
|
reaches $q$, it might pass through a number of correct processes that will
|
|
forward the message $m$ using gossip protocol towards $q$.}.
|
|
In addition to the standard \emph{partially
|
|
synchronous system model}~\cite{DLS88:jacm}, we assume an auxiliary property
|
|
that captures gossip-based nature of communication\footnote{The details of the Tendermint gossip protocol will be discussed in a separate
|
|
technical report. }:
|
|
|
|
|
|
\begin{itemize} \item \emph{Gossip communication:} If a correct process $p$
|
|
sends some message $m$ at time $t$, all correct processes will receive
|
|
$m$ before $max\{t, GST\} + \Delta$. Furthermore, if a correct process $p$
|
|
receives some message $m$ at time $t$, all correct processes will receive
|
|
$m$ before $max\{t, GST\} + \Delta$. \end{itemize}
|
|
|
|
|
|
The bound $\Delta$ and GST are system
|
|
parameters whose values are not required to be known for the safety of our
|
|
algorithm. Termination of the algorithm is guaranteed within a bounded duration
|
|
after GST. In practice, the algorithm will work correctly in the slightly
|
|
weaker variant of the model where the system alternates between (long enough)
|
|
good periods (corresponds to the \emph{after} GST period where system is
|
|
reliable and $\Delta$-timely) and bad periods (corresponds to the period
|
|
\emph{before} GST during which the system is asynchronous and messages can be
|
|
lost), but consideration of the GST model simplifies the discussion.
|
|
|
|
We assume that process steps (which might include sending and receiving
|
|
messages) take zero time. Processes are equipped with clocks so they can
|
|
measure local timeouts.
|
|
Spoofing/impersonation attacks are assumed to be impossible at all times due to
|
|
the use of public-key cryptography, i.e., we assume that all protocol messages contains a digital signature.
|
|
Therefore, when a correct
|
|
process $q$ receives a signed message $m$ from its peer, the process $q$ can
|
|
verify who was the original sender of the message $m$ and if the message signature is valid.
|
|
We do not explicitly state a signature verification step in the pseudo-code of the algorithm to improve readability;
|
|
we assume that only messages with the valid signature are considered at that level (and messages with invalid signatures
|
|
are dropped).
|
|
|
|
|
|
|
|
%Messages that are being gossiped are created by the consensus layer. We can
|
|
%think about consensus protocol as a content creator, which %defines what
|
|
%messages should be disseminated using the gossip protocol. A correct
|
|
%process creates the message for dissemination either i) %explicitly, by
|
|
%invoking \emph{send} function as part of the consensus protocol or ii)
|
|
%implicitly, by receiving a message from some other %process. Note that in
|
|
%the case ii) gossiping of messages is implicit, i.e., it happens without
|
|
%explicit send clause in the consensus algorithm %whenever a correct
|
|
%process receives some messages in the consensus algorithm\footnote{If a
|
|
%message is received by a correct process at %the consensus level then it
|
|
%is considered valid from the protocol point of view, i.e., it has a
|
|
%correct signature, a proper message structure %and a valid height and
|
|
%round number.}.
|
|
|
|
%\item Processes keep resending messages (in case of failures or message loss)
|
|
%until all its peers get them. This ensures that every message %sent or
|
|
%received by a correct process is eventually received by all correct
|
|
%processes.
|
|
|
|
\subsection{State Machine Replication}
|
|
|
|
State machine replication (SMR) is a general approach for replicating services
|
|
modeled as a deterministic state machine~\cite{Lam78:cacm,Sch90:survey}. The
|
|
key idea of this approach is to guarantee that all replicas start in the same
|
|
state and then apply requests from clients in the same order, thereby
|
|
guaranteeing that the replicas' states will not diverge. Following
|
|
Schneider~\cite{Sch90:survey}, we note that the following is key for
|
|
implementing a replicated state machine tolerant to (Byzantine) faults:
|
|
|
|
\begin{itemize} \item \emph{Replica Coordination.} All [non-faulty] replicas
|
|
receive and process the same sequence of requests. \end{itemize}
|
|
|
|
Moreover, as Schneider also notes, this property can be decomposed into two
|
|
parts, \emph{Agreement} and \emph{Order}: Agreement requires all (non-faulty)
|
|
replicas to receive all requests, and Order requires that the order of received
|
|
requests is the same at all replicas.
|
|
|
|
There is an additional requirement that needs to be ensured by Byzantine
|
|
tolerant state machine replication: only requests (called transactions in the
|
|
Tendermint terminology) proposed by clients are executed. In Tendermint,
|
|
transaction verification is the responsibility of the service that is being
|
|
replicated; upon receiving a transaction from the client, the Tendermint
|
|
process will ask the service if the request is valid, and only valid requests
|
|
will be processed.
|
|
|
|
\subsection{Consensus} \label{sec:consensus}
|
|
|
|
Tendermint solves state machine replication by sequentially executing consensus
|
|
instances to agree on each block of transactions that are
|
|
then executed by the service being replicated. We consider a variant of the
|
|
Byzantine consensus problem called Validity Predicate-based Byzantine consensus
|
|
that is motivated by blockchain systems~\cite{GLR17:red-belly-bc}. The problem
|
|
is defined by an agreement, a termination, and a validity property.
|
|
|
|
\begin{itemize} \item \emph{Agreement:} No two correct processes decide on
|
|
different values. \item \emph{Termination:} All correct processes
|
|
eventually decide on a value. \item \emph{Validity:} A decided value
|
|
is valid, i.e., it satisfies the predefined predicate denoted
|
|
\emph{valid()}. \end{itemize}
|
|
|
|
This variant of the Byzantine consensus problem has an application-specific
|
|
\emph{valid()} predicate to indicate whether a value is valid. In the context
|
|
of blockchain systems, for example, a value is not valid if it does not
|
|
contain an appropriate hash of the last value (block) added to the blockchain.
|