@@ -11,10 +11,7 @@ use chrono::Utc;
11
11
use hotshot_types:: {
12
12
event:: { Event , EventType } ,
13
13
simple_vote:: { HasEpoch , QuorumVote2 , TimeoutData2 , TimeoutVote2 } ,
14
- traits:: {
15
- election:: Membership ,
16
- node_implementation:: { ConsensusTime , NodeImplementation , NodeType } ,
17
- } ,
14
+ traits:: node_implementation:: { ConsensusTime , NodeImplementation , NodeType } ,
18
15
utils:: EpochTransitionIndicator ,
19
16
vote:: { HasViewNumber , Vote } ,
20
17
} ;
@@ -47,12 +44,14 @@ pub(crate) async fn handle_quorum_vote_recv<
47
44
. read ( )
48
45
. await
49
46
. is_high_qc_for_last_block ( ) ;
50
- let we_are_leader = task_state
51
- . membership
52
- . read ( )
47
+ let epoch_membership = task_state
48
+ . membership_coordinator
49
+ . membership_for_epoch ( vote . data . epoch )
53
50
. await
54
- . leader ( vote. view_number ( ) + 1 , vote. data . epoch ) ?
55
- == task_state. public_key ;
51
+ . context ( warn ! ( "No stake table for epoch" ) ) ?;
52
+
53
+ let we_are_leader =
54
+ epoch_membership. leader ( vote. view_number ( ) + 1 ) . await ? == task_state. public_key ;
56
55
ensure ! (
57
56
in_transition || we_are_leader,
58
57
info!(
@@ -70,8 +69,7 @@ pub(crate) async fn handle_quorum_vote_recv<
70
69
& mut task_state. vote_collectors ,
71
70
vote,
72
71
task_state. public_key . clone ( ) ,
73
- & task_state. membership ,
74
- vote. data . epoch ,
72
+ & epoch_membership,
75
73
task_state. id ,
76
74
& event,
77
75
sender,
@@ -80,20 +78,19 @@ pub(crate) async fn handle_quorum_vote_recv<
80
78
)
81
79
. await ?;
82
80
83
- if let Some ( vote_epoch ) = vote. epoch ( ) {
81
+ if vote. epoch ( ) . is_some ( ) {
84
82
// If the vote sender belongs to the next epoch, collect it separately to form the second QC
85
- let has_stake = task_state
86
- . membership
87
- . read ( )
88
- . await
89
- . has_stake ( & vote . signing_key ( ) , Some ( vote_epoch + 1 ) ) ;
83
+ let has_stake = epoch_membership
84
+ . next_epoch ( )
85
+ . await ?
86
+ . has_stake ( & vote . signing_key ( ) )
87
+ . await ;
90
88
if has_stake {
91
89
handle_vote (
92
90
& mut task_state. next_epoch_vote_collectors ,
93
91
& vote. clone ( ) . into ( ) ,
94
92
task_state. public_key . clone ( ) ,
95
- & task_state. membership ,
96
- vote. data . epoch ,
93
+ & epoch_membership. next_epoch ( ) . await ?. clone ( ) ,
97
94
task_state. id ,
98
95
& event,
99
96
sender,
@@ -118,14 +115,14 @@ pub(crate) async fn handle_timeout_vote_recv<
118
115
sender : & Sender < Arc < HotShotEvent < TYPES > > > ,
119
116
task_state : & mut ConsensusTaskState < TYPES , I , V > ,
120
117
) -> Result < ( ) > {
118
+ let epoch_membership = task_state
119
+ . membership_coordinator
120
+ . membership_for_epoch ( task_state. cur_epoch )
121
+ . await
122
+ . context ( warn ! ( "No stake table for epoch" ) ) ?;
121
123
// Are we the leader for this view?
122
124
ensure ! (
123
- task_state
124
- . membership
125
- . read( )
126
- . await
127
- . leader( vote. view_number( ) + 1 , task_state. cur_epoch) ?
128
- == task_state. public_key,
125
+ epoch_membership. leader( vote. view_number( ) + 1 ) . await ? == task_state. public_key,
129
126
info!(
130
127
"We are not the leader for view {:?}" ,
131
128
vote. view_number( ) + 1
@@ -136,8 +133,10 @@ pub(crate) async fn handle_timeout_vote_recv<
136
133
& mut task_state. timeout_vote_collectors ,
137
134
vote,
138
135
task_state. public_key . clone ( ) ,
139
- & task_state. membership ,
140
- vote. data . epoch ,
136
+ & task_state
137
+ . membership_coordinator
138
+ . membership_for_epoch ( vote. data . epoch )
139
+ . await ?,
141
140
task_state. id ,
142
141
& event,
143
142
sender,
@@ -201,10 +200,11 @@ pub async fn send_high_qc<TYPES: NodeType, V: Versions, I: NodeImplementation<TY
201
200
. await ;
202
201
} else {
203
202
let leader = task_state
204
- . membership
205
- . read ( )
206
- . await
207
- . leader ( new_view_number, task_state. cur_epoch ) ?;
203
+ . membership_coordinator
204
+ . membership_for_epoch ( task_state. cur_epoch )
205
+ . await ?
206
+ . leader ( new_view_number)
207
+ . await ?;
208
208
broadcast_event (
209
209
Arc :: new ( HotShotEvent :: HighQcSend (
210
210
high_qc,
@@ -305,10 +305,12 @@ pub(crate) async fn handle_view_change<
305
305
std:: mem:: replace ( & mut task_state. timeout_task , new_timeout_task) . abort ( ) ;
306
306
307
307
let old_view_leader_key = task_state
308
- . membership
309
- . read ( )
308
+ . membership_coordinator
309
+ . membership_for_epoch ( task_state . cur_epoch )
310
310
. await
311
- . leader ( old_view_number, task_state. cur_epoch ) ?;
311
+ . context ( warn ! ( "No stake table for epoch" ) ) ?
312
+ . leader ( old_view_number)
313
+ . await ?;
312
314
313
315
let consensus_reader = task_state. consensus . read ( ) . await ;
314
316
consensus_reader
@@ -367,10 +369,12 @@ pub(crate) async fn handle_timeout<TYPES: NodeType, I: NodeImplementation<TYPES>
367
369
368
370
ensure ! (
369
371
task_state
370
- . membership
371
- . read ( )
372
+ . membership_coordinator
373
+ . membership_for_epoch ( epoch )
372
374
. await
373
- . has_stake( & task_state. public_key, epoch) ,
375
+ . context( warn!( "No stake table for epoch" ) ) ?
376
+ . has_stake( & task_state. public_key)
377
+ . await ,
374
378
debug!(
375
379
"We were not chosen for the consensus committee for view {:?}" ,
376
380
view_number
@@ -416,10 +420,12 @@ pub(crate) async fn handle_timeout<TYPES: NodeType, I: NodeImplementation<TYPES>
416
420
. await ;
417
421
418
422
let leader = task_state
419
- . membership
420
- . read ( )
423
+ . membership_coordinator
424
+ . membership_for_epoch ( task_state . cur_epoch )
421
425
. await
422
- . leader ( view_number, task_state. cur_epoch ) ;
426
+ . context ( warn ! ( "No stake table for epoch" ) ) ?
427
+ . leader ( view_number)
428
+ . await ;
423
429
424
430
let consensus_reader = task_state. consensus . read ( ) . await ;
425
431
consensus_reader. metrics . number_of_timeouts . add ( 1 ) ;
0 commit comments