@@ -37,6 +37,7 @@ use hotshot_types::{
37
37
} ,
38
38
traits:: {
39
39
consensus_api:: ConsensusApi ,
40
+ election:: Membership ,
40
41
node_implementation:: { ConsensusTime , NodeType , Versions } ,
41
42
BlockPayload ,
42
43
} ,
@@ -46,7 +47,7 @@ use rand::{thread_rng, Rng};
46
47
use sha2:: { Digest , Sha256 } ;
47
48
48
49
use crate :: helpers:: {
49
- build_cert, build_da_certificate, build_vid_proposal, da_payload_commitment, key_pair_for_id ,
50
+ build_cert, build_da_certificate, build_vid_proposal, da_payload_commitment, TestNodeKeyMap ,
50
51
} ;
51
52
52
53
#[ derive( Clone ) ]
@@ -57,6 +58,7 @@ pub struct TestView {
57
58
pub view_number : ViewNumber ,
58
59
pub epoch_number : Option < EpochNumber > ,
59
60
pub membership : Arc < RwLock < <TestTypes as NodeType >:: Membership > > ,
61
+ pub node_key_map : Arc < TestNodeKeyMap > ,
60
62
pub vid_disperse : Proposal < TestTypes , VidDisperse < TestTypes > > ,
61
63
pub vid_proposal : (
62
64
Vec < Proposal < TestTypes , VidDisperseShare < TestTypes > > > ,
@@ -73,8 +75,31 @@ pub struct TestView {
73
75
}
74
76
75
77
impl TestView {
78
+ async fn find_leader_key_pair (
79
+ membership : & Arc < RwLock < <TestTypes as NodeType >:: Membership > > ,
80
+ node_key_map : & Arc < TestNodeKeyMap > ,
81
+ view_number : <TestTypes as NodeType >:: View ,
82
+ epoch : Option < <TestTypes as NodeType >:: Epoch > ,
83
+ ) -> (
84
+ <<TestTypes as NodeType >:: SignatureKey as SignatureKey >:: PrivateKey ,
85
+ <TestTypes as NodeType >:: SignatureKey ,
86
+ ) {
87
+ let membership_reader = membership. read ( ) . await ;
88
+ let leader = membership_reader
89
+ . leader ( view_number, epoch)
90
+ . expect ( "expected Membership::leader to succeed" ) ;
91
+ drop ( membership_reader) ;
92
+
93
+ let sk = node_key_map
94
+ . get ( & leader)
95
+ . expect ( "expected Membership::leader public key to be in node_key_map" ) ;
96
+
97
+ ( sk. clone ( ) , leader)
98
+ }
99
+
76
100
pub async fn genesis < V : Versions > (
77
101
membership : & Arc < RwLock < <TestTypes as NodeType >:: Membership > > ,
102
+ node_key_map : Arc < TestNodeKeyMap > ,
78
103
) -> Self {
79
104
let genesis_view = ViewNumber :: new ( 1 ) ;
80
105
let genesis_epoch = genesis_epoch_from_version :: < V , TestTypes > ( ) ;
@@ -96,7 +121,10 @@ impl TestView {
96
121
& metadata,
97
122
) ;
98
123
99
- let ( private_key, public_key) = key_pair_for_id :: < TestTypes > ( * genesis_view) ;
124
+ //let (private_key, public_key) = key_pair_for_id::<TestTypes>(*genesis_view);
125
+ let ( private_key, public_key) =
126
+ Self :: find_leader_key_pair ( membership, & node_key_map, genesis_view, genesis_epoch)
127
+ . await ;
100
128
101
129
let leader_public_key = public_key;
102
130
@@ -198,6 +226,7 @@ impl TestView {
198
226
view_number : genesis_view,
199
227
epoch_number : genesis_epoch,
200
228
membership : membership. clone ( ) ,
229
+ node_key_map,
201
230
vid_disperse,
202
231
vid_proposal : ( vid_proposal, public_key) ,
203
232
da_certificate,
@@ -235,9 +264,19 @@ impl TestView {
235
264
epoch : old_epoch,
236
265
} ;
237
266
238
- let ( old_private_key, old_public_key) = key_pair_for_id :: < TestTypes > ( * old_view) ;
267
+ //let (old_private_key, old_public_key) = key_pair_for_id::<TestTypes>(*old_view);
268
+ let ( old_private_key, old_public_key) =
269
+ Self :: find_leader_key_pair ( & self . membership , & self . node_key_map , old_view, old_epoch)
270
+ . await ;
239
271
240
- let ( private_key, public_key) = key_pair_for_id :: < TestTypes > ( * next_view) ;
272
+ //let (private_key, public_key) = key_pair_for_id::<TestTypes>(*next_view);
273
+ let ( private_key, public_key) = Self :: find_leader_key_pair (
274
+ & self . membership ,
275
+ & self . node_key_map ,
276
+ next_view,
277
+ self . epoch_number ,
278
+ )
279
+ . await ;
241
280
242
281
let leader_public_key = public_key;
243
282
@@ -441,6 +480,7 @@ impl TestView {
441
480
view_number : next_view,
442
481
epoch_number : self . epoch_number ,
443
482
membership : self . membership . clone ( ) ,
483
+ node_key_map : self . node_key_map . clone ( ) ,
444
484
vid_disperse,
445
485
vid_proposal : ( vid_proposal, public_key) ,
446
486
da_certificate,
@@ -517,14 +557,19 @@ impl TestView {
517
557
pub struct TestViewGenerator < V : Versions > {
518
558
pub current_view : Option < TestView > ,
519
559
pub membership : Arc < RwLock < <TestTypes as NodeType >:: Membership > > ,
560
+ pub node_key_map : Arc < TestNodeKeyMap > ,
520
561
pub _pd : PhantomData < fn ( V ) > ,
521
562
}
522
563
523
564
impl < V : Versions > TestViewGenerator < V > {
524
- pub fn generate ( membership : Arc < RwLock < <TestTypes as NodeType >:: Membership > > ) -> Self {
565
+ pub fn generate (
566
+ membership : Arc < RwLock < <TestTypes as NodeType >:: Membership > > ,
567
+ node_key_map : Arc < TestNodeKeyMap > ,
568
+ ) -> Self {
525
569
TestViewGenerator {
526
570
current_view : None ,
527
571
membership,
572
+ node_key_map,
528
573
_pd : PhantomData ,
529
574
}
530
575
}
@@ -603,12 +648,13 @@ impl<V: Versions> Stream for TestViewGenerator<V> {
603
648
604
649
fn poll_next ( mut self : Pin < & mut Self > , cx : & mut Context < ' _ > ) -> Poll < Option < Self :: Item > > {
605
650
let mem = Arc :: clone ( & self . membership ) ;
651
+ let nkm = Arc :: clone ( & self . node_key_map ) ;
606
652
let curr_view = & self . current_view . clone ( ) ;
607
653
608
654
let mut fut = if let Some ( ref view) = curr_view {
609
655
async move { TestView :: next_view ( view) . await } . boxed ( )
610
656
} else {
611
- async move { TestView :: genesis :: < V > ( & mem) . await } . boxed ( )
657
+ async move { TestView :: genesis :: < V > ( & mem, nkm ) . await } . boxed ( )
612
658
} ;
613
659
614
660
match fut. as_mut ( ) . poll ( cx) {
0 commit comments