diff --git a/src/validator/consensus.rs b/src/validator/consensus.rs index e70c10cf3..1adfe588d 100644 --- a/src/validator/consensus.rs +++ b/src/validator/consensus.rs @@ -26,7 +26,10 @@ use sled_overlay::database::SledDbOverlayState; use smol::lock::RwLock; use crate::{ - blockchain::{BlockInfo, Blockchain, BlockchainOverlay, BlockchainOverlayPtr, Header}, + blockchain::{ + block_store::BlockDifficulty, BlockInfo, Blockchain, BlockchainOverlay, + BlockchainOverlayPtr, Header, + }, tx::Transaction, util::time::Timestamp, validator::{ @@ -539,8 +542,16 @@ impl Fork { // Calculate block rank let (target_distance_sq, hash_distance_sq) = block_rank(&proposal.block, &next_target)?; - // Update PoW module - self.module.append(proposal.block.header.timestamp, &next_difficulty); + // Generate block difficulty and update PoW module + let cummulative_difficulty = + self.module.cummulative_difficulty.clone() + next_difficulty.clone(); + let block_difficulty = BlockDifficulty::new( + proposal.block.header.height, + proposal.block.header.timestamp, + next_difficulty, + cummulative_difficulty, + ); + self.module.append_difficulty(&self.overlay, block_difficulty)?; // Update fork ranks self.targets_rank += target_distance_sq; diff --git a/src/validator/mod.rs b/src/validator/mod.rs index 211841f15..7d4f9b10c 100644 --- a/src/validator/mod.rs +++ b/src/validator/mod.rs @@ -358,12 +358,16 @@ impl Validator { let finalized_blocks = fork.overlay.lock().unwrap().get_blocks_by_hash(&finalized_proposals)?; - // Apply finalized proposals diffs + // Apply finalized proposals diffs and update PoW module + let mut module = self.consensus.module.write().await; info!(target: "validator::finalization", "Finalizing proposals:"); for (index, proposal) in finalized_proposals.iter().enumerate() { info!(target: "validator::finalization", "\t{} - {}", proposal, finalized_blocks[index].header.height); fork.overlay.lock().unwrap().overlay.lock().unwrap().apply_diff(&mut diffs[index])?; + let next_difficulty = module.next_difficulty()?; + module.append(finalized_blocks[index].header.timestamp, &next_difficulty); } + drop(module); drop(forks); // Reset forks starting with the finalized blocks