0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-10 10:52:31 -05:00

blockfilter: Additional constructors for BlockFilter.

This commit is contained in:
Jim Posen 2018-08-27 15:08:31 -07:00
parent 20b812993a
commit c30620983d
3 changed files with 32 additions and 4 deletions

View file

@ -221,6 +221,17 @@ static GCSFilter::ElementSet BasicFilterElements(const CBlock& block,
return elements; return elements;
} }
BlockFilter::BlockFilter(BlockFilterType filter_type, const uint256& block_hash,
std::vector<unsigned char> filter)
: m_filter_type(filter_type), m_block_hash(block_hash)
{
GCSFilter::Params params;
if (!BuildParams(params)) {
throw std::invalid_argument("unknown filter_type");
}
m_filter = GCSFilter(params, std::move(filter));
}
BlockFilter::BlockFilter(BlockFilterType filter_type, const CBlock& block, const CBlockUndo& block_undo) BlockFilter::BlockFilter(BlockFilterType filter_type, const CBlock& block, const CBlockUndo& block_undo)
: m_filter_type(filter_type), m_block_hash(block.GetHash()) : m_filter_type(filter_type), m_block_hash(block.GetHash())
{ {

View file

@ -103,11 +103,17 @@ private:
public: public:
// Construct a new BlockFilter of the specified type from a block. BlockFilter() = default;
//! Reconstruct a BlockFilter from parts.
BlockFilter(BlockFilterType filter_type, const uint256& block_hash,
std::vector<unsigned char> filter);
//! Construct a new BlockFilter of the specified type from a block.
BlockFilter(BlockFilterType filter_type, const CBlock& block, const CBlockUndo& block_undo); BlockFilter(BlockFilterType filter_type, const CBlock& block, const CBlockUndo& block_undo);
BlockFilterType GetFilterType() const { return m_filter_type; } BlockFilterType GetFilterType() const { return m_filter_type; }
const uint256& GetBlockHash() const { return m_block_hash; }
const GCSFilter& GetFilter() const { return m_filter; } const GCSFilter& GetFilter() const { return m_filter; }
const std::vector<unsigned char>& GetEncodedFilter() const const std::vector<unsigned char>& GetEncodedFilter() const
@ -115,10 +121,10 @@ public:
return m_filter.GetEncoded(); return m_filter.GetEncoded();
} }
// Compute the filter hash. //! Compute the filter hash.
uint256 GetHash() const; uint256 GetHash() const;
// Compute the filter header given the previous one. //! Compute the filter header given the previous one.
uint256 ComputeHeader(const uint256& prev_header) const; uint256 ComputeHeader(const uint256& prev_header) const;
template <typename Stream> template <typename Stream>

View file

@ -101,6 +101,17 @@ BOOST_AUTO_TEST_CASE(blockfilter_basic_test)
for (const CScript& script : excluded_scripts) { for (const CScript& script : excluded_scripts) {
BOOST_CHECK(!filter.Match(GCSFilter::Element(script.begin(), script.end()))); BOOST_CHECK(!filter.Match(GCSFilter::Element(script.begin(), script.end())));
} }
// Test serialization/unserialization.
BlockFilter block_filter2;
CDataStream stream(SER_NETWORK, PROTOCOL_VERSION);
stream << block_filter;
stream >> block_filter2;
BOOST_CHECK_EQUAL(block_filter.GetFilterType(), block_filter2.GetFilterType());
BOOST_CHECK_EQUAL(block_filter.GetBlockHash(), block_filter2.GetBlockHash());
BOOST_CHECK(block_filter.GetEncodedFilter() == block_filter2.GetEncodedFilter());
} }
BOOST_AUTO_TEST_CASE(blockfilters_json_test) BOOST_AUTO_TEST_CASE(blockfilters_json_test)