mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-11 14:38:29 +01:00
add chain interface methods for using BIP 157 block filters
This is useful for speeding up wallet rescans and is based on an earlier version from PR #15845 ("wallet: Fast rescan with BIP157 block filters"), which was never merged. Co-authored-by: MacroFake <falke.marco@gmail.com>
This commit is contained in:
@@ -5,6 +5,7 @@
|
|||||||
#ifndef BITCOIN_INTERFACES_CHAIN_H
|
#ifndef BITCOIN_INTERFACES_CHAIN_H
|
||||||
#define BITCOIN_INTERFACES_CHAIN_H
|
#define BITCOIN_INTERFACES_CHAIN_H
|
||||||
|
|
||||||
|
#include <blockfilter.h>
|
||||||
#include <primitives/transaction.h> // For CTransactionRef
|
#include <primitives/transaction.h> // For CTransactionRef
|
||||||
#include <util/settings.h> // For util::SettingsValue
|
#include <util/settings.h> // For util::SettingsValue
|
||||||
|
|
||||||
@@ -143,6 +144,13 @@ public:
|
|||||||
//! or one of its ancestors.
|
//! or one of its ancestors.
|
||||||
virtual std::optional<int> findLocatorFork(const CBlockLocator& locator) = 0;
|
virtual std::optional<int> findLocatorFork(const CBlockLocator& locator) = 0;
|
||||||
|
|
||||||
|
//! Returns whether a block filter index is available.
|
||||||
|
virtual bool hasBlockFilterIndex(BlockFilterType filter_type) = 0;
|
||||||
|
|
||||||
|
//! Returns whether any of the elements match the block via a BIP 157 block filter
|
||||||
|
//! or std::nullopt if the block filter for this block couldn't be found.
|
||||||
|
virtual std::optional<bool> blockFilterMatchesAny(BlockFilterType filter_type, const uint256& block_hash, const GCSFilter::ElementSet& filter_set) = 0;
|
||||||
|
|
||||||
//! Return whether node has the block and optionally return block metadata
|
//! Return whether node has the block and optionally return block metadata
|
||||||
//! or contents.
|
//! or contents.
|
||||||
virtual bool findBlock(const uint256& hash, const FoundBlock& block={}) = 0;
|
virtual bool findBlock(const uint256& hash, const FoundBlock& block={}) = 0;
|
||||||
|
|||||||
@@ -4,10 +4,12 @@
|
|||||||
|
|
||||||
#include <addrdb.h>
|
#include <addrdb.h>
|
||||||
#include <banman.h>
|
#include <banman.h>
|
||||||
|
#include <blockfilter.h>
|
||||||
#include <chain.h>
|
#include <chain.h>
|
||||||
#include <chainparams.h>
|
#include <chainparams.h>
|
||||||
#include <deploymentstatus.h>
|
#include <deploymentstatus.h>
|
||||||
#include <external_signer.h>
|
#include <external_signer.h>
|
||||||
|
#include <index/blockfilterindex.h>
|
||||||
#include <init.h>
|
#include <init.h>
|
||||||
#include <interfaces/chain.h>
|
#include <interfaces/chain.h>
|
||||||
#include <interfaces/handler.h>
|
#include <interfaces/handler.h>
|
||||||
@@ -536,6 +538,20 @@ public:
|
|||||||
}
|
}
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
}
|
}
|
||||||
|
bool hasBlockFilterIndex(BlockFilterType filter_type) override
|
||||||
|
{
|
||||||
|
return GetBlockFilterIndex(filter_type) != nullptr;
|
||||||
|
}
|
||||||
|
std::optional<bool> blockFilterMatchesAny(BlockFilterType filter_type, const uint256& block_hash, const GCSFilter::ElementSet& filter_set) override
|
||||||
|
{
|
||||||
|
const BlockFilterIndex* block_filter_index{GetBlockFilterIndex(filter_type)};
|
||||||
|
if (!block_filter_index) return std::nullopt;
|
||||||
|
|
||||||
|
BlockFilter filter;
|
||||||
|
const CBlockIndex* index{WITH_LOCK(::cs_main, return chainman().m_blockman.LookupBlockIndex(block_hash))};
|
||||||
|
if (index == nullptr || !block_filter_index->LookupFilter(index, filter)) return std::nullopt;
|
||||||
|
return filter.GetFilter().MatchAny(filter_set);
|
||||||
|
}
|
||||||
bool findBlock(const uint256& hash, const FoundBlock& block) override
|
bool findBlock(const uint256& hash, const FoundBlock& block) override
|
||||||
{
|
{
|
||||||
WAIT_LOCK(cs_main, lock);
|
WAIT_LOCK(cs_main, lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user