From 79a31ce57cf913bd868177eb31e6a208aa546352 Mon Sep 17 00:00:00 2001 From: SChernykh Date: Wed, 16 Nov 2022 14:23:13 +0100 Subject: [PATCH] SideChain: reduce lock scope in get_outputs_blob --- src/side_chain.cpp | 57 +++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/side_chain.cpp b/src/side_chain.cpp index d51f04a..88c8eb5 100644 --- a/src/side_chain.cpp +++ b/src/side_chain.cpp @@ -696,37 +696,38 @@ bool SideChain::get_outputs_blob(PoolBlock* block, uint64_t total_reward, std::v { blob.clear(); - ReadLock lock(m_sidechainLock); - - auto it = m_blocksById.find(block->m_sidechainId); - if (it != m_blocksById.end()) { - PoolBlock* b = it->second; - const size_t n = b->m_outputs.size(); - - blob.reserve(n * 39 + 64); - writeVarint(n, blob); - - const uint8_t tx_type = b->get_tx_type(); - - for (const PoolBlock::TxOutput& output : b->m_outputs) { - writeVarint(output.m_reward, blob); - blob.emplace_back(tx_type); - blob.insert(blob.end(), output.m_ephPublicKey.h, output.m_ephPublicKey.h + HASH_SIZE); - - if (tx_type == TXOUT_TO_TAGGED_KEY) { - blob.emplace_back(static_cast(output.m_viewTag)); - } - } - - block->m_outputs = b->m_outputs; - return true; - } - std::vector tmpShares; std::vector tmpRewards; + { + ReadLock lock(m_sidechainLock); - if (!get_shares(block, tmpShares) || !split_reward(total_reward, tmpShares, tmpRewards) || (tmpRewards.size() != tmpShares.size())) { - return false; + auto it = m_blocksById.find(block->m_sidechainId); + if (it != m_blocksById.end()) { + PoolBlock* b = it->second; + const size_t n = b->m_outputs.size(); + + blob.reserve(n * 39 + 64); + writeVarint(n, blob); + + const uint8_t tx_type = b->get_tx_type(); + + for (const PoolBlock::TxOutput& output : b->m_outputs) { + writeVarint(output.m_reward, blob); + blob.emplace_back(tx_type); + blob.insert(blob.end(), output.m_ephPublicKey.h, output.m_ephPublicKey.h + HASH_SIZE); + + if (tx_type == TXOUT_TO_TAGGED_KEY) { + blob.emplace_back(static_cast(output.m_viewTag)); + } + } + + block->m_outputs = b->m_outputs; + return true; + } + + if (!get_shares(block, tmpShares) || !split_reward(total_reward, tmpShares, tmpRewards) || (tmpRewards.size() != tmpShares.size())) { + return false; + } } const size_t n = tmpShares.size();