|
|
|
@ -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 <typename Stream>
|
|
|
|
|
void Serialize(Stream& s) const {
|
|
|
|
|
s << m_block_hash
|
|
|
|
|
<< static_cast<uint8_t>(m_filter_type)
|
|
|
|
|
<< m_filter.GetEncoded();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename Stream>
|
|
|
|
|
void Unserialize(Stream& s) {
|
|
|
|
|
std::vector<unsigned char> encoded_filter;
|
|
|
|
|
uint8_t filter_type;
|
|
|
|
|
|
|
|
|
|
s >> m_block_hash
|
|
|
|
|
>> filter_type
|
|
|
|
|
>> encoded_filter;
|
|
|
|
|
|
|
|
|
|
m_filter_type = static_cast<BlockFilterType>(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
|
|
|
|
|