From cd09c7925b5af4104834971cfe072251e3ac2bda Mon Sep 17 00:00:00 2001 From: Jim Posen Date: Tue, 23 Jan 2018 17:27:06 -0800 Subject: [PATCH] blockfilter: Serialization methods on BlockFilter. --- src/blockfilter.h | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/blockfilter.h b/src/blockfilter.h index afb8d7a7b..010f868ae 100644 --- a/src/blockfilter.h +++ b/src/blockfilter.h @@ -82,7 +82,8 @@ enum BlockFilterType : uint8_t }; /** - * Complete block filter struct as defined in BIP 157. + * Complete block filter struct as defined in BIP 157. Serialization matches + * payload of "cfilter" messages. */ class BlockFilter { @@ -104,6 +105,35 @@ public: { return m_filter.GetEncoded(); } + + template + void Serialize(Stream& s) const { + s << m_block_hash + << static_cast(m_filter_type) + << m_filter.GetEncoded(); + } + + template + void Unserialize(Stream& s) { + std::vector encoded_filter; + uint8_t filter_type; + + s >> m_block_hash + >> filter_type + >> encoded_filter; + + m_filter_type = static_cast(filter_type); + + switch (m_filter_type) { + case BlockFilterType::BASIC: + m_filter = GCSFilter(m_block_hash.GetUint64(0), m_block_hash.GetUint64(1), + BASIC_FILTER_P, BASIC_FILTER_M, std::move(encoded_filter)); + break; + + default: + throw std::ios_base::failure("unknown filter_type"); + } + } }; #endif // BITCOIN_BLOCKFILTER_H