mirror of
https://github.com/dogecoin/dogecoin.git
synced 2026-02-15 09:48:38 +00:00
This is a step toward removing the Chain::Lock class and reducing cs_main locking. This change only affects behavior in the case where wallet last block processed falls behind the chain tip. Previously listsinceblock might not have returned all transactions up to the claimed "lastblock" value in this case, resulting in race conditions and potentially missing transactions in cases where listsinceblock was called in a loop like https://github.com/bitcoin/bitcoin/issues/14338#issuecomment-426706574
95 lines
3.5 KiB
C++
95 lines
3.5 KiB
C++
// Copyright (c) 2020 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <chainparams.h>
|
|
#include <consensus/validation.h>
|
|
#include <interfaces/chain.h>
|
|
#include <script/standard.h>
|
|
#include <test/util/setup_common.h>
|
|
#include <validation.h>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
using interfaces::FoundBlock;
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(interfaces_tests, TestChain100Setup)
|
|
|
|
BOOST_AUTO_TEST_CASE(findBlock)
|
|
{
|
|
auto chain = interfaces::MakeChain(m_node);
|
|
auto& active = ChainActive();
|
|
|
|
uint256 hash;
|
|
BOOST_CHECK(chain->findBlock(active[10]->GetBlockHash(), FoundBlock().hash(hash)));
|
|
BOOST_CHECK_EQUAL(hash, active[10]->GetBlockHash());
|
|
|
|
int height = -1;
|
|
BOOST_CHECK(chain->findBlock(active[20]->GetBlockHash(), FoundBlock().height(height)));
|
|
BOOST_CHECK_EQUAL(height, active[20]->nHeight);
|
|
|
|
CBlock data;
|
|
BOOST_CHECK(chain->findBlock(active[30]->GetBlockHash(), FoundBlock().data(data)));
|
|
BOOST_CHECK_EQUAL(data.GetHash(), active[30]->GetBlockHash());
|
|
|
|
int64_t time = -1;
|
|
BOOST_CHECK(chain->findBlock(active[40]->GetBlockHash(), FoundBlock().time(time)));
|
|
BOOST_CHECK_EQUAL(time, active[40]->GetBlockTime());
|
|
|
|
int64_t max_time = -1;
|
|
BOOST_CHECK(chain->findBlock(active[50]->GetBlockHash(), FoundBlock().maxTime(max_time)));
|
|
BOOST_CHECK_EQUAL(max_time, active[50]->GetBlockTimeMax());
|
|
|
|
int64_t mtp_time = -1;
|
|
BOOST_CHECK(chain->findBlock(active[60]->GetBlockHash(), FoundBlock().mtpTime(mtp_time)));
|
|
BOOST_CHECK_EQUAL(mtp_time, active[60]->GetMedianTimePast());
|
|
|
|
BOOST_CHECK(!chain->findBlock({}, FoundBlock()));
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(findAncestorByHeight)
|
|
{
|
|
auto chain = interfaces::MakeChain(m_node);
|
|
auto& active = ChainActive();
|
|
uint256 hash;
|
|
BOOST_CHECK(chain->findAncestorByHeight(active[20]->GetBlockHash(), 10, FoundBlock().hash(hash)));
|
|
BOOST_CHECK_EQUAL(hash, active[10]->GetBlockHash());
|
|
BOOST_CHECK(!chain->findAncestorByHeight(active[10]->GetBlockHash(), 20));
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(findAncestorByHash)
|
|
{
|
|
auto chain = interfaces::MakeChain(m_node);
|
|
auto& active = ChainActive();
|
|
int height = -1;
|
|
BOOST_CHECK(chain->findAncestorByHash(active[20]->GetBlockHash(), active[10]->GetBlockHash(), FoundBlock().height(height)));
|
|
BOOST_CHECK_EQUAL(height, 10);
|
|
BOOST_CHECK(!chain->findAncestorByHash(active[10]->GetBlockHash(), active[20]->GetBlockHash()));
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(findCommonAncestor)
|
|
{
|
|
auto chain = interfaces::MakeChain(m_node);
|
|
auto& active = ChainActive();
|
|
auto* orig_tip = active.Tip();
|
|
for (int i = 0; i < 10; ++i) {
|
|
BlockValidationState state;
|
|
ChainstateActive().InvalidateBlock(state, Params(), active.Tip());
|
|
}
|
|
BOOST_CHECK_EQUAL(active.Height(), orig_tip->nHeight - 10);
|
|
coinbaseKey.MakeNewKey(true);
|
|
for (int i = 0; i < 20; ++i) {
|
|
CreateAndProcessBlock({}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
|
|
}
|
|
BOOST_CHECK_EQUAL(active.Height(), orig_tip->nHeight + 10);
|
|
uint256 fork_hash;
|
|
int fork_height;
|
|
int orig_height;
|
|
BOOST_CHECK(chain->findCommonAncestor(orig_tip->GetBlockHash(), active.Tip()->GetBlockHash(), FoundBlock().height(fork_height).hash(fork_hash), FoundBlock().height(orig_height)));
|
|
BOOST_CHECK_EQUAL(orig_height, orig_tip->nHeight);
|
|
BOOST_CHECK_EQUAL(fork_height, orig_tip->nHeight - 10);
|
|
BOOST_CHECK_EQUAL(fork_hash, active[fork_height]->GetBlockHash());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|