@@ -30,6 +30,7 @@ use crate::{
30
30
} ;
31
31
use snarkos_account:: Account ;
32
32
use snarkos_node_bft_ledger_service:: LedgerService ;
33
+ use snarkos_node_sync:: BlockSync ;
33
34
use snarkvm:: {
34
35
console:: account:: Address ,
35
36
ledger:: {
@@ -69,9 +70,9 @@ use tokio::{
69
70
70
71
#[ derive( Clone ) ]
71
72
pub struct BFT < N : Network > {
72
- /// The primary.
73
+ /// The primary for this node .
73
74
primary : Primary < N > ,
74
- /// The DAG.
75
+ /// The DAG of batches from which we build the blockchain .
75
76
dag : Arc < RwLock < DAG < N > > > ,
76
77
/// The batch certificate of the leader from the current even round, if one was present.
77
78
leader_certificate : Arc < RwLock < Option < BatchCertificate < N > > > > ,
@@ -91,12 +92,13 @@ impl<N: Network> BFT<N> {
91
92
account : Account < N > ,
92
93
storage : Storage < N > ,
93
94
ledger : Arc < dyn LedgerService < N > > ,
95
+ block_sync : Arc < BlockSync < N > > ,
94
96
ip : Option < SocketAddr > ,
95
97
trusted_validators : & [ SocketAddr ] ,
96
98
storage_mode : StorageMode ,
97
99
) -> Result < Self > {
98
100
Ok ( Self {
99
- primary : Primary :: new ( account, storage, ledger, ip, trusted_validators, storage_mode) ?,
101
+ primary : Primary :: new ( account, storage, ledger, block_sync , ip, trusted_validators, storage_mode) ?,
100
102
dag : Default :: default ( ) ,
101
103
leader_certificate : Default :: default ( ) ,
102
104
leader_certificate_timer : Default :: default ( ) ,
@@ -931,6 +933,7 @@ mod tests {
931
933
use snarkos_account:: Account ;
932
934
use snarkos_node_bft_ledger_service:: MockLedgerService ;
933
935
use snarkos_node_bft_storage_service:: BFTMemoryService ;
936
+ use snarkos_node_sync:: BlockSync ;
934
937
use snarkvm:: {
935
938
console:: account:: { Address , PrivateKey } ,
936
939
ledger:: {
@@ -970,6 +973,18 @@ mod tests {
970
973
( committee, account, ledger, storage)
971
974
}
972
975
976
+ // Helper function to set up BFT for testing.
977
+ fn initialize_bft (
978
+ account : Account < CurrentNetwork > ,
979
+ storage : Storage < CurrentNetwork > ,
980
+ ledger : Arc < MockLedgerService < CurrentNetwork > > ,
981
+ ) -> anyhow:: Result < BFT < CurrentNetwork > > {
982
+ // Create the block synchronization logic.
983
+ let block_sync = Arc :: new ( BlockSync :: new ( ledger. clone ( ) ) ) ;
984
+ // Initialize the BFT.
985
+ BFT :: new ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) , block_sync, None , & [ ] , StorageMode :: new_test ( None ) )
986
+ }
987
+
973
988
#[ test]
974
989
#[ tracing_test:: traced_test]
975
990
fn test_is_leader_quorum_odd ( ) -> Result < ( ) > {
@@ -1001,7 +1016,7 @@ mod tests {
1001
1016
// Initialize the account.
1002
1017
let account = Account :: new ( rng) ?;
1003
1018
// Initialize the BFT.
1004
- let bft = BFT :: new ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1019
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1005
1020
assert ! ( bft. is_timer_expired( ) ) ;
1006
1021
// Ensure this call succeeds on an odd round.
1007
1022
let result = bft. is_leader_quorum_or_nonleaders_available ( 1 ) ;
@@ -1035,8 +1050,8 @@ mod tests {
1035
1050
assert_eq ! ( storage. current_round( ) , 1 ) ;
1036
1051
assert_eq ! ( storage. max_gc_rounds( ) , 10 ) ;
1037
1052
1038
- // Initialize the BFT.
1039
- let bft = BFT :: new ( account, storage, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1053
+ // Set up the BFT logic .
1054
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1040
1055
assert ! ( bft. is_timer_expired( ) ) ; // 0 + 5 < now()
1041
1056
1042
1057
// Store is at round 1, and we are checking for round 2.
@@ -1057,8 +1072,8 @@ mod tests {
1057
1072
assert_eq ! ( storage. current_round( ) , 2 ) ;
1058
1073
assert_eq ! ( storage. max_gc_rounds( ) , 10 ) ;
1059
1074
1060
- // Initialize the BFT.
1061
- let bft = BFT :: new ( account, storage, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1075
+ // Set up the BFT logic .
1076
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1062
1077
assert ! ( bft. is_timer_expired( ) ) ; // 0 + 5 < now()
1063
1078
1064
1079
// Ensure this call fails on an even round.
@@ -1097,8 +1112,11 @@ mod tests {
1097
1112
let storage = Storage :: new ( ledger. clone ( ) , Arc :: new ( BFTMemoryService :: new ( ) ) , 10 ) ;
1098
1113
// Initialize the account.
1099
1114
let account = Account :: new ( rng) ?;
1100
- // Initialize the BFT.
1101
- let bft = BFT :: new ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1115
+
1116
+ // Set up the BFT logic.
1117
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1118
+ assert ! ( bft. is_timer_expired( ) ) ; // 0 + 5 < now()
1119
+
1102
1120
// Set the leader certificate.
1103
1121
let leader_certificate = sample_batch_certificate_for_round ( 2 , rng) ;
1104
1122
* bft. leader_certificate . write ( ) = Some ( leader_certificate) ;
@@ -1110,8 +1128,7 @@ mod tests {
1110
1128
assert ! ( result) ;
1111
1129
1112
1130
// Initialize a new BFT.
1113
- let bft_timer =
1114
- BFT :: new ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1131
+ let bft_timer = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1115
1132
// If the leader certificate is not set and the timer has not expired, we are not ready for the next round.
1116
1133
let result = bft_timer. is_even_round_ready_for_next_round ( certificates. clone ( ) , committee. clone ( ) , 2 ) ;
1117
1134
if !bft_timer. is_timer_expired ( ) {
@@ -1142,7 +1159,8 @@ mod tests {
1142
1159
assert_eq ! ( storage. max_gc_rounds( ) , 10 ) ;
1143
1160
1144
1161
// Initialize the BFT.
1145
- let bft = BFT :: new ( account, storage, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1162
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1163
+ assert ! ( bft. is_timer_expired( ) ) ; // 0 + 5 < now()
1146
1164
1147
1165
// Ensure this call fails on an odd round.
1148
1166
let result = bft. update_leader_certificate_to_even_round ( 1 ) ;
@@ -1160,7 +1178,7 @@ mod tests {
1160
1178
assert_eq ! ( storage. max_gc_rounds( ) , 10 ) ;
1161
1179
1162
1180
// Initialize the BFT.
1163
- let bft = BFT :: new ( account, storage, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1181
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1164
1182
1165
1183
// Ensure this call succeeds on an even round.
1166
1184
let result = bft. update_leader_certificate_to_even_round ( 6 ) ;
@@ -1212,7 +1230,7 @@ mod tests {
1212
1230
1213
1231
// Initialize the BFT.
1214
1232
let account = Account :: new ( rng) ?;
1215
- let bft = BFT :: new ( account, storage. clone ( ) , ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1233
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1216
1234
1217
1235
// Set the leader certificate.
1218
1236
* bft. leader_certificate . write ( ) = Some ( leader_certificate) ;
@@ -1250,7 +1268,7 @@ mod tests {
1250
1268
// Initialize the storage.
1251
1269
let storage = Storage :: new ( ledger. clone ( ) , Arc :: new ( BFTMemoryService :: new ( ) ) , 1 ) ;
1252
1270
// Initialize the BFT.
1253
- let bft = BFT :: new ( account. clone ( ) , storage, ledger . clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1271
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger . clone ( ) ) ?;
1254
1272
1255
1273
// Insert a mock DAG in the BFT.
1256
1274
* bft. dag . write ( ) = crate :: helpers:: dag:: test_helpers:: mock_dag_with_modified_last_committed_round ( 3 ) ;
@@ -1280,7 +1298,7 @@ mod tests {
1280
1298
// Initialize the storage.
1281
1299
let storage = Storage :: new ( ledger. clone ( ) , Arc :: new ( BFTMemoryService :: new ( ) ) , 1 ) ;
1282
1300
// Initialize the BFT.
1283
- let bft = BFT :: new ( account, storage, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1301
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1284
1302
1285
1303
// Insert a mock DAG in the BFT.
1286
1304
* bft. dag . write ( ) = crate :: helpers:: dag:: test_helpers:: mock_dag_with_modified_last_committed_round ( 2 ) ;
@@ -1338,7 +1356,7 @@ mod tests {
1338
1356
/* Test missing previous certificate. */
1339
1357
1340
1358
// Initialize the BFT.
1341
- let bft = BFT :: new ( account, storage, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1359
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1342
1360
1343
1361
// The expected error message.
1344
1362
let error_msg = format ! (
@@ -1399,8 +1417,8 @@ mod tests {
1399
1417
1400
1418
// Initialize the BFT.
1401
1419
let account = Account :: new ( rng) ?;
1402
- let bft = BFT :: new ( account, storage. clone ( ) , ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1403
- // Insert a mock DAG in the BFT.
1420
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger. clone ( ) ) ?;
1421
+
1404
1422
* bft. dag . write ( ) = crate :: helpers:: dag:: test_helpers:: mock_dag_with_modified_last_committed_round ( commit_round) ;
1405
1423
1406
1424
// Ensure that the `gc_round` has not been updated yet.
@@ -1465,7 +1483,7 @@ mod tests {
1465
1483
1466
1484
// Initialize the BFT.
1467
1485
let account = Account :: new ( rng) ?;
1468
- let bft = BFT :: new ( account. clone ( ) , storage, ledger . clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1486
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger . clone ( ) ) ?;
1469
1487
1470
1488
// Insert a mock DAG in the BFT.
1471
1489
* bft. dag . write ( ) = crate :: helpers:: dag:: test_helpers:: mock_dag_with_modified_last_committed_round ( commit_round) ;
@@ -1483,7 +1501,7 @@ mod tests {
1483
1501
// Initialize a new instance of storage.
1484
1502
let storage_2 = Storage :: new ( ledger. clone ( ) , Arc :: new ( BFTMemoryService :: new ( ) ) , max_gc_rounds) ;
1485
1503
// Initialize a new instance of BFT.
1486
- let bootup_bft = BFT :: new ( account, storage_2, ledger, None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1504
+ let bootup_bft = initialize_bft ( account. clone ( ) , storage_2, ledger) ?;
1487
1505
1488
1506
// Sync the BFT DAG at bootup.
1489
1507
bootup_bft. sync_bft_dag_at_bootup ( certificates. clone ( ) ) . await ;
@@ -1637,7 +1655,7 @@ mod tests {
1637
1655
1638
1656
// Initialize the BFT without bootup.
1639
1657
let account = Account :: new ( rng) ?;
1640
- let bft = BFT :: new ( account. clone ( ) , storage, ledger . clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1658
+ let bft = initialize_bft ( account. clone ( ) , storage. clone ( ) , ledger . clone ( ) ) ?;
1641
1659
1642
1660
// Insert a mock DAG in the BFT without bootup.
1643
1661
* bft. dag . write ( ) = crate :: helpers:: dag:: test_helpers:: mock_dag_with_modified_last_committed_round ( 0 ) ;
@@ -1662,8 +1680,7 @@ mod tests {
1662
1680
let bootup_storage = Storage :: new ( ledger. clone ( ) , Arc :: new ( BFTMemoryService :: new ( ) ) , max_gc_rounds) ;
1663
1681
1664
1682
// Initialize a new instance of BFT with bootup.
1665
- let bootup_bft =
1666
- BFT :: new ( account, bootup_storage. clone ( ) , ledger. clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ?;
1683
+ let bootup_bft = initialize_bft ( account. clone ( ) , bootup_storage. clone ( ) , ledger. clone ( ) ) ?;
1667
1684
1668
1685
// Sync the BFT DAG at bootup.
1669
1686
bootup_bft. sync_bft_dag_at_bootup ( pre_shutdown_certificates. clone ( ) ) . await ;
@@ -1841,8 +1858,8 @@ mod tests {
1841
1858
}
1842
1859
// Initialize the bootup BFT.
1843
1860
let account = Account :: new ( rng) ?;
1844
- let bootup_bft =
1845
- BFT :: new ( account . clone ( ) , storage . clone ( ) , ledger . clone ( ) , None , & [ ] , StorageMode :: new_test ( None ) ) ? ;
1861
+ let bootup_bft = initialize_bft ( account . clone ( ) , storage . clone ( ) , ledger . clone ( ) ) ? ;
1862
+
1846
1863
// Insert a mock DAG in the BFT without bootup.
1847
1864
* bootup_bft. dag . write ( ) = crate :: helpers:: dag:: test_helpers:: mock_dag_with_modified_last_committed_round ( 0 ) ;
1848
1865
// Sync the BFT DAG at bootup.
0 commit comments