@@ -27,7 +27,7 @@ use futures::{
27
27
Future , FutureExt , SinkExt , StreamExt ,
28
28
} ;
29
29
30
- use keystore :: KeyStorePtr ;
30
+ use sp_keystore :: SyncCryptoStorePtr ;
31
31
use polkadot_primitives:: v1:: {
32
32
CommittedCandidateReceipt , BackedCandidate , Id as ParaId , ValidatorId ,
33
33
ValidatorIndex , SigningContext , PoV ,
@@ -101,6 +101,7 @@ struct CandidateBackingJob {
101
101
seconded : Option < Hash > ,
102
102
/// We have already reported misbehaviors for these validators.
103
103
reported_misbehavior_for : HashSet < ValidatorIndex > ,
104
+ keystore : SyncCryptoStorePtr ,
104
105
table : Table < TableContext > ,
105
106
table_context : TableContext ,
106
107
metrics : Metrics ,
@@ -328,9 +329,12 @@ impl CandidateBackingJob {
328
329
} ;
329
330
330
331
let issued_statement = statement. is_some ( ) ;
331
- if let Some ( signed_statement) = statement. and_then ( |s| self . sign_statement ( s) ) {
332
- self . import_statement ( & signed_statement) . await ?;
333
- self . distribute_signed_statement ( signed_statement) . await ?;
332
+
333
+ if let Some ( statement) = statement {
334
+ if let Some ( signed_statement) = self . sign_statement ( statement) . await {
335
+ self . import_statement ( & signed_statement) . await ?;
336
+ self . distribute_signed_statement ( signed_statement) . await ?;
337
+ }
334
338
}
335
339
336
340
Ok ( issued_statement)
@@ -530,7 +534,7 @@ impl CandidateBackingJob {
530
534
531
535
self . issued_statements . insert ( candidate_hash) ;
532
536
533
- if let Some ( signed_statement) = self . sign_statement ( statement) {
537
+ if let Some ( signed_statement) = self . sign_statement ( statement) . await {
534
538
self . distribute_signed_statement ( signed_statement) . await ?;
535
539
}
536
540
@@ -553,8 +557,13 @@ impl CandidateBackingJob {
553
557
Ok ( ( ) )
554
558
}
555
559
556
- fn sign_statement ( & self , statement : Statement ) -> Option < SignedFullStatement > {
557
- let signed = self . table_context . validator . as_ref ( ) ?. sign ( statement) ;
560
+ async fn sign_statement ( & self , statement : Statement ) -> Option < SignedFullStatement > {
561
+ let signed = self . table_context
562
+ . validator
563
+ . as_ref ( ) ?
564
+ . sign ( self . keystore . clone ( ) , statement)
565
+ . await
566
+ . ok ( ) ?;
558
567
self . metrics . on_statement_signed ( ) ;
559
568
Some ( signed)
560
569
}
@@ -694,14 +703,14 @@ impl util::JobTrait for CandidateBackingJob {
694
703
type ToJob = ToJob ;
695
704
type FromJob = FromJob ;
696
705
type Error = Error ;
697
- type RunArgs = KeyStorePtr ;
706
+ type RunArgs = SyncCryptoStorePtr ;
698
707
type Metrics = Metrics ;
699
708
700
709
const NAME : & ' static str = "CandidateBackingJob" ;
701
710
702
711
fn run (
703
712
parent : Hash ,
704
- keystore : KeyStorePtr ,
713
+ keystore : SyncCryptoStorePtr ,
705
714
metrics : Metrics ,
706
715
rx_to : mpsc:: Receiver < Self :: ToJob > ,
707
716
mut tx_from : mpsc:: Sender < Self :: FromJob > ,
@@ -748,7 +757,7 @@ impl util::JobTrait for CandidateBackingJob {
748
757
& validators,
749
758
signing_context,
750
759
keystore. clone ( ) ,
751
- ) {
760
+ ) . await {
752
761
Ok ( v) => v,
753
762
Err ( util:: Error :: NotAValidator ) => { return Ok ( ( ) ) } ,
754
763
Err ( e) => {
@@ -802,6 +811,7 @@ impl util::JobTrait for CandidateBackingJob {
802
811
issued_statements : HashSet :: new ( ) ,
803
812
seconded : None ,
804
813
reported_misbehavior_for : HashSet :: new ( ) ,
814
+ keystore,
805
815
table : Table :: default ( ) ,
806
816
table_context,
807
817
metrics,
@@ -859,24 +869,26 @@ impl metrics::Metrics for Metrics {
859
869
}
860
870
}
861
871
862
- delegated_subsystem ! ( CandidateBackingJob ( KeyStorePtr , Metrics ) <- ToJob as CandidateBackingSubsystem ) ;
872
+ delegated_subsystem ! ( CandidateBackingJob ( SyncCryptoStorePtr , Metrics ) <- ToJob as CandidateBackingSubsystem ) ;
863
873
864
874
#[ cfg( test) ]
865
875
mod tests {
866
876
use super :: * ;
867
877
use assert_matches:: assert_matches;
868
- use futures:: { executor , future, Future } ;
878
+ use futures:: { future, Future } ;
869
879
use polkadot_primitives:: v1:: {
870
880
ScheduledCore , BlockData , CandidateCommitments ,
871
881
PersistedValidationData , ValidationData , TransientValidationData , HeadData ,
872
- ValidatorPair , ValidityAttestation , GroupRotationInfo ,
882
+ ValidityAttestation , GroupRotationInfo ,
873
883
} ;
874
884
use polkadot_subsystem:: {
875
885
messages:: RuntimeApiRequest ,
876
886
ActiveLeavesUpdate , FromOverseer , OverseerSignal ,
877
887
} ;
878
888
use polkadot_node_primitives:: InvalidCandidate ;
879
889
use sp_keyring:: Sr25519Keyring ;
890
+ use sp_application_crypto:: AppKey ;
891
+ use sp_keystore:: { CryptoStore , SyncCryptoStore } ;
880
892
use std:: collections:: HashMap ;
881
893
882
894
fn validator_pubkeys ( val_ids : & [ Sr25519Keyring ] ) -> Vec < ValidatorId > {
@@ -885,7 +897,7 @@ mod tests {
885
897
886
898
struct TestState {
887
899
chain_ids : Vec < ParaId > ,
888
- keystore : KeyStorePtr ,
900
+ keystore : SyncCryptoStorePtr ,
889
901
validators : Vec < Sr25519Keyring > ,
890
902
validator_public : Vec < ValidatorId > ,
891
903
validation_data : ValidationData ,
@@ -912,9 +924,9 @@ mod tests {
912
924
Sr25519Keyring :: Ferdie ,
913
925
] ;
914
926
915
- let keystore = keystore :: Store :: new_in_memory ( ) ;
927
+ let keystore = Arc :: new ( sc_keystore :: LocalKeystore :: in_memory ( ) ) ;
916
928
// Make sure `Alice` key is in the keystore, so this mocked node will be a parachain validator.
917
- keystore . write ( ) . insert_ephemeral_from_seed :: < ValidatorPair > ( & validators[ 0 ] . to_seed ( ) )
929
+ SyncCryptoStore :: sr25519_generate_new ( & * keystore , ValidatorId :: ID , Some ( & validators[ 0 ] . to_seed ( ) ) )
918
930
. expect ( "Insert key into keystore" ) ;
919
931
920
932
let validator_public = validator_pubkeys ( & validators) ;
@@ -985,7 +997,7 @@ mod tests {
985
997
virtual_overseer : polkadot_node_subsystem_test_helpers:: TestSubsystemContextHandle < CandidateBackingMessage > ,
986
998
}
987
999
988
- fn test_harness < T : Future < Output =( ) > > ( keystore : KeyStorePtr , test : impl FnOnce ( TestHarness ) -> T ) {
1000
+ fn test_harness < T : Future < Output =( ) > > ( keystore : SyncCryptoStorePtr , test : impl FnOnce ( TestHarness ) -> T ) {
989
1001
let pool = sp_core:: testing:: TaskExecutor :: new ( ) ;
990
1002
991
1003
let ( context, virtual_overseer) = polkadot_node_subsystem_test_helpers:: make_subsystem_context ( pool. clone ( ) ) ;
@@ -998,8 +1010,7 @@ mod tests {
998
1010
999
1011
futures:: pin_mut!( test_fut) ;
1000
1012
futures:: pin_mut!( subsystem) ;
1001
-
1002
- executor:: block_on ( future:: select ( test_fut, subsystem) ) ;
1013
+ futures:: executor:: block_on ( future:: select ( test_fut, subsystem) ) ;
1003
1014
}
1004
1015
1005
1016
fn make_erasure_root ( test : & TestState , pov : PoV ) -> Hash {
@@ -1203,20 +1214,29 @@ mod tests {
1203
1214
} . build ( ) ;
1204
1215
1205
1216
let candidate_a_hash = candidate_a. hash ( ) ;
1206
-
1217
+ let public0 = CryptoStore :: sr25519_generate_new (
1218
+ & * test_state. keystore ,
1219
+ ValidatorId :: ID , Some ( & test_state. validators [ 0 ] . to_seed ( ) )
1220
+ ) . await . expect ( "Insert key into keystore" ) ;
1221
+ let public2 = CryptoStore :: sr25519_generate_new (
1222
+ & * test_state. keystore ,
1223
+ ValidatorId :: ID , Some ( & test_state. validators [ 2 ] . to_seed ( ) )
1224
+ ) . await . expect ( "Insert key into keystore" ) ;
1207
1225
let signed_a = SignedFullStatement :: sign (
1226
+ & test_state. keystore ,
1208
1227
Statement :: Seconded ( candidate_a. clone ( ) ) ,
1209
1228
& test_state. signing_context ,
1210
1229
2 ,
1211
- & test_state . validators [ 2 ] . pair ( ) . into ( ) ,
1212
- ) ;
1230
+ & public2 . into ( ) ,
1231
+ ) . await . expect ( "should be signed" ) ;
1213
1232
1214
1233
let signed_b = SignedFullStatement :: sign (
1234
+ & test_state. keystore ,
1215
1235
Statement :: Valid ( candidate_a_hash) ,
1216
1236
& test_state. signing_context ,
1217
1237
0 ,
1218
- & test_state . validators [ 0 ] . pair ( ) . into ( ) ,
1219
- ) ;
1238
+ & public0 . into ( ) ,
1239
+ ) . await . expect ( "should be signed" ) ;
1220
1240
1221
1241
let statement = CandidateBackingMessage :: Statement ( test_state. relay_parent , signed_a. clone ( ) ) ;
1222
1242
@@ -1330,27 +1350,37 @@ mod tests {
1330
1350
} . build ( ) ;
1331
1351
1332
1352
let candidate_a_hash = candidate_a. hash ( ) ;
1333
-
1353
+ let public0 = CryptoStore :: sr25519_generate_new (
1354
+ & * test_state. keystore ,
1355
+ ValidatorId :: ID , Some ( & test_state. validators [ 0 ] . to_seed ( ) )
1356
+ ) . await . expect ( "Insert key into keystore" ) ;
1357
+ let public2 = CryptoStore :: sr25519_generate_new (
1358
+ & * test_state. keystore ,
1359
+ ValidatorId :: ID , Some ( & test_state. validators [ 2 ] . to_seed ( ) )
1360
+ ) . await . expect ( "Insert key into keystore" ) ;
1334
1361
let signed_a = SignedFullStatement :: sign (
1362
+ & test_state. keystore ,
1335
1363
Statement :: Seconded ( candidate_a. clone ( ) ) ,
1336
1364
& test_state. signing_context ,
1337
1365
2 ,
1338
- & test_state . validators [ 2 ] . pair ( ) . into ( ) ,
1339
- ) ;
1366
+ & public2 . into ( ) ,
1367
+ ) . await . expect ( "should be signed" ) ;
1340
1368
1341
1369
let signed_b = SignedFullStatement :: sign (
1370
+ & test_state. keystore ,
1342
1371
Statement :: Valid ( candidate_a_hash) ,
1343
1372
& test_state. signing_context ,
1344
1373
0 ,
1345
- & test_state . validators [ 0 ] . pair ( ) . into ( ) ,
1346
- ) ;
1374
+ & public0 . into ( ) ,
1375
+ ) . await . expect ( "should be signed" ) ;
1347
1376
1348
1377
let signed_c = SignedFullStatement :: sign (
1378
+ & test_state. keystore ,
1349
1379
Statement :: Invalid ( candidate_a_hash) ,
1350
1380
& test_state. signing_context ,
1351
1381
0 ,
1352
- & test_state . validators [ 0 ] . pair ( ) . into ( ) ,
1353
- ) ;
1382
+ & public0 . into ( ) ,
1383
+ ) . await . expect ( "should be signed" ) ;
1354
1384
1355
1385
let statement = CandidateBackingMessage :: Statement ( test_state. relay_parent , signed_a. clone ( ) ) ;
1356
1386
@@ -1600,12 +1630,18 @@ mod tests {
1600
1630
1601
1631
let candidate_hash = candidate. hash ( ) ;
1602
1632
1633
+ let validator2 = CryptoStore :: sr25519_generate_new (
1634
+ & * test_state. keystore ,
1635
+ ValidatorId :: ID , Some ( & test_state. validators [ 2 ] . to_seed ( ) )
1636
+ ) . await . expect ( "Insert key into keystore" ) ;
1637
+
1603
1638
let signed_a = SignedFullStatement :: sign (
1639
+ & test_state. keystore ,
1604
1640
Statement :: Seconded ( candidate. clone ( ) ) ,
1605
1641
& test_state. signing_context ,
1606
1642
2 ,
1607
- & test_state . validators [ 2 ] . pair ( ) . into ( ) ,
1608
- ) ;
1643
+ & validator2 . into ( ) ,
1644
+ ) . await . expect ( "should be signed" ) ;
1609
1645
1610
1646
// Send in a `Statement` with a candidate.
1611
1647
let statement = CandidateBackingMessage :: Statement (
@@ -1733,12 +1769,17 @@ mod tests {
1733
1769
..Default :: default ( )
1734
1770
} . build ( ) ;
1735
1771
1772
+ let public2 = CryptoStore :: sr25519_generate_new (
1773
+ & * test_state. keystore ,
1774
+ ValidatorId :: ID , Some ( & test_state. validators [ 2 ] . to_seed ( ) )
1775
+ ) . await . expect ( "Insert key into keystore" ) ;
1736
1776
let signed_a = SignedFullStatement :: sign (
1777
+ & test_state. keystore ,
1737
1778
Statement :: Seconded ( candidate. clone ( ) ) ,
1738
1779
& test_state. signing_context ,
1739
1780
2 ,
1740
- & test_state . validators [ 2 ] . pair ( ) . into ( ) ,
1741
- ) ;
1781
+ & public2 . into ( ) ,
1782
+ ) . await . expect ( "should be signed" ) ;
1742
1783
1743
1784
// Send in a `Statement` with a candidate.
1744
1785
let statement = CandidateBackingMessage :: Statement (
@@ -1869,12 +1910,17 @@ mod tests {
1869
1910
..Default :: default ( )
1870
1911
} . build ( ) ;
1871
1912
1913
+ let public2 = CryptoStore :: sr25519_generate_new (
1914
+ & * test_state. keystore ,
1915
+ ValidatorId :: ID , Some ( & test_state. validators [ 2 ] . to_seed ( ) )
1916
+ ) . await . expect ( "Insert key into keystore" ) ;
1872
1917
let seconding = SignedFullStatement :: sign (
1918
+ & test_state. keystore ,
1873
1919
Statement :: Seconded ( candidate_a. clone ( ) ) ,
1874
1920
& test_state. signing_context ,
1875
1921
2 ,
1876
- & test_state . validators [ 2 ] . pair ( ) . into ( ) ,
1877
- ) ;
1922
+ & public2 . into ( ) ,
1923
+ ) . await . expect ( "should be signed" ) ;
1878
1924
1879
1925
let statement = CandidateBackingMessage :: Statement (
1880
1926
test_state. relay_parent ,
0 commit comments