1 // Copyright (c) 2014-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 <chainparams.h>
6 #include <net.h>
7 #include <signet.h>
8 #include <uint256.h>
9 #include <validation.h>
10 
11 #include <test/util/setup_common.h>
12 
13 #include <boost/test/unit_test.hpp>
14 
BOOST_FIXTURE_TEST_SUITE(validation_tests,TestingSetup)15 BOOST_FIXTURE_TEST_SUITE(validation_tests, TestingSetup)
16 
17 static void TestBlockSubsidyHalvings(const Consensus::Params& consensusParams)
18 {
19     int maxHalvings = 64;
20     CAmount nInitialSubsidy = 50 * COIN;
21 
22     CAmount nPreviousSubsidy = nInitialSubsidy * 2; // for height == 0
23     BOOST_CHECK_EQUAL(nPreviousSubsidy, nInitialSubsidy * 2);
24     for (int nHalvings = 0; nHalvings < maxHalvings; nHalvings++) {
25         int nHeight = nHalvings * consensusParams.nSubsidyHalvingInterval;
26         CAmount nSubsidy = GetBlockSubsidy(nHeight, consensusParams);
27         BOOST_CHECK(nSubsidy <= nInitialSubsidy);
28         BOOST_CHECK_EQUAL(nSubsidy, nPreviousSubsidy / 2);
29         nPreviousSubsidy = nSubsidy;
30     }
31     BOOST_CHECK_EQUAL(GetBlockSubsidy(maxHalvings * consensusParams.nSubsidyHalvingInterval, consensusParams), 0);
32 }
33 
TestBlockSubsidyHalvings(int nSubsidyHalvingInterval)34 static void TestBlockSubsidyHalvings(int nSubsidyHalvingInterval)
35 {
36     Consensus::Params consensusParams;
37     consensusParams.nSubsidyHalvingInterval = nSubsidyHalvingInterval;
38     TestBlockSubsidyHalvings(consensusParams);
39 }
40 
BOOST_AUTO_TEST_CASE(block_subsidy_test)41 BOOST_AUTO_TEST_CASE(block_subsidy_test)
42 {
43     const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
44     TestBlockSubsidyHalvings(chainParams->GetConsensus()); // As in main
45     TestBlockSubsidyHalvings(150); // As in regtest
46     TestBlockSubsidyHalvings(1000); // Just another interval
47 }
48 
BOOST_AUTO_TEST_CASE(subsidy_limit_test)49 BOOST_AUTO_TEST_CASE(subsidy_limit_test)
50 {
51     const auto chainParams = CreateChainParams(*m_node.args, CBaseChainParams::MAIN);
52     CAmount nSum = 0;
53     for (int nHeight = 0; nHeight < 14000000; nHeight += 1000) {
54         CAmount nSubsidy = GetBlockSubsidy(nHeight, chainParams->GetConsensus());
55         BOOST_CHECK(nSubsidy <= 50 * COIN);
56         nSum += nSubsidy * 1000;
57         BOOST_CHECK(MoneyRange(nSum));
58     }
59     BOOST_CHECK_EQUAL(nSum, CAmount{2099999997690000});
60 }
61 
BOOST_AUTO_TEST_CASE(signet_parse_tests)62 BOOST_AUTO_TEST_CASE(signet_parse_tests)
63 {
64     ArgsManager signet_argsman;
65     signet_argsman.ForceSetArg("-signetchallenge", "51"); // set challenge to OP_TRUE
66     const auto signet_params = CreateChainParams(signet_argsman, CBaseChainParams::SIGNET);
67     CBlock block;
68     BOOST_CHECK(signet_params->GetConsensus().signet_challenge == std::vector<uint8_t>{OP_TRUE});
69     CScript challenge{OP_TRUE};
70 
71     // empty block is invalid
72     BOOST_CHECK(!SignetTxs::Create(block, challenge));
73     BOOST_CHECK(!CheckSignetBlockSolution(block, signet_params->GetConsensus()));
74 
75     // no witness commitment
76     CMutableTransaction cb;
77     cb.vout.emplace_back(0, CScript{});
78     block.vtx.push_back(MakeTransactionRef(cb));
79     block.vtx.push_back(MakeTransactionRef(cb)); // Add dummy tx to exercise merkle root code
80     BOOST_CHECK(!SignetTxs::Create(block, challenge));
81     BOOST_CHECK(!CheckSignetBlockSolution(block, signet_params->GetConsensus()));
82 
83     // no header is treated valid
84     std::vector<uint8_t> witness_commitment_section_141{0xaa, 0x21, 0xa9, 0xed};
85     for (int i = 0; i < 32; ++i) {
86         witness_commitment_section_141.push_back(0xff);
87     }
88     cb.vout.at(0).scriptPubKey = CScript{} << OP_RETURN << witness_commitment_section_141;
89     block.vtx.at(0) = MakeTransactionRef(cb);
90     BOOST_CHECK(SignetTxs::Create(block, challenge));
91     BOOST_CHECK(CheckSignetBlockSolution(block, signet_params->GetConsensus()));
92 
93     // no data after header, valid
94     std::vector<uint8_t> witness_commitment_section_325{0xec, 0xc7, 0xda, 0xa2};
95     cb.vout.at(0).scriptPubKey = CScript{} << OP_RETURN << witness_commitment_section_141 << witness_commitment_section_325;
96     block.vtx.at(0) = MakeTransactionRef(cb);
97     BOOST_CHECK(SignetTxs::Create(block, challenge));
98     BOOST_CHECK(CheckSignetBlockSolution(block, signet_params->GetConsensus()));
99 
100     // Premature end of data, invalid
101     witness_commitment_section_325.push_back(0x01);
102     witness_commitment_section_325.push_back(0x51);
103     cb.vout.at(0).scriptPubKey = CScript{} << OP_RETURN << witness_commitment_section_141 << witness_commitment_section_325;
104     block.vtx.at(0) = MakeTransactionRef(cb);
105     BOOST_CHECK(!SignetTxs::Create(block, challenge));
106     BOOST_CHECK(!CheckSignetBlockSolution(block, signet_params->GetConsensus()));
107 
108     // has data, valid
109     witness_commitment_section_325.push_back(0x00);
110     cb.vout.at(0).scriptPubKey = CScript{} << OP_RETURN << witness_commitment_section_141 << witness_commitment_section_325;
111     block.vtx.at(0) = MakeTransactionRef(cb);
112     BOOST_CHECK(SignetTxs::Create(block, challenge));
113     BOOST_CHECK(CheckSignetBlockSolution(block, signet_params->GetConsensus()));
114 
115     // Extraneous data, invalid
116     witness_commitment_section_325.push_back(0x00);
117     cb.vout.at(0).scriptPubKey = CScript{} << OP_RETURN << witness_commitment_section_141 << witness_commitment_section_325;
118     block.vtx.at(0) = MakeTransactionRef(cb);
119     BOOST_CHECK(!SignetTxs::Create(block, challenge));
120     BOOST_CHECK(!CheckSignetBlockSolution(block, signet_params->GetConsensus()));
121 }
122 
123 //! Test retrieval of valid assumeutxo values.
BOOST_AUTO_TEST_CASE(test_assumeutxo)124 BOOST_AUTO_TEST_CASE(test_assumeutxo)
125 {
126     const auto params = CreateChainParams(*m_node.args, CBaseChainParams::REGTEST);
127 
128     // These heights don't have assumeutxo configurations associated, per the contents
129     // of chainparams.cpp.
130     std::vector<int> bad_heights{0, 100, 111, 115, 209, 211};
131 
132     for (auto empty : bad_heights) {
133         const auto out = ExpectedAssumeutxo(empty, *params);
134         BOOST_CHECK(!out);
135     }
136 
137     const auto out110 = *ExpectedAssumeutxo(110, *params);
138     BOOST_CHECK_EQUAL(out110.hash_serialized.ToString(), "1ebbf5850204c0bdb15bf030f47c7fe91d45c44c712697e4509ba67adb01c618");
139     BOOST_CHECK_EQUAL(out110.nChainTx, 110U);
140 
141     const auto out210 = *ExpectedAssumeutxo(200, *params);
142     BOOST_CHECK_EQUAL(out210.hash_serialized.ToString(), "51c8d11d8b5c1de51543c579736e786aa2736206d1e11e627568029ce092cf62");
143     BOOST_CHECK_EQUAL(out210.nChainTx, 200U);
144 }
145 
146 BOOST_AUTO_TEST_SUITE_END()
147