Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Index for BIP 157 block filters #14121

merged 12 commits into from Apr 18, 2019

blockfilter: Functions to translate filter types to/from names.

  • Loading branch information...
jimpo committed Aug 27, 2018
commit ba6ff9a6f70139594362b4b4a6b816707bb165c8
@@ -15,6 +15,10 @@ static constexpr int GCS_SER_TYPE = SER_NETWORK;
/// Protocol version used to serialize parameters in GCS filter encoding.
static constexpr int GCS_SER_VERSION = 0;

static const std::map<BlockFilterType, std::string> g_filter_types = {
{BlockFilterType::BASIC, "basic"},
This conversation was marked as resolved by jimpo

This comment has been minimized.

Copy link

jamesob Mar 20, 2019


This commit (consisting only of this line diff) could probably be squashed into aab05e2.

This comment has been minimized.

Copy link

ryanofsky Mar 28, 2019


re: #14121 (comment)

In commit "blockfilter: Functions to translate filter types to/from names." (a0bd77e)

Previous github comment can be marked resolved.


template <typename OStream>
static void GolombRiceEncode(BitStreamWriter<OStream>& bitwriter, uint8_t P, uint64_t x)
@@ -197,6 +201,23 @@ bool GCSFilter::MatchAny(const ElementSet& elements) const
return MatchInternal(, queries.size());

const std::string& BlockFilterTypeName(BlockFilterType filter_type)
static std::string unknown_retval = "";
auto it = g_filter_types.find(filter_type);
return it != g_filter_types.end() ? it->second : unknown_retval;

bool BlockFilterTypeByName(const std::string& name, BlockFilterType& filter_type) {
for (const auto& entry : g_filter_types) {
if (entry.second == name) {
filter_type = entry.first;
return true;
return false;

static GCSFilter::ElementSet BasicFilterElements(const CBlock& block,
const CBlockUndo& block_undo)
@@ -6,6 +6,7 @@

#include <stdint.h>
#include <string>
#include <unordered_set>
#include <vector>

@@ -89,6 +90,12 @@ enum class BlockFilterType : uint8_t
INVALID = 255,

/** Get the human-readable name for a filter type. Returns empty string for unknown types. */
const std::string& BlockFilterTypeName(BlockFilterType filter_type);

/** Find a filter type by its human-readable name. */
bool BlockFilterTypeByName(const std::string& name, BlockFilterType& filter_type);

* Complete block filter struct as defined in BIP 157. Serialization matches
* payload of "cfilter" messages.
@@ -174,4 +174,16 @@ BOOST_AUTO_TEST_CASE(blockfilters_json_test)

BOOST_CHECK_EQUAL(BlockFilterTypeName(BlockFilterType::BASIC), "basic");
BOOST_CHECK_EQUAL(BlockFilterTypeName(static_cast<BlockFilterType>(255)), "");

BlockFilterType filter_type;
BOOST_CHECK(BlockFilterTypeByName("basic", filter_type));
BOOST_CHECK_EQUAL(filter_type, BlockFilterType::BASIC);

BOOST_CHECK(!BlockFilterTypeByName("unknown", filter_type));

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.