daemon: guard against rare 'difficulty drift' bug with checkpoints and recalculation

On startup, it checks against the difficulty checkpoints, and if any mismatch is found, recalculates all the blocks with wrong difficulties. Additionally, once a week it recalculates difficulties of blocks after the last difficulty checkpoint.
This commit is contained in:
stoffu
2020-05-15 10:56:23 +09:00
parent ff4d470629
commit 7bd66b01bf
10 changed files with 280 additions and 48 deletions
+7
View File
@@ -1662,6 +1662,7 @@ namespace cryptonote
m_check_disk_space_interval.do_call(boost::bind(&core::check_disk_space, this));
m_block_rate_interval.do_call(boost::bind(&core::check_block_rate, this));
m_blockchain_pruning_interval.do_call(boost::bind(&core::update_blockchain_pruning, this));
m_diff_recalc_interval.do_call(boost::bind(&core::recalculate_difficulties, this));
m_miner.on_idle();
m_mempool.on_idle();
return true;
@@ -1923,6 +1924,12 @@ namespace cryptonote
return true;
}
//-----------------------------------------------------------------------------------------------
bool core::recalculate_difficulties()
{
m_blockchain_storage.recalculate_difficulties();
return true;
}
//-----------------------------------------------------------------------------------------------
void core::flush_bad_txs_cache()
{
bad_semantics_txes_lock.lock();