|
31 | 31 | bank_forks::BankForks, |
32 | 32 | }, |
33 | 33 | solana_version::version, |
34 | | - solana_votor::{common::block_timeout, event::LeaderWindowInfo, votor::LeaderWindowNotifier}, |
35 | | - solana_votor_messages::migration::MigrationStatus, |
| 34 | + solana_votor::{ |
| 35 | + common::block_timeout, consensus_rewards::ConsensusRewards, event::LeaderWindowInfo, |
| 36 | + votor::LeaderWindowNotifier, |
| 37 | + }, |
| 38 | + solana_votor_messages::{migration::MigrationStatus, rewards_certificate::RewardsCertificates}, |
36 | 39 | stats::{BlockCreationLoopMetrics, SlotMetrics}, |
37 | 40 | std::{ |
38 | 41 | sync::{ |
@@ -104,6 +107,7 @@ struct LeaderContext { |
104 | 107 | slot_status_notifier: Option<SlotStatusNotifier>, |
105 | 108 | banking_tracer: Arc<BankingTracer>, |
106 | 109 | replay_highest_frozen: Arc<ReplayHighestFrozen>, |
| 110 | + consensus_rewards: ConsensusRewards, |
107 | 111 |
|
108 | 112 | // Metrics |
109 | 113 | metrics: BlockCreationLoopMetrics, |
@@ -134,9 +138,14 @@ enum StartLeaderError { |
134 | 138 | ), |
135 | 139 | } |
136 | 140 |
|
137 | | -fn produce_block_footer(block_producer_time_nanos: u64) -> VersionedBlockMarker { |
| 141 | +fn produce_block_footer( |
| 142 | + block_producer_time_nanos: u64, |
| 143 | + rewards_certs: RewardsCertificates, |
| 144 | +) -> VersionedBlockMarker { |
138 | 145 | let footer = BlockFooterV1 { |
139 | 146 | block_producer_time_nanos, |
| 147 | + skip_rewards_certificate: rewards_certs.skip, |
| 148 | + notar_rewards_certificate: rewards_certs.notar, |
140 | 149 | block_user_agent: format!("agave/{}", version!()).into_bytes(), |
141 | 150 | }; |
142 | 151 |
|
@@ -181,14 +190,15 @@ fn start_loop(config: BlockCreationLoopConfig) { |
181 | 190 | blockstore, |
182 | 191 | poh_recorder: poh_recorder.clone(), |
183 | 192 | record_receiver, |
184 | | - leader_schedule_cache, |
| 193 | + leader_schedule_cache: leader_schedule_cache.clone(), |
185 | 194 | bank_forks, |
186 | 195 | rpc_subscriptions, |
187 | 196 | slot_status_notifier, |
188 | 197 | banking_tracer, |
189 | 198 | replay_highest_frozen, |
190 | 199 | metrics: BlockCreationLoopMetrics::default(), |
191 | 200 | slot_metrics: SlotMetrics::default(), |
| 201 | + consensus_rewards: ConsensusRewards::new(cluster_info.clone(), leader_schedule_cache), |
192 | 202 | }; |
193 | 203 |
|
194 | 204 | info!("{my_pubkey}: Block creation loop initialized"); |
@@ -301,6 +311,7 @@ fn produce_window( |
301 | 311 | if let Err(e) = record_and_complete_block( |
302 | 312 | ctx.poh_recorder.as_ref(), |
303 | 313 | &mut ctx.record_receiver, |
| 314 | + &mut ctx.consensus_rewards, |
304 | 315 | skip_timer, |
305 | 316 | timeout, |
306 | 317 | ) { |
@@ -342,6 +353,7 @@ fn produce_window( |
342 | 353 | fn record_and_complete_block( |
343 | 354 | poh_recorder: &RwLock<PohRecorder>, |
344 | 355 | record_receiver: &mut RecordReceiver, |
| 356 | + consensus_rewards: &mut ConsensusRewards, |
345 | 357 | block_timer: Instant, |
346 | 358 | block_timeout: Duration, |
347 | 359 | ) -> Result<(), PohRecorderError> { |
@@ -378,7 +390,9 @@ fn record_and_complete_block( |
378 | 390 | // Construct and send the block footer |
379 | 391 | let mut w_poh_recorder = poh_recorder.write().unwrap(); |
380 | 392 | let block_producer_time_nanos = w_poh_recorder.working_bank_block_producer_time_nanos(); |
381 | | - let footer = produce_block_footer(block_producer_time_nanos); |
| 393 | + // XXX: how to look up the slot. |
| 394 | + let rewards_certs = consensus_rewards.build_rewards_certs(u64::MAX); |
| 395 | + let footer = produce_block_footer(block_producer_time_nanos, rewards_certs); |
382 | 396 | w_poh_recorder.send_marker(footer)?; |
383 | 397 |
|
384 | 398 | // Alpentick and clear bank |
|
0 commit comments