17 #include <boost/test/unit_test.hpp>
26 CBlock CreateBlock(
const CBlockIndex* prev,
const std::vector<CMutableTransaction>& txns,
const CScript& scriptPubKey);
27 bool BuildChain(
const CBlockIndex* pindex,
const CScript& coinbase_script_pub_key,
size_t length, std::vector<std::shared_ptr<CBlock>>& chain);
35 BOOST_ERROR(
"ComputeFilter failed on block " << block_index->
nHeight);
41 std::vector<BlockFilter> filters;
42 std::vector<uint256> filter_hashes;
59 filter_hashes.clear();
60 last_header = filter_header;
65 const std::vector<CMutableTransaction>& txns,
70 CBlock& block = pblocktemplate->block;
80 unsigned int extraNonce = 0;
89 const CScript& coinbase_script_pub_key,
91 std::vector<std::shared_ptr<CBlock>>& chain)
93 std::vector<CMutableTransaction> no_txns;
96 for (
auto& block : chain) {
97 block = std::make_shared<CBlock>(
CreateBlock(pindex, no_txns, coinbase_script_pub_key));
121 std::vector<BlockFilter> filters;
122 std::vector<uint256> filter_hashes;
125 block_index !=
nullptr;
136 BOOST_CHECK(!filter_index.BlockUntilSyncedToCurrentChain());
141 constexpr int64_t timeout_ms = 10 * 1000;
143 while (!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();