aboutsummaryrefslogtreecommitdiff
path: root/src/wallet/wallet2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wallet/wallet2.cpp')
-rw-r--r--src/wallet/wallet2.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/wallet/wallet2.cpp b/src/wallet/wallet2.cpp
index c462f49f9..769d4bb7b 100644
--- a/src/wallet/wallet2.cpp
+++ b/src/wallet/wallet2.cpp
@@ -2969,6 +2969,10 @@ void wallet2::process_new_blockchain_entry(const cryptonote::block& b, const cry
"block transactions=" + std::to_string(bche.txs.size()) +
" not match with daemon response size=" + std::to_string(parsed_block.o_indices.indices.size()));
+ THROW_WALLET_EXCEPTION_IF(height != m_blockchain.size(), error::wallet_internal_error,
+ "New blockchain entry mismatch: block height " + std::to_string(height) +
+ " is not the expected next height " + std::to_string(m_blockchain.size()));
+
//handle transactions from new block
//optimization: seeking only for blocks that are not older then the wallet creation time plus 1 day. 1 day is for possible user incorrect time setup
@@ -3186,13 +3190,12 @@ void wallet2::pull_hashes(uint64_t start_height, uint64_t &blocks_start_height,
hashes = std::move(res.m_block_ids);
}
//----------------------------------------------------------------------------------------------------
-void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<parsed_block> &parsed_blocks, uint64_t& blocks_added, std::map<std::pair<uint64_t, uint64_t>, size_t> *output_tracker_cache)
+void wallet2::process_parsed_blocks(const uint64_t start_height, const std::vector<cryptonote::block_complete_entry> &blocks, const std::vector<parsed_block> &parsed_blocks, uint64_t& blocks_added, std::map<std::pair<uint64_t, uint64_t>, size_t> *output_tracker_cache)
{
- size_t current_index = start_height;
blocks_added = 0;
THROW_WALLET_EXCEPTION_IF(blocks.size() != parsed_blocks.size(), error::wallet_internal_error, "size mismatch");
- THROW_WALLET_EXCEPTION_IF(!m_blockchain.is_in_bounds(current_index), error::out_of_hashchain_bounds_error);
+ THROW_WALLET_EXCEPTION_IF(!m_blockchain.is_in_bounds(start_height), error::out_of_hashchain_bounds_error);
tools::threadpool& tpool = tools::threadpool::getInstanceForCompute();
tools::threadpool::waiter waiter(tpool);
@@ -3203,8 +3206,22 @@ void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cry
num_txes += 1 + parsed_blocks[i].txes.size();
tx_cache_data.resize(num_txes);
size_t txidx = 0;
+ crypto::hash prev_block_id;
+ bool has_prev_block = m_blockchain.is_in_bounds(start_height - 1);
+ if (has_prev_block) {
+ prev_block_id = m_blockchain[start_height - 1];
+ }
for (size_t i = 0; i < blocks.size(); ++i)
{
+ if (has_prev_block) {
+ THROW_WALLET_EXCEPTION_IF(prev_block_id != parsed_blocks[i].block.prev_id, error::wallet_internal_error,
+ "Parent block hash mismatch at height " + std::to_string(start_height + i) +
+ ": expected " + string_tools::pod_to_hex(prev_block_id) +
+ ", but received a new block with prev_id " + string_tools::pod_to_hex(parsed_blocks[i].block.prev_id));
+ }
+ prev_block_id = parsed_blocks[i].hash;
+ has_prev_block = true;
+
THROW_WALLET_EXCEPTION_IF(parsed_blocks[i].txes.size() != parsed_blocks[i].block.tx_hashes.size(),
error::wallet_internal_error, "Mismatched parsed_blocks[i].txes.size() and parsed_blocks[i].block.tx_hashes.size()");
if (should_skip_block(parsed_blocks[i].block, start_height + i))
@@ -3344,6 +3361,7 @@ void wallet2::process_parsed_blocks(uint64_t start_height, const std::vector<cry
hwdev.set_mode(hw::device::NONE);
+ size_t current_index = start_height;
size_t tx_cache_data_offset = 0;
for (size_t i = 0; i < blocks.size(); ++i)
{