-
Notifications
You must be signed in to change notification settings - Fork 15
Consensus
Consensus follows the algorithm described by "the latest gossip on BFT consensus". It includes two modifications: fast forwarding and rebasing.
The algorithm described by "the latest gossip on BFT consensus" assumes that process will eventually see all messages. This allows the algorithm to restrict its cases to messages that are bound for the H_p (the current of the honest process). However, this is not true in practice, since honest processes may find themselves crashing unexpectedly, or on the wrong side of a network partition.
For example, an honest process could become unavailable at height H_p and not become available again until H_p+N. At this point, none of the cases described by "the latest gossip on BFT consensus" will be triggered. Ideally, such an honest process is able to fast forward to H_p + N without relying on other honest processes relaying all missing messages.
We introduce the case:
upon (PROPOSAL, H, Round, V, *) and 2F+1 (PRECOMMIT, H, Round, id(V)) while H > H_p do
if valid(V) then
Decision_p [H_p] = V
H_p = H + 1
reset LockedRound_p, LockedValue_p, ValidRound_p, and ValidValue_p to initial values and empty message log
startRound 0
In practice, the (PROPOSAL, H, Round, V, *) and (PRECOMMIT, H, Round, id(V)) messages required to trigger this case are optionally sent as part of a new (PROPOSAL, H + N, *, *, *) message.
The genesis block must be a base block. It contains an empty list of transactions, an empty state, and an empty plan. It must be considered finalised. It must define a set of 3F+1 signatories in its header. It is assumed that these initial signatories are trusted to bootstrap the network.
Let the base block at height H be known as BaseBlock_H, and the latest such block be BaseBlock_{max}.