diff --git a/src/blockfilter.cpp b/src/blockfilter.cpp index 1119b549015..124cbcfd927 100644 --- a/src/blockfilter.cpp +++ b/src/blockfilter.cpp @@ -233,3 +233,24 @@ BlockFilter::BlockFilter(BlockFilterType filter_type, const CBlock& block, const throw std::invalid_argument("unknown filter_type"); } } + +uint256 BlockFilter::GetHash() const +{ + const std::vector& data = GetEncodedFilter(); + + uint256 result; + CHash256().Write(data.data(), data.size()).Finalize(result.begin()); + return result; +} + +uint256 BlockFilter::ComputeHeader(const uint256& prev_header) const +{ + const uint256& filter_hash = GetHash(); + + uint256 result; + CHash256() + .Write(filter_hash.begin(), filter_hash.size()) + .Write(prev_header.begin(), prev_header.size()) + .Finalize(result.begin()); + return result; +} diff --git a/src/blockfilter.h b/src/blockfilter.h index 010f868aeea..46833ac0be2 100644 --- a/src/blockfilter.h +++ b/src/blockfilter.h @@ -106,6 +106,12 @@ public: return m_filter.GetEncoded(); } + // Compute the filter hash. + uint256 GetHash() const; + + // Compute the filter header given the previous one. + uint256 ComputeHeader(const uint256& prev_header) const; + template void Serialize(Stream& s) const { s << m_block_hash