From b70ab128fceeeb1e193f349f6a4ebb2af4df1a8d Mon Sep 17 00:00:00 2001 From: moneromooo-monero Date: Sun, 22 Jan 2017 12:20:55 +0000 Subject: [PATCH] rpc: fix orphan_status when getting blocks It was always set to false, even for orphan blocks --- src/cryptonote_core/blockchain.cpp | 6 +++++- src/cryptonote_core/blockchain.h | 3 ++- src/cryptonote_core/cryptonote_core.cpp | 4 ++-- src/cryptonote_core/cryptonote_core.h | 2 +- src/rpc/core_rpc_server.cpp | 10 ++++++---- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/cryptonote_core/blockchain.cpp b/src/cryptonote_core/blockchain.cpp index 8f1f0b260..789687ce0 100644 --- a/src/cryptonote_core/blockchain.cpp +++ b/src/cryptonote_core/blockchain.cpp @@ -636,7 +636,7 @@ crypto::hash Blockchain::get_block_id_by_height(uint64_t height) const return null_hash; } //------------------------------------------------------------------ -bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk) const +bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan) const { LOG_PRINT_L3("Blockchain::" << __func__); CRITICAL_REGION_LOCAL(m_blockchain_lock); @@ -645,6 +645,8 @@ bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk) const try { blk = m_db->get_block(h); + if (orphan) + *orphan = false; return true; } // try to find block in alternative chain @@ -654,6 +656,8 @@ bool Blockchain::get_block_by_hash(const crypto::hash &h, block &blk) const if (m_alternative_chains.end() != it_alt) { blk = it_alt->second.bl; + if (orphan) + *orphan = true; return true; } } diff --git a/src/cryptonote_core/blockchain.h b/src/cryptonote_core/blockchain.h index 245dc6e73..ca665e1d4 100644 --- a/src/cryptonote_core/blockchain.h +++ b/src/cryptonote_core/blockchain.h @@ -197,10 +197,11 @@ namespace cryptonote * * @param h the hash to look for * @param blk return-by-reference variable to put result block in + * @param orphan if non-NULL, will be set to true if not in the main chain, false otherwise * * @return true if the block was found, else false */ - bool get_block_by_hash(const crypto::hash &h, block &blk) const; + bool get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan = NULL) const; /** * @brief get all block hashes (main chain, alt chains, and invalid blocks) diff --git a/src/cryptonote_core/cryptonote_core.cpp b/src/cryptonote_core/cryptonote_core.cpp index 5294431d6..055606769 100644 --- a/src/cryptonote_core/cryptonote_core.cpp +++ b/src/cryptonote_core/cryptonote_core.cpp @@ -977,9 +977,9 @@ namespace cryptonote return m_blockchain_storage.get_block_id_by_height(height); } //----------------------------------------------------------------------------------------------- - bool core::get_block_by_hash(const crypto::hash &h, block &blk) const + bool core::get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan) const { - return m_blockchain_storage.get_block_by_hash(h, blk); + return m_blockchain_storage.get_block_by_hash(h, blk, orphan); } //----------------------------------------------------------------------------------------------- std::string core::print_pool(bool short_format) const diff --git a/src/cryptonote_core/cryptonote_core.h b/src/cryptonote_core/cryptonote_core.h index fa67ff265..89d018399 100644 --- a/src/cryptonote_core/cryptonote_core.h +++ b/src/cryptonote_core/cryptonote_core.h @@ -330,7 +330,7 @@ namespace cryptonote * * @note see Blockchain::get_block_by_hash */ - bool get_block_by_hash(const crypto::hash &h, block &blk) const; + bool get_block_by_hash(const crypto::hash &h, block &blk, bool *orphan = NULL) const; /** * @copydoc Blockchain::get_alternative_blocks diff --git a/src/rpc/core_rpc_server.cpp b/src/rpc/core_rpc_server.cpp index 1c5c321da..7d896e491 100644 --- a/src/rpc/core_rpc_server.cpp +++ b/src/rpc/core_rpc_server.cpp @@ -985,7 +985,8 @@ namespace cryptonote return false; } block blk; - bool have_block = m_core.get_block_by_hash(block_hash, blk); + bool orphan = false; + bool have_block = m_core.get_block_by_hash(block_hash, blk, &orphan); if (!have_block) { error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR; @@ -999,7 +1000,7 @@ namespace cryptonote return false; } uint64_t block_height = boost::get(blk.miner_tx.vin.front()).height; - bool response_filled = fill_block_header_response(blk, false, block_height, block_hash, res.block_header); + bool response_filled = fill_block_header_response(blk, orphan, block_height, block_hash, res.block_header); if (!response_filled) { error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR; @@ -1123,7 +1124,8 @@ namespace cryptonote block_hash = m_core.get_block_id_by_height(req.height); } block blk; - bool have_block = m_core.get_block_by_hash(block_hash, blk); + bool orphan = false; + bool have_block = m_core.get_block_by_hash(block_hash, blk, &orphan); if (!have_block) { error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR; @@ -1137,7 +1139,7 @@ namespace cryptonote return false; } uint64_t block_height = boost::get(blk.miner_tx.vin.front()).height; - bool response_filled = fill_block_header_response(blk, false, block_height, block_hash, res.block_header); + bool response_filled = fill_block_header_response(blk, orphan, block_height, block_hash, res.block_header); if (!response_filled) { error_resp.code = CORE_RPC_ERROR_CODE_INTERNAL_ERROR;