Skip to content

Latest commit

 

History

History
100 lines (83 loc) · 3.86 KB

pseudo-code.md

File metadata and controls

100 lines (83 loc) · 3.86 KB

Tendermint Consensus Algorithm: Pseudo-code

Algorithm 1 from page 6 of the paper "The latest gossip on BFT consensus" (PDF), by Ethan Buchman, Jae Kwon, and Zarko Milosevic, last revised in November 2019: Tendermint consensus algorithm.

 1: Initialization:
 2:    h_p := 0     /* current height, or consensus instance we are currently executing */
 3:    round_p := 0 /* current round number */
 4:    step_p ∈ {propose, prevote, precommit}
 5:    decision_p[] := nil
 6:    lockedValue_p := nil
 7:    lockedRound_p :=1
 8:    validValue_p := nil
 9:    validRound_p :=1

10: upon start do StartRound(0)

11: Function StartRound(round):
12:    round_pround
13:    step_ppropose
14:    if proposer(h_p, round_p) = p then
15:       if validValue_p != nil then
16:          proposalvalidValue_p
17:       else
18:          proposalgetValue()
19:       broadcastPROPOSAL, h_p, round_p, proposal, validRound_p20:    else
21:       schedule OnTimeoutPropose(h_p, round_p) to be executed after timeoutPropose(round_p)

22: uponPROPOSAL, h_p, round_p, v, −1from proposer(h_p, round_p)
    while step_p = propose do
23:    if valid(v) ∧ (lockedRound_p =1lockedValue_p = v) then
24:       broadcastPREVOTE, h_p, round_p, id(v)⟩
25:    else
26:       broadcastPREVOTE, h_p, round_p, nil27:    step_pprevote

28: uponPROPOSAL, h_p, round_p, v, vrfrom proposer(h_p, round_p) AND 2f + 1PREVOTE, h_p, vr, id(v)⟩
    while step_p = propose ∧ (vr0vr < round_p) do
29:    if valid(v) ∧ (lockedRound_pvrlockedValue_p = v) then
30:       broadcastPREVOTE, h_p, round_p, id(v)⟩
31:    else
32:       broadcastPREVOTE, h_p, round_p, nil33:    step_pprevote

34: upon 2f + 1PREVOTE, h_p, round_p, ∗⟩ while step_p = prevote for the first time do
35:    schedule OnTimeoutPrevote(h_p, round_p) to be executed after timeoutPrevote(round_p)

36: uponPROPOSAL, h_p, round_p, v, ∗⟩ from proposer(h_p, round_p) AND 2f + 1PREVOTE, h_p, round_p, id(v)⟩
    while valid(v) ∧ step_pprevote for the first time do
37:    if step_p = prevote then
38:       lockedValue_pv
39:       lockedRound_pround_p
40:       broadcastPRECOMMIT, h_p, round_p, id(v))⟩
41:       step_pprecommit
42:    validValue_pv
43:    validRound_pround_p

44: upon 2f + 1PREVOTE, h_p, round_p, nilwhile step_p = prevote do
45:    broadcastPRECOMMIT, h_p, round_p, nil46:    step_pprecommit

47: upon 2f + 1PRECOMMIT, h_p, round_p, ∗⟩ for the first time do
48:    schedule OnTimeoutPrecommit(h_p, round_p) to be executed after timeoutPrecommit(round_p)

49: uponPROPOSAL, h_p, r, v, ∗⟩ from proposer(h_p, r) AND 2f + 1PRECOMMIT, h_p, r, id(v)⟩
    while decision_p[h_p] = nil do
50:    if valid(v) then
51:       decision_p[h_p] = v
52:       h_ph_p + 1
53:       reset lockedRound_p, lockedValue_p, validRound_p and validValue_p to initial values
54:       StartRound(0)

55: upon f + 1 ⟨∗, h_p, round, ∗⟩ with round > round_p do
56:    StartRound(round)

57: Function OnTimeoutPropose(height, round):
58:    if height = h_pround = round_pstep_p = propose then
59:       broadcastPREVOTE, h_p, round_p, nil60:       step_pprevote

61: Function OnTimeoutPrevote(height, round):
62:    if height = h_pround = round_pstep_p = prevote then
63:       broadcastPRECOMMIT, h_p, round_p, nil64:       step_pprecommit

65: Function OnTimeoutPrecommit(height, round):
66:    if height = h_pround = round_p then
67:       StartRound(round_p + 1)

The overview.md document details the operation of Tendermint consensus algorithm, from its pseudo-code.