aboutsummaryrefslogtreecommitdiff
path: root/src/blockchain_db/lmdb
diff options
context:
space:
mode:
authorAlexander Blair <snipa@jagtech.io>2020-07-19 03:36:39 -0700
committerAlexander Blair <snipa@jagtech.io>2020-07-19 03:36:39 -0700
commit36d50d93f295d4b193e73f3ff3e95ae7e050c767 (patch)
treec8c7b69c5b0f769fdf1f72460462851597506d88 /src/blockchain_db/lmdb
parentMerge pull request #6529 (diff)
parentdaemon: guard against rare 'difficulty drift' bug with checkpoints and recalc... (diff)
downloadmonero-36d50d93f295d4b193e73f3ff3e95ae7e050c767.tar.xz
Merge pull request #6534
7bd66b01b daemon: guard against rare 'difficulty drift' bug with checkpoints and recalculation (stoffu)
Diffstat (limited to 'src/blockchain_db/lmdb')
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.cpp38
-rw-r--r--src/blockchain_db/lmdb/db_lmdb.h2
2 files changed, 40 insertions, 0 deletions
diff --git a/src/blockchain_db/lmdb/db_lmdb.cpp b/src/blockchain_db/lmdb/db_lmdb.cpp
index e81e0e270..c90eabdfe 100644
--- a/src/blockchain_db/lmdb/db_lmdb.cpp
+++ b/src/blockchain_db/lmdb/db_lmdb.cpp
@@ -2750,6 +2750,44 @@ difficulty_type BlockchainLMDB::get_block_difficulty(const uint64_t& height) con
return diff1 - diff2;
}
+void BlockchainLMDB::correct_block_cumulative_difficulties(const uint64_t& start_height, const std::vector<difficulty_type>& new_cumulative_difficulties)
+{
+ LOG_PRINT_L3("BlockchainLMDB::" << __func__);
+ check_open();
+ mdb_txn_cursors *m_cursors = &m_wcursors;
+
+ int result = 0;
+ block_wtxn_start();
+ CURSOR(block_info)
+
+ const uint64_t bc_height = height();
+ if (start_height + new_cumulative_difficulties.size() != bc_height)
+ {
+ block_wtxn_abort();
+ throw0(DB_ERROR("Incorrect new_cumulative_difficulties size"));
+ }
+
+ for (uint64_t height = start_height; height < bc_height; ++height)
+ {
+ MDB_val_set(key, height);
+ result = mdb_cursor_get(m_cur_block_info, (MDB_val *)&zerokval, &key, MDB_GET_BOTH);
+ if (result)
+ throw1(BLOCK_DNE(lmdb_error("Failed to get block info: ", result).c_str()));
+
+ mdb_block_info bi = *(mdb_block_info*)key.mv_data;
+ const difficulty_type d = new_cumulative_difficulties[height - start_height];
+ bi.bi_diff_hi = ((d >> 64) & 0xffffffffffffffff).convert_to<uint64_t>();
+ bi.bi_diff_lo = (d & 0xffffffffffffffff).convert_to<uint64_t>();
+
+ MDB_val_set(key2, height);
+ MDB_val_set(val, bi);
+ result = mdb_cursor_put(m_cur_block_info, &key2, &val, MDB_CURRENT);
+ if (result)
+ throw0(DB_ERROR(lmdb_error("Failed to overwrite block info to db transaction: ", result).c_str()));
+ }
+ block_wtxn_stop();
+}
+
uint64_t BlockchainLMDB::get_block_already_generated_coins(const uint64_t& height) const
{
LOG_PRINT_L3("BlockchainLMDB::" << __func__);
diff --git a/src/blockchain_db/lmdb/db_lmdb.h b/src/blockchain_db/lmdb/db_lmdb.h
index f2e4d763a..58e36b15a 100644
--- a/src/blockchain_db/lmdb/db_lmdb.h
+++ b/src/blockchain_db/lmdb/db_lmdb.h
@@ -229,6 +229,8 @@ public:
virtual difficulty_type get_block_difficulty(const uint64_t& height) const;
+ virtual void correct_block_cumulative_difficulties(const uint64_t& start_height, const std::vector<difficulty_type>& new_cumulative_difficulties);
+
virtual uint64_t get_block_already_generated_coins(const uint64_t& height) const;
virtual uint64_t get_block_long_term_weight(const uint64_t& height) const;