diff --git a/src/index/blockfilterindex.cpp b/src/index/blockfilterindex.cpp index 1085b4da77d..204e5d7e18b 100644 --- a/src/index/blockfilterindex.cpp +++ b/src/index/blockfilterindex.cpp @@ -222,6 +222,22 @@ size_t BlockFilterIndex::WriteFilterToDisk(FlatFilePos& pos, const BlockFilter& return data_size; } +std::optional BlockFilterIndex::ReadFilterHeader(int height, const uint256& expected_block_hash) +{ + std::pair read_out; + if (!m_db->Read(DBHeightKey(height), read_out)) { + return std::nullopt; + } + + if (read_out.first != expected_block_hash) { + LogError("%s: previous block header belongs to unexpected block %s; expected %s\n", + __func__, read_out.first.ToString(), expected_block_hash.ToString()); + return std::nullopt; + } + + return read_out.second.header; +} + bool BlockFilterIndex::CustomAppend(const interfaces::BlockInfo& block) { CBlockUndo block_undo; @@ -235,19 +251,9 @@ bool BlockFilterIndex::CustomAppend(const interfaces::BlockInfo& block) return false; } - std::pair read_out; - if (!m_db->Read(DBHeightKey(block.height - 1), read_out)) { - return false; - } - - uint256 expected_block_hash = *Assert(block.prev_hash); - if (read_out.first != expected_block_hash) { - LogError("%s: previous block header belongs to unexpected block %s; expected %s\n", - __func__, read_out.first.ToString(), expected_block_hash.ToString()); - return false; - } - - prev_header = read_out.second.header; + auto op_prev_header = ReadFilterHeader(block.height - 1, *Assert(block.prev_hash)); + if (!op_prev_header) return false; + prev_header = *op_prev_header; } BlockFilter filter(m_filter_type, *Assert(block.data), block_undo); diff --git a/src/index/blockfilterindex.h b/src/index/blockfilterindex.h index 1cfc21d00f4..01ba1025c87 100644 --- a/src/index/blockfilterindex.h +++ b/src/index/blockfilterindex.h @@ -46,6 +46,8 @@ private: bool Write(const BlockFilter& filter, uint32_t block_height, const uint256& filter_header); + std::optional ReadFilterHeader(int height, const uint256& expected_block_hash); + protected: bool CustomInit(const std::optional& block) override;