11use std:: {
2- sync:: {
3- atomic:: { AtomicBool , Ordering } ,
4- Arc ,
5- } ,
2+ sync:: { atomic:: AtomicBool , Arc } ,
63 time:: { Duration , Instant } ,
74} ;
85
@@ -20,14 +17,16 @@ use kaspa_core::{
2017 tick:: { TickReason , TickService } ,
2118 } ,
2219 time:: unix_now,
23- trace, warn ,
20+ trace,
2421} ;
2522use kaspa_p2p_lib:: Hub ;
2623
27- use crate :: rules:: { blue_parents_only_rule:: BlueParentsOnlyRule , mining_rule:: MiningRule , no_transactions_rule:: NoTransactionsRule } ;
24+ use crate :: rules:: {
25+ blue_parents_only_rule:: BlueParentsOnlyRule , mining_rule:: MiningRule , no_transactions_rule:: NoTransactionsRule ,
26+ sync_rate_rule:: SyncRateRule , ExtraData ,
27+ } ;
2828
2929const RULE_ENGINE : & str = "mining-rule-engine" ;
30- const SYNC_RATE_THRESHOLD : f64 = 0.10 ;
3130
3231#[ derive( Clone ) ]
3332pub struct MiningRuleEngine {
@@ -68,59 +67,25 @@ impl MiningRuleEngine {
6867 let delta = & snapshot - & last_snapshot;
6968
7069 if elapsed_time. as_secs ( ) > 0 {
71- let expected_blocks = ( elapsed_time. as_millis ( ) as u64 ) / self . config . target_time_per_block ;
72- let received_blocks = delta. body_counts . max ( delta. header_counts ) ;
73- let rate: f64 = ( received_blocks as f64 ) / ( expected_blocks as f64 ) ;
74-
7570 let session = self . consensus_manager . consensus ( ) . unguarded_session ( ) ;
7671
7772 let finality_point = session. async_finality_point ( ) . await ;
7873 let finality_point_timestamp = session. async_get_header ( finality_point) . await . unwrap ( ) . timestamp ;
79- // Finality point is considered "recent" if it is within 3 finality durations from the current time
80- let is_finality_recent = finality_point_timestamp >= unix_now ( ) . saturating_sub ( self . config . finality_duration ( ) * 3 ) ;
81-
82- trace ! (
83- "Sync rate: {:.2} | Finality point recent: {} | Elapsed time: {}s | Connected: {} | Found/Expected blocks: {}/{}" ,
84- rate,
85- is_finality_recent,
86- elapsed_time. as_secs( ) ,
87- delta. body_counts,
88- self . has_sufficient_peer_connectivity( ) ,
89- expected_blocks,
90- ) ;
91-
92- if is_finality_recent && rate < SYNC_RATE_THRESHOLD {
93- // if sync rate rule conditions are met:
94- if let Ok ( false ) = self . use_sync_rate_rule . compare_exchange ( false , true , Ordering :: Relaxed , Ordering :: Relaxed ) {
95- warn ! ( "Sync rate {:.2} is below threshold: {}" , rate, SYNC_RATE_THRESHOLD ) ;
96- }
97- } else {
98- // else when sync rate conditions are not met:
99- if let Ok ( true ) = self . use_sync_rate_rule . compare_exchange ( true , false , Ordering :: Relaxed , Ordering :: Relaxed ) {
100- if !is_finality_recent {
101- warn ! ( "Sync rate {:.2} recovered: {} by entering IBD" , rate, SYNC_RATE_THRESHOLD ) ;
102- } else {
103- warn ! ( "Sync rate {:.2} recovered: {}" , rate, SYNC_RATE_THRESHOLD ) ;
104- }
105- } else if !is_finality_recent {
106- trace ! ( "Finality period is old. Timestamp: {}. Sync rate: {:.2}" , finality_point_timestamp, rate) ;
107- }
108- }
10974
110- // END - Sync monitor
75+ let extra_data = ExtraData {
76+ finality_point_timestamp,
77+ target_time_per_block : self . config . target_time_per_block ,
78+ has_sufficient_peer_connectivity : self . has_sufficient_peer_connectivity ( ) ,
79+ finality_duration : self . config . finality_duration ( ) ,
80+ elapsed_time,
81+ } ;
11182
112- // START - Rule Engine
11383 trace ! ( "Current Mining Rule: {:?}" , self . mining_rules) ;
11484
115- // Blue Parents Only Check:
85+ // Check for all the rules
11686 for rule in & self . rules {
117- rule. check_rule ( & snapshot ) ;
87+ rule. check_rule ( & delta , & extra_data ) ;
11888 }
119-
120- // No Transactions Check:
121- // TODO: implement this part
122-
123- // End - Rule Engine
12489 }
12590
12691 last_snapshot = snapshot;
@@ -136,21 +101,14 @@ impl MiningRuleEngine {
136101 hub : Hub ,
137102 mining_rules : Arc < MiningRules > ,
138103 ) -> Self {
104+ let use_sync_rate_rule = Arc :: new ( AtomicBool :: new ( false ) ) ;
139105 let rules: Vec < Arc < ( dyn MiningRule + ' static ) > > = vec ! [
106+ Arc :: new( SyncRateRule :: new( use_sync_rate_rule. clone( ) ) ) ,
140107 Arc :: new( BlueParentsOnlyRule :: new( mining_rules. blue_parents_only. clone( ) ) ) ,
141108 Arc :: new( NoTransactionsRule :: new( mining_rules. no_transactions. clone( ) ) ) ,
142109 ] ;
143110
144- Self {
145- consensus_manager,
146- config,
147- processing_counters,
148- tick_service,
149- hub,
150- use_sync_rate_rule : Arc :: new ( AtomicBool :: new ( false ) ) ,
151- mining_rules,
152- rules,
153- }
111+ Self { consensus_manager, config, processing_counters, tick_service, hub, use_sync_rate_rule, mining_rules, rules }
154112 }
155113
156114 pub fn should_mine ( & self , sink_daa_score_timestamp : DaaScoreTimestamp ) -> bool {
0 commit comments