7 #include <chainparams.h> 19 #include <boost/test/unit_test.hpp> 28 CBlock CreateBlock(
const CBlockIndex* prev,
const std::vector<CMutableTransaction>& txns,
const CScript& scriptPubKey);
29 bool BuildChain(
const CBlockIndex* pindex,
const CScript& coinbase_script_pub_key,
size_t length, std::vector<std::shared_ptr<CBlock>>& chain);
37 BOOST_ERROR(
"ComputeFilter failed on block " << block_index->
nHeight);
43 std::vector<BlockFilter> filters;
44 std::vector<uint256> filter_hashes;
61 filter_hashes.clear();
62 last_header = filter_header;
67 const std::vector<CMutableTransaction>& txns,
71 CBlock& block = pblocktemplate->block;
93 const CScript& coinbase_script_pub_key,
95 std::vector<std::shared_ptr<CBlock>>& chain)
97 std::vector<CMutableTransaction> no_txns;
100 for (
auto& block : chain) {
101 block = std::make_shared<CBlock>(
CreateBlock(pindex, no_txns, coinbase_script_pub_key));
116 BOOST_REQUIRE(filter_index.
Init());
126 std::vector<BlockFilter> filters;
127 std::vector<uint256> filter_hashes;
130 block_index !=
nullptr;
141 BOOST_CHECK(!filter_index.BlockUntilSyncedToCurrentChain());
153 block_index !=
nullptr;
165 CKey coinbase_key_A, coinbase_key_B;
170 std::vector<std::shared_ptr<CBlock>> chainA, chainB;
171 BOOST_REQUIRE(BuildChain(tip, coinbase_script_pub_key_A, 10, chainA));
172 BOOST_REQUIRE(BuildChain(tip, coinbase_script_pub_key_B, 10, chainB));
175 uint256 chainA_last_header = last_header;
176 for (
size_t i = 0; i < 2; i++) {
177 const auto& block = chainA[i];
180 for (
size_t i = 0; i < 2; i++) {
181 const auto& block = chainA[i];
185 block_index =
m_node.
chainman->m_blockman.LookupBlockIndex(block->GetHash());
188 BOOST_CHECK(filter_index.BlockUntilSyncedToCurrentChain());
193 uint256 chainB_last_header = last_header;
194 for (
size_t i = 0; i < 3; i++) {
195 const auto& block = chainB[i];
198 for (
size_t i = 0; i < 3; i++) {
199 const auto& block = chainB[i];
203 block_index =
m_node.
chainman->m_blockman.LookupBlockIndex(block->GetHash());
206 BOOST_CHECK(filter_index.BlockUntilSyncedToCurrentChain());
211 chainA_last_header = last_header;
212 for (
size_t i = 0; i < 2; i++) {
213 const auto& block = chainA[i];
217 block_index =
m_node.
chainman->m_blockman.LookupBlockIndex(block->GetHash());
220 BOOST_CHECK(filter_index.BlockUntilSyncedToCurrentChain());
225 for (
size_t i = 2; i < 4; i++) {
226 const auto& block = chainA[i];
231 chainA_last_header = last_header;
232 chainB_last_header = last_header;
233 for (
size_t i = 0; i < 3; i++) {
238 block_index =
m_node.
chainman->m_blockman.LookupBlockIndex(chainA[i]->GetHash());
240 BOOST_CHECK(filter_index.BlockUntilSyncedToCurrentChain());
245 block_index =
m_node.
chainman->m_blockman.LookupBlockIndex(chainB[i]->GetHash());
247 BOOST_CHECK(filter_index.BlockUntilSyncedToCurrentChain());
252 std::vector<BlockFilter> filters;
253 std::vector<uint256> filter_hashes;
267 filter_hashes.clear();
269 filter_index.Interrupt();
bool LookupFilter(const CBlockIndex *block_index, BlockFilter &filter_out) const
Get a single filter by block.
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
void IndexWaitSynced(const BaseIndex &index)
Block until the index is synced to the current chain.
bool Init()
Initializes the sync state and registers the instance to the validation interface so that it stays in...
bool InitBlockFilterIndex(std::function< std::unique_ptr< interfaces::Chain >()> make_chain, BlockFilterType filter_type, size_t n_cache_size, bool f_memory, bool f_wipe)
Initialize a block filter index for the given type if one does not already exist. ...
Generate a new block, without valid proof-of-work.
CPubKey GetPubKey() const
Compute the public key from a private key.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
void ForEachBlockFilterIndex(std::function< void(BlockFilterIndex &)> fn)
Iterate over all running block filter indexes, invoking fn on each.
uint256 GetHash() const
Compute the filter hash.
void Stop()
Stops the instance from staying in sync with blockchain updates.
std::unique_ptr< CTxMemPool > mempool
uint256 GetBlockHash() const
static bool CheckFilterLookups(BlockFilterIndex &filter_index, const CBlockIndex *block_index, uint256 &last_header, const BlockManager &blockman)
bool ComputeFilter(BlockFilterType filter_type, const CBlockIndex &block_index, BlockFilter &filter, const BlockManager &blockman)
bool LookupFilterHeader(const CBlockIndex *block_index, uint256 &header_out) EXCLUSIVE_LOCKS_REQUIRED(!m_cs_headers_cache)
Get a single filter header by block.
Complete block filter struct as defined in BIP 157.
BOOST_AUTO_TEST_SUITE_END()
void DestroyAllBlockFilterIndexes()
Destroy all open block filter indexes.
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
Maintains a tree of blocks (stored in m_block_index) which is consulted to determine where the most-w...
bool LookupFilterHashRange(int start_height, const CBlockIndex *stop_index, std::vector< uint256 > &hashes_out) const
Get a range of filter hashes between two heights on a chain.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Testing fixture that pre-creates a 100-block REGTEST-mode block chain.
bool CheckProofOfWork(uint256 hash, unsigned int nBits, const Consensus::Params ¶ms)
Check whether a block hash satisfies the proof-of-work requirement specified by nBits.
CScript GetScriptForDestination(const CTxDestination &dest)
Generate a Bitcoin scriptPubKey for the given CTxDestination.
static CTransactionRef MakeTransactionRef(Tx &&txIn)
bool StartBackgroundSync()
Starts the initial sync process.
BOOST_FIXTURE_TEST_CASE(blockfilter_index_initial_sync, BuildChainTestingSetup)
bool BuildChain(const CBlockIndex *pindex, const CScript &coinbase_script_pub_key, size_t length, std::vector< std::shared_ptr< CBlock >> &chain)
std::vector< CTransactionRef > vtx
std::unique_ptr< Chain > MakeChain(node::NodeContext &node)
Return implementation of Chain interface.
#define BOOST_CHECK_EQUAL(v1, v2)
The block chain is a tree shaped structure starting with the genesis block at the root...
bool DestroyBlockFilterIndex(BlockFilterType filter_type)
Destroy the block filter index with the given type.
Serialized script, used inside transaction inputs and outputs.
BlockFilterType GetFilterType() const
CBlock CreateBlock(const CBlockIndex *prev, const std::vector< CMutableTransaction > &txns, const CScript &scriptPubKey)
BOOST_AUTO_TEST_SUITE(cuckoocache_tests)
Test Suite for CuckooCache.
A mutable version of CTransaction.
An encapsulated private key.
int nHeight
height of the entry in the chain. The genesis block has height 0
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
bool LookupFilterRange(int start_height, const CBlockIndex *stop_index, std::vector< BlockFilter > &filters_out) const
Get a range of filters between two heights on a chain.
std::unique_ptr< ChainstateManager > chainman
#define Assert(val)
Identity function.
#define BOOST_CHECK(expr)