Branch data Line data Source code
# 1 : : // Copyright (c) 2015-2020 The Bitcoin Core developers
# 2 : : // Distributed under the MIT software license, see the accompanying
# 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
# 4 : :
# 5 : : #include <chain.h>
# 6 : : #include <chainparams.h>
# 7 : : #include <pow.h>
# 8 : : #include <test/util/setup_common.h>
# 9 : :
# 10 : : #include <boost/test/unit_test.hpp>
# 11 : :
# 12 : : BOOST_FIXTURE_TEST_SUITE(pow_tests, BasicTestingSetup)
# 13 : :
# 14 : : /* Test calculation of next difficulty target with no constraints applying */
# 15 : : BOOST_AUTO_TEST_CASE(get_next_work)
# 16 : 2 : {
# 17 : 2 : const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
# 18 : 2 : int64_t nLastRetargetTime = 1261130161; // Block #30240
# 19 : 2 : CBlockIndex pindexLast;
# 20 : 2 : pindexLast.nHeight = 32255;
# 21 : 2 : pindexLast.nTime = 1262152739; // Block #32255
# 22 : 2 : pindexLast.nBits = 0x1d00ffff;
# 23 : 2 : BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, chainParams->GetConsensus()), 0x1d00d86aU);
# 24 : 2 : }
# 25 : :
# 26 : : /* Test the constraint on the upper bound for next work */
# 27 : : BOOST_AUTO_TEST_CASE(get_next_work_pow_limit)
# 28 : 2 : {
# 29 : 2 : const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
# 30 : 2 : int64_t nLastRetargetTime = 1231006505; // Block #0
# 31 : 2 : CBlockIndex pindexLast;
# 32 : 2 : pindexLast.nHeight = 2015;
# 33 : 2 : pindexLast.nTime = 1233061996; // Block #2015
# 34 : 2 : pindexLast.nBits = 0x1d00ffff;
# 35 : 2 : BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, chainParams->GetConsensus()), 0x1d00ffffU);
# 36 : 2 : }
# 37 : :
# 38 : : /* Test the constraint on the lower bound for actual time taken */
# 39 : : BOOST_AUTO_TEST_CASE(get_next_work_lower_limit_actual)
# 40 : 2 : {
# 41 : 2 : const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
# 42 : 2 : int64_t nLastRetargetTime = 1279008237; // Block #66528
# 43 : 2 : CBlockIndex pindexLast;
# 44 : 2 : pindexLast.nHeight = 68543;
# 45 : 2 : pindexLast.nTime = 1279297671; // Block #68543
# 46 : 2 : pindexLast.nBits = 0x1c05a3f4;
# 47 : 2 : BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, chainParams->GetConsensus()), 0x1c0168fdU);
# 48 : 2 : }
# 49 : :
# 50 : : /* Test the constraint on the upper bound for actual time taken */
# 51 : : BOOST_AUTO_TEST_CASE(get_next_work_upper_limit_actual)
# 52 : 2 : {
# 53 : 2 : const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
# 54 : 2 : int64_t nLastRetargetTime = 1263163443; // NOTE: Not an actual block time
# 55 : 2 : CBlockIndex pindexLast;
# 56 : 2 : pindexLast.nHeight = 46367;
# 57 : 2 : pindexLast.nTime = 1269211443; // Block #46367
# 58 : 2 : pindexLast.nBits = 0x1c387f6f;
# 59 : 2 : BOOST_CHECK_EQUAL(CalculateNextWorkRequired(&pindexLast, nLastRetargetTime, chainParams->GetConsensus()), 0x1d00e1fdU);
# 60 : 2 : }
# 61 : :
# 62 : : BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_negative_target)
# 63 : 2 : {
# 64 : 2 : const auto consensus = CreateChainParams(*m_node.args, CBaseChainParams::MAIN)->GetConsensus();
# 65 : 2 : uint256 hash;
# 66 : 2 : unsigned int nBits;
# 67 : 2 : nBits = UintToArith256(consensus.powLimit).GetCompact(true);
# 68 : 2 : hash.SetHex("0x1");
# 69 : 2 : BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
# 70 : 2 : }
# 71 : :
# 72 : : BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_overflow_target)
# 73 : 2 : {
# 74 : 2 : const auto consensus = CreateChainParams(*m_node.args, CBaseChainParams::MAIN)->GetConsensus();
# 75 : 2 : uint256 hash;
# 76 : 2 : unsigned int nBits{~0x00800000U};
# 77 : 2 : hash.SetHex("0x1");
# 78 : 2 : BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
# 79 : 2 : }
# 80 : :
# 81 : : BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_too_easy_target)
# 82 : 2 : {
# 83 : 2 : const auto consensus = CreateChainParams(*m_node.args, CBaseChainParams::MAIN)->GetConsensus();
# 84 : 2 : uint256 hash;
# 85 : 2 : unsigned int nBits;
# 86 : 2 : arith_uint256 nBits_arith = UintToArith256(consensus.powLimit);
# 87 : 2 : nBits_arith *= 2;
# 88 : 2 : nBits = nBits_arith.GetCompact();
# 89 : 2 : hash.SetHex("0x1");
# 90 : 2 : BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
# 91 : 2 : }
# 92 : :
# 93 : : BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_biger_hash_than_target)
# 94 : 2 : {
# 95 : 2 : const auto consensus = CreateChainParams(*m_node.args, CBaseChainParams::MAIN)->GetConsensus();
# 96 : 2 : uint256 hash;
# 97 : 2 : unsigned int nBits;
# 98 : 2 : arith_uint256 hash_arith = UintToArith256(consensus.powLimit);
# 99 : 2 : nBits = hash_arith.GetCompact();
# 100 : 2 : hash_arith *= 2; // hash > nBits
# 101 : 2 : hash = ArithToUint256(hash_arith);
# 102 : 2 : BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
# 103 : 2 : }
# 104 : :
# 105 : : BOOST_AUTO_TEST_CASE(CheckProofOfWork_test_zero_target)
# 106 : 2 : {
# 107 : 2 : const auto consensus = CreateChainParams(*m_node.args, CBaseChainParams::MAIN)->GetConsensus();
# 108 : 2 : uint256 hash;
# 109 : 2 : unsigned int nBits;
# 110 : 2 : arith_uint256 hash_arith{0};
# 111 : 2 : nBits = hash_arith.GetCompact();
# 112 : 2 : hash = ArithToUint256(hash_arith);
# 113 : 2 : BOOST_CHECK(!CheckProofOfWork(hash, nBits, consensus));
# 114 : 2 : }
# 115 : :
# 116 : : BOOST_AUTO_TEST_CASE(GetBlockProofEquivalentTime_test)
# 117 : 2 : {
# 118 : 2 : const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
# 119 : 2 : std::vector<CBlockIndex> blocks(10000);
# 120 [ + + ]: 20002 : for (int i = 0; i < 10000; i++) {
# 121 [ + + ]: 20000 : blocks[i].pprev = i ? &blocks[i - 1] : nullptr;
# 122 : 20000 : blocks[i].nHeight = i;
# 123 : 20000 : blocks[i].nTime = 1269211443 + i * chainParams->GetConsensus().nPowTargetSpacing;
# 124 : 20000 : blocks[i].nBits = 0x207fffff; /* target 0x7fffff000... */
# 125 [ + + ]: 20000 : blocks[i].nChainWork = i ? blocks[i - 1].nChainWork + GetBlockProof(blocks[i - 1]) : arith_uint256(0);
# 126 : 20000 : }
# 127 : :
# 128 [ + + ]: 2002 : for (int j = 0; j < 1000; j++) {
# 129 : 2000 : CBlockIndex *p1 = &blocks[InsecureRandRange(10000)];
# 130 : 2000 : CBlockIndex *p2 = &blocks[InsecureRandRange(10000)];
# 131 : 2000 : CBlockIndex *p3 = &blocks[InsecureRandRange(10000)];
# 132 : :
# 133 : 2000 : int64_t tdiff = GetBlockProofEquivalentTime(*p1, *p2, *p3, chainParams->GetConsensus());
# 134 : 2000 : BOOST_CHECK_EQUAL(tdiff, p1->GetBlockTime() - p2->GetBlockTime());
# 135 : 2000 : }
# 136 : 2 : }
# 137 : :
# 138 : : void sanity_check_chainparams(const ArgsManager& args, std::string chainName)
# 139 : 8 : {
# 140 : 8 : const auto chainParams = CreateChainParams(args, chainName);
# 141 : 8 : const auto consensus = chainParams->GetConsensus();
# 142 : :
# 143 : : // hash genesis is correct
# 144 : 8 : BOOST_CHECK_EQUAL(consensus.hashGenesisBlock, chainParams->GenesisBlock().GetHash());
# 145 : :
# 146 : : // target timespan is an even multiple of spacing
# 147 : 8 : BOOST_CHECK_EQUAL(consensus.nPowTargetTimespan % consensus.nPowTargetSpacing, 0);
# 148 : :
# 149 : : // genesis nBits is positive, doesn't overflow and is lower than powLimit
# 150 : 8 : arith_uint256 pow_compact;
# 151 : 8 : bool neg, over;
# 152 : 8 : pow_compact.SetCompact(chainParams->GenesisBlock().nBits, &neg, &over);
# 153 : 8 : BOOST_CHECK(!neg && pow_compact != 0);
# 154 : 8 : BOOST_CHECK(!over);
# 155 : 8 : BOOST_CHECK(UintToArith256(consensus.powLimit) >= pow_compact);
# 156 : :
# 157 : : // check max target * 4*nPowTargetTimespan doesn't overflow -- see pow.cpp:CalculateNextWorkRequired()
# 158 [ + + ]: 8 : if (!consensus.fPowNoRetargeting) {
# 159 : 6 : arith_uint256 targ_max("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF");
# 160 : 6 : targ_max /= consensus.nPowTargetTimespan*4;
# 161 : 6 : BOOST_CHECK(UintToArith256(consensus.powLimit) < targ_max);
# 162 : 6 : }
# 163 : 8 : }
# 164 : :
# 165 : : BOOST_AUTO_TEST_CASE(ChainParams_MAIN_sanity)
# 166 : 2 : {
# 167 : 2 : sanity_check_chainparams(*m_node.args, CBaseChainParams::MAIN);
# 168 : 2 : }
# 169 : :
# 170 : : BOOST_AUTO_TEST_CASE(ChainParams_REGTEST_sanity)
# 171 : 2 : {
# 172 : 2 : sanity_check_chainparams(*m_node.args, CBaseChainParams::REGTEST);
# 173 : 2 : }
# 174 : :
# 175 : : BOOST_AUTO_TEST_CASE(ChainParams_TESTNET_sanity)
# 176 : 2 : {
# 177 : 2 : sanity_check_chainparams(*m_node.args, CBaseChainParams::TESTNET);
# 178 : 2 : }
# 179 : :
# 180 : : BOOST_AUTO_TEST_CASE(ChainParams_SIGNET_sanity)
# 181 : 2 : {
# 182 : 2 : sanity_check_chainparams(*m_node.args, CBaseChainParams::SIGNET);
# 183 : 2 : }
# 184 : :
# 185 : : BOOST_AUTO_TEST_SUITE_END()
|