@@ -21,7 +21,7 @@ use hotshot_types::{
21
21
use itertools:: Itertools ;
22
22
use std:: {
23
23
cmp:: max,
24
- collections:: { BTreeMap , BTreeSet , HashMap } ,
24
+ collections:: { BTreeSet , HashMap } ,
25
25
num:: NonZeroU64 ,
26
26
str:: FromStr ,
27
27
} ;
@@ -126,11 +126,17 @@ struct Committee {
126
126
/// leader but without voting rights.
127
127
eligible_leaders : Vec < StakeTableEntry < PubKey > > ,
128
128
129
- /// TODO: add comment
130
- indexed_stake_table : BTreeMap < PubKey , StakeTableEntry < PubKey > > ,
129
+ /// Keys for nodes participating in the network
130
+ stake_table : Vec < StakeTableEntry < PubKey > > ,
131
131
132
- /// TODO: comment
133
- indexed_da_members : BTreeMap < PubKey , StakeTableEntry < PubKey > > ,
132
+ /// Keys for DA members
133
+ da_members : Vec < StakeTableEntry < PubKey > > ,
134
+
135
+ /// Stake entries indexed by public key, for efficient lookup.
136
+ indexed_stake_table : HashMap < PubKey , StakeTableEntry < PubKey > > ,
137
+
138
+ /// DA entries indexed by public key, for efficient lookup.
139
+ indexed_da_members : HashMap < PubKey , StakeTableEntry < PubKey > > ,
134
140
}
135
141
136
142
impl EpochCommittees {
@@ -144,14 +150,18 @@ impl EpochCommittees {
144
150
// update events and building the table for us. We will need
145
151
// more subtlety when start fetching only the events since last update.
146
152
147
- let indexed_stake_table: BTreeMap < PubKey , _ > = st
153
+ let stake_table = st. stake_table . 0 . clone ( ) ;
154
+
155
+ let da_members = st. da_members . 0 . clone ( ) ;
156
+
157
+ let indexed_stake_table: HashMap < PubKey , _ > = st
148
158
. stake_table
149
159
. 0
150
160
. iter ( )
151
161
. map ( |entry| ( PubKey :: public_key ( entry) , entry. clone ( ) ) )
152
162
. collect ( ) ;
153
163
154
- let indexed_da_members: BTreeMap < PubKey , _ > = st
164
+ let indexed_da_members: HashMap < PubKey , _ > = st
155
165
. da_members
156
166
. 0
157
167
. iter ( )
@@ -167,6 +177,8 @@ impl EpochCommittees {
167
177
168
178
let committee = Committee {
169
179
eligible_leaders,
180
+ stake_table,
181
+ da_members,
170
182
indexed_stake_table,
171
183
indexed_da_members,
172
184
} ;
@@ -191,7 +203,7 @@ impl EpochCommittees {
191
203
. collect ( ) ;
192
204
193
205
// For each member, get the stake table entry
194
- let members : Vec < _ > = committee_members
206
+ let stake_table : Vec < _ > = committee_members
195
207
. iter ( )
196
208
. map ( |member| member. stake_table_entry . clone ( ) )
197
209
. filter ( |entry| entry. stake ( ) > U256 :: zero ( ) )
@@ -205,19 +217,21 @@ impl EpochCommittees {
205
217
. collect ( ) ;
206
218
207
219
// Index the stake table by public key
208
- let indexed_stake_table: BTreeMap < PubKey , _ > = members
220
+ let indexed_stake_table: HashMap < PubKey , _ > = stake_table
209
221
. iter ( )
210
222
. map ( |entry| ( PubKey :: public_key ( entry) , entry. clone ( ) ) )
211
223
. collect ( ) ;
212
224
213
225
// Index the stake table by public key
214
- let indexed_da_members: BTreeMap < PubKey , _ > = da_members
226
+ let indexed_da_members: HashMap < PubKey , _ > = da_members
215
227
. iter ( )
216
228
. map ( |entry| ( PubKey :: public_key ( entry) , entry. clone ( ) ) )
217
229
. collect ( ) ;
218
230
219
231
let members = Committee {
220
232
eligible_leaders,
233
+ stake_table,
234
+ da_members,
221
235
indexed_stake_table,
222
236
indexed_da_members,
223
237
} ;
@@ -259,7 +273,7 @@ impl Membership<SeqTypes> for EpochCommittees {
259
273
. collect ( ) ;
260
274
261
275
// For each member, get the stake table entry
262
- let members : Vec < _ > = committee_members
276
+ let stake_table : Vec < _ > = committee_members
263
277
. iter ( )
264
278
. map ( |member| member. stake_table_entry . clone ( ) )
265
279
. filter ( |entry| entry. stake ( ) > U256 :: zero ( ) )
@@ -273,19 +287,21 @@ impl Membership<SeqTypes> for EpochCommittees {
273
287
. collect ( ) ;
274
288
275
289
// Index the stake table by public key
276
- let indexed_stake_table: BTreeMap < PubKey , _ > = members
290
+ let indexed_stake_table: HashMap < PubKey , _ > = stake_table
277
291
. iter ( )
278
292
. map ( |entry| ( PubKey :: public_key ( entry) , entry. clone ( ) ) )
279
293
. collect ( ) ;
280
294
281
295
// Index the stake table by public key
282
- let indexed_da_members: BTreeMap < PubKey , _ > = da_members
296
+ let indexed_da_members: HashMap < PubKey , _ > = da_members
283
297
. iter ( )
284
298
. map ( |entry| ( PubKey :: public_key ( entry) , entry. clone ( ) ) )
285
299
. collect ( ) ;
286
300
287
301
let members = Committee {
288
302
eligible_leaders,
303
+ stake_table,
304
+ da_members,
289
305
indexed_stake_table,
290
306
indexed_da_members,
291
307
} ;
@@ -306,15 +322,15 @@ impl Membership<SeqTypes> for EpochCommittees {
306
322
/// Get the stake table for the current view
307
323
fn stake_table ( & self , epoch : Epoch ) -> Vec < StakeTableEntry < PubKey > > {
308
324
if let Some ( st) = self . state . get ( & epoch) {
309
- st. indexed_stake_table . clone ( ) . into_values ( ) . collect ( )
325
+ st. stake_table . clone ( )
310
326
} else {
311
327
vec ! [ ]
312
328
}
313
329
}
314
330
/// Get the stake table for the current view
315
331
fn da_stake_table ( & self , epoch : Epoch ) -> Vec < StakeTableEntry < PubKey > > {
316
332
if let Some ( sc) = self . state . get ( & epoch) {
317
- sc. indexed_da_members . clone ( ) . into_values ( ) . collect ( )
333
+ sc. da_members . clone ( )
318
334
} else {
319
335
vec ! [ ]
320
336
}
@@ -415,44 +431,44 @@ impl Membership<SeqTypes> for EpochCommittees {
415
431
fn total_nodes ( & self , epoch : Epoch ) -> usize {
416
432
self . state
417
433
. get ( & epoch)
418
- . map ( |sc| sc. indexed_stake_table . len ( ) )
434
+ . map ( |sc| sc. stake_table . len ( ) )
419
435
. unwrap_or_default ( )
420
436
}
421
437
422
438
/// Get the total number of DA nodes in the committee
423
439
fn da_total_nodes ( & self , epoch : Epoch ) -> usize {
424
440
self . state
425
441
. get ( & epoch)
426
- . map ( |sc : & Committee | sc. indexed_da_members . len ( ) )
442
+ . map ( |sc : & Committee | sc. da_members . len ( ) )
427
443
. unwrap_or_default ( )
428
444
}
429
445
430
446
/// Get the voting success threshold for the committee
431
447
fn success_threshold ( & self , epoch : Epoch ) -> NonZeroU64 {
432
- let quorum = self . state . get ( & epoch) . unwrap ( ) . indexed_stake_table . clone ( ) ;
433
- NonZeroU64 :: new ( ( ( quorum . len ( ) as u64 * 2 ) / 3 ) + 1 ) . unwrap ( )
448
+ let quorum_len = self . state . get ( & epoch) . unwrap ( ) . stake_table . len ( ) ;
449
+ NonZeroU64 :: new ( ( ( quorum_len as u64 * 2 ) / 3 ) + 1 ) . unwrap ( )
434
450
}
435
451
436
452
/// Get the voting success threshold for the committee
437
453
fn da_success_threshold ( & self , epoch : Epoch ) -> NonZeroU64 {
438
- let da = self . state . get ( & epoch) . unwrap ( ) . indexed_da_members . clone ( ) ;
439
- NonZeroU64 :: new ( ( ( da . len ( ) as u64 * 2 ) / 3 ) + 1 ) . unwrap ( )
454
+ let da_len = self . state . get ( & epoch) . unwrap ( ) . da_members . len ( ) ;
455
+ NonZeroU64 :: new ( ( ( da_len as u64 * 2 ) / 3 ) + 1 ) . unwrap ( )
440
456
}
441
457
442
458
/// Get the voting failure threshold for the committee
443
459
fn failure_threshold ( & self , epoch : Epoch ) -> NonZeroU64 {
444
- let quorum = self . state . get ( & epoch) . unwrap ( ) . indexed_stake_table . clone ( ) ;
460
+ let quorum_len = self . state . get ( & epoch) . unwrap ( ) . stake_table . len ( ) ;
445
461
446
- NonZeroU64 :: new ( ( ( quorum . len ( ) as u64 ) / 3 ) + 1 ) . unwrap ( )
462
+ NonZeroU64 :: new ( ( ( quorum_len as u64 ) / 3 ) + 1 ) . unwrap ( )
447
463
}
448
464
449
465
/// Get the voting upgrade threshold for the committee
450
466
fn upgrade_threshold ( & self , epoch : Epoch ) -> NonZeroU64 {
451
- let quorum = self . state . get ( & epoch) . unwrap ( ) . indexed_stake_table . clone ( ) ;
467
+ let quorum_len = self . state . get ( & epoch) . unwrap ( ) . indexed_stake_table . len ( ) ;
452
468
453
469
NonZeroU64 :: new ( max (
454
- ( quorum . len ( ) as u64 * 9 ) / 10 ,
455
- ( ( quorum . len ( ) as u64 * 2 ) / 3 ) + 1 ,
470
+ ( quorum_len as u64 * 9 ) / 10 ,
471
+ ( ( quorum_len as u64 * 2 ) / 3 ) + 1 ,
456
472
) )
457
473
. unwrap ( )
458
474
}
0 commit comments