@@ -48,133 +48,3 @@ func (t *Tendermint[V, H, A]) handleProposal(p Proposal[V, H, A]) {
48
48
t .line28WhenProposalIsReceived (vr , proposalFromProposer , vID , validProposal )
49
49
t .line36WhenProposalIsReceived (p , validProposal , proposalFromProposer , prevotesForHR , vID )
50
50
}
51
-
52
- /*
53
- Check the upon condition on line 49:
54
-
55
- 49: upon {PROPOSAL, h_p, r, v, *} from proposer(h_p, r) AND 2f + 1 {PRECOMMIT, h_p, r, id(v)} while decision_p[h_p] = nil do
56
- 50: if valid(v) then
57
- 51: decisionp[hp] = v
58
- 52: h_p ← h_p + 1
59
- 53: reset lockedRound_p, lockedValue_p, validRound_p and validValue_p to initial values and empty message log
60
- 54: StartRound(0)
61
-
62
- There is no need to check decision_p[h_p] = nil since it is implied that decision are made
63
- sequentially, i.e. x, x+1, x+2... . The validity of the proposal value can be checked in the same if
64
- statement since there is no else statement.
65
- */
66
- func (t * Tendermint [V , H , A ]) line49WhenProposalIsReceived (p Proposal [V , H , A ], vID H , validProposal , proposalFromProposer bool ) bool {
67
- precommits , hasQuorum := t .checkForQuorumPrecommit (p .R , vID )
68
-
69
- if validProposal && proposalFromProposer && hasQuorum {
70
- // After committing the block, how the new height and round is started needs to be coordinated
71
- // with the synchronisation process.
72
- t .blockchain .Commit (t .state .h , * p .Value , precommits )
73
-
74
- t .messages .deleteHeightMessages (t .state .h )
75
- t .state .h ++
76
- t .startRound (0 )
77
-
78
- return true
79
- }
80
- return false
81
- }
82
-
83
- /*
84
- Check the upon condition on line 22:
85
-
86
- 22: upon {PROPOSAL, h_p, round_p, v, nil} from proposer(h_p, round_p) while step_p = propose do
87
- 23: if valid(v) ∧ (lockedRound_p = −1 ∨ lockedValue_p = v) then
88
- 24: broadcast {PREVOTE, h_p, round_p, id(v)}
89
- 25: else
90
- 26: broadcast {PREVOTE, h_p, round_p, nil}
91
- 27: step_p ← prevote
92
-
93
- The implementation uses nil as -1 to avoid using int type.
94
-
95
- Since the value's id is expected to be unique the id can be used to compare the values.
96
- */
97
- func (t * Tendermint [V , H , A ]) line22 (vr round , proposalFromProposer , validProposal bool , vID H ) {
98
- if vr == - 1 && proposalFromProposer && t .state .s == propose {
99
- var votedID * H
100
- if validProposal && (t .state .lockedRound == - 1 || (* t .state .lockedValue ).Hash () == vID ) {
101
- votedID = & vID
102
- }
103
- t .sendPrevote (votedID )
104
- }
105
- }
106
-
107
- /*
108
- Check the upon condition on line 28:
109
-
110
- 28: upon {PROPOSAL, h_p, round_p, v, vr} from proposer(h_p, round_p) AND 2f + 1 {PREVOTE,h_p, vr, id(v)} while
111
- step_p = propose ∧ (vr ≥ 0 ∧ vr < round_p) do
112
- 29: if valid(v) ∧ (lockedRound_p ≤ vr ∨ lockedValue_p = v) then
113
- 30: broadcast {PREVOTE, hp, round_p, id(v)}
114
- 31: else
115
- 32: broadcast {PREVOTE, hp, round_p, nil}
116
- 33: step_p ← prevote
117
-
118
- Ideally, the condition on line 28 would be checked in a single if statement, however,
119
- this cannot be done because valid round needs to be non-nil before the prevotes are fetched.
120
- */
121
- func (t * Tendermint [V , H , A ]) line28WhenProposalIsReceived (vr round , proposalFromProposer bool ,
122
- vID H , validProposal bool ,
123
- ) {
124
- if vr != - 1 && proposalFromProposer && t .state .s == propose && vr >= 0 && vr < t .state .r {
125
- hasQuorum := t .checkQuorumPrevotesGivenProposalVID (vr , vID )
126
- if hasQuorum {
127
- var votedID * H
128
- if validProposal && (t .state .lockedRound <= vr || (* t .state .lockedValue ).Hash () == vID ) {
129
- votedID = & vID
130
- }
131
- t .sendPrevote (votedID )
132
- }
133
- }
134
- }
135
-
136
- /*
137
- Check upon condition on line 36:
138
-
139
- 36: upon {PROPOSAL, h_p, round_p, v, ∗} from proposer(h_p, round_p) AND 2f + 1 {PREVOTE, h_p, round_p, id(v)} while
140
- valid(v) ∧ step_p ≥ prevote for the first time do
141
- 37: if step_p = prevote then
142
- 38: lockedValue_p ← v
143
- 39: lockedRound_p ← round_p
144
- 40: broadcast {PRECOMMIT, h_p, round_p, id(v))}
145
- 41: step_p ← precommit
146
- 42: validValue_p ← v
147
- 43: validRound_p ← round_p
148
-
149
- The condition on line 36 can should be checked in a single if statement, however,
150
- checking for quroum is more resource intensive than other conditions, therefore, they are checked
151
- first.
152
- */
153
- func (t * Tendermint [V , H , A ]) line36WhenProposalIsReceived (p Proposal [V , H , A ], validProposal ,
154
- proposalFromProposer bool , prevotesForHR map [A ][]Prevote [H , A ], vID H ,
155
- ) {
156
- if validProposal && proposalFromProposer && ! t .state .lockedValueAndOrValidValueSet && t .state .s >= prevote {
157
- var vals []A
158
- for addr , valPrevotes := range prevotesForHR {
159
- for _ , v := range valPrevotes {
160
- if * v .ID == vID {
161
- vals = append (vals , addr )
162
- }
163
- }
164
- }
165
-
166
- if t .validatorSetVotingPower (vals ) >= q (t .validators .TotalVotingPower (p .H )) {
167
- cr := t .state .r
168
-
169
- if t .state .s == prevote {
170
- t .state .lockedValue = p .Value
171
- t .state .lockedRound = cr
172
- t .sendPrecommit (& vID )
173
- }
174
-
175
- t .state .validValue = p .Value
176
- t .state .validRound = cr
177
- t .state .lockedValueAndOrValidValueSet = true
178
- }
179
- }
180
- }
0 commit comments