Branch data Line data Source code
# 1 : : // Copyright (c) 2012-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 <compressor.h>
# 6 : : #include <script/standard.h>
# 7 : : #include <test/util/setup_common.h>
# 8 : :
# 9 : : #include <stdint.h>
# 10 : :
# 11 : : #include <boost/test/unit_test.hpp>
# 12 : :
# 13 : : // amounts 0.00000001 .. 0.00100000
# 14 : 200002 : #define NUM_MULTIPLES_UNIT 100000
# 15 : :
# 16 : : // amounts 0.01 .. 100.00
# 17 : 20002 : #define NUM_MULTIPLES_CENT 10000
# 18 : :
# 19 : : // amounts 1 .. 10000
# 20 : 20002 : #define NUM_MULTIPLES_1BTC 10000
# 21 : :
# 22 : : // amounts 50 .. 21000000
# 23 : 840002 : #define NUM_MULTIPLES_50BTC 420000
# 24 : :
# 25 : : BOOST_FIXTURE_TEST_SUITE(compress_tests, BasicTestingSetup)
# 26 : :
# 27 : 1080000 : bool static TestEncode(uint64_t in) {
# 28 : 1080000 : return in == DecompressAmount(CompressAmount(in));
# 29 : 1080000 : }
# 30 : :
# 31 : 200000 : bool static TestDecode(uint64_t in) {
# 32 : 200000 : return in == CompressAmount(DecompressAmount(in));
# 33 : 200000 : }
# 34 : :
# 35 : 12 : bool static TestPair(uint64_t dec, uint64_t enc) {
# 36 [ + - ]: 12 : return CompressAmount(dec) == enc &&
# 37 [ + - ]: 12 : DecompressAmount(enc) == dec;
# 38 : 12 : }
# 39 : :
# 40 : : BOOST_AUTO_TEST_CASE(compress_amounts)
# 41 : 2 : {
# 42 : 2 : BOOST_CHECK(TestPair( 0, 0x0));
# 43 : 2 : BOOST_CHECK(TestPair( 1, 0x1));
# 44 : 2 : BOOST_CHECK(TestPair( CENT, 0x7));
# 45 : 2 : BOOST_CHECK(TestPair( COIN, 0x9));
# 46 : 2 : BOOST_CHECK(TestPair( 50*COIN, 0x32));
# 47 : 2 : BOOST_CHECK(TestPair(21000000*COIN, 0x1406f40));
# 48 : :
# 49 [ + + ]: 200002 : for (uint64_t i = 1; i <= NUM_MULTIPLES_UNIT; i++)
# 50 : 2 : BOOST_CHECK(TestEncode(i));
# 51 : :
# 52 [ + + ]: 20002 : for (uint64_t i = 1; i <= NUM_MULTIPLES_CENT; i++)
# 53 : 2 : BOOST_CHECK(TestEncode(i * CENT));
# 54 : :
# 55 [ + + ]: 20002 : for (uint64_t i = 1; i <= NUM_MULTIPLES_1BTC; i++)
# 56 : 2 : BOOST_CHECK(TestEncode(i * COIN));
# 57 : :
# 58 [ + + ]: 840002 : for (uint64_t i = 1; i <= NUM_MULTIPLES_50BTC; i++)
# 59 : 2 : BOOST_CHECK(TestEncode(i * 50 * COIN));
# 60 : :
# 61 [ + + ]: 200002 : for (uint64_t i = 0; i < 100000; i++)
# 62 : 2 : BOOST_CHECK(TestDecode(i));
# 63 : 2 : }
# 64 : :
# 65 : : BOOST_AUTO_TEST_CASE(compress_script_to_ckey_id)
# 66 : 2 : {
# 67 : : // case CKeyID
# 68 : 2 : CKey key;
# 69 : 2 : key.MakeNewKey(true);
# 70 : 2 : CPubKey pubkey = key.GetPubKey();
# 71 : :
# 72 : 2 : CScript script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
# 73 : 2 : BOOST_CHECK_EQUAL(script.size(), 25U);
# 74 : :
# 75 : 2 : CompressedScript out;
# 76 : 2 : bool done = CompressScript(script, out);
# 77 : 2 : BOOST_CHECK_EQUAL(done, true);
# 78 : :
# 79 : : // Check compressed script
# 80 : 2 : BOOST_CHECK_EQUAL(out.size(), 21U);
# 81 : 2 : BOOST_CHECK_EQUAL(out[0], 0x00);
# 82 : 2 : BOOST_CHECK_EQUAL(memcmp(out.data() + 1, script.data() + 3, 20), 0); // compare the 20 relevant chars of the CKeyId in the script
# 83 : 2 : }
# 84 : :
# 85 : : BOOST_AUTO_TEST_CASE(compress_script_to_cscript_id)
# 86 : 2 : {
# 87 : : // case CScriptID
# 88 : 2 : CScript script, redeemScript;
# 89 : 2 : script << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
# 90 : 2 : BOOST_CHECK_EQUAL(script.size(), 23U);
# 91 : :
# 92 : 2 : CompressedScript out;
# 93 : 2 : bool done = CompressScript(script, out);
# 94 : 2 : BOOST_CHECK_EQUAL(done, true);
# 95 : :
# 96 : : // Check compressed script
# 97 : 2 : BOOST_CHECK_EQUAL(out.size(), 21U);
# 98 : 2 : BOOST_CHECK_EQUAL(out[0], 0x01);
# 99 : 2 : BOOST_CHECK_EQUAL(memcmp(out.data() + 1, script.data() + 2, 20), 0); // compare the 20 relevant chars of the CScriptId in the script
# 100 : 2 : }
# 101 : :
# 102 : : BOOST_AUTO_TEST_CASE(compress_script_to_compressed_pubkey_id)
# 103 : 2 : {
# 104 : 2 : CKey key;
# 105 : 2 : key.MakeNewKey(true); // case compressed PubKeyID
# 106 : :
# 107 : 2 : CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // COMPRESSED_PUBLIC_KEY_SIZE (33)
# 108 : 2 : BOOST_CHECK_EQUAL(script.size(), 35U);
# 109 : :
# 110 : 2 : CompressedScript out;
# 111 : 2 : bool done = CompressScript(script, out);
# 112 : 2 : BOOST_CHECK_EQUAL(done, true);
# 113 : :
# 114 : : // Check compressed script
# 115 : 2 : BOOST_CHECK_EQUAL(out.size(), 33U);
# 116 : 2 : BOOST_CHECK_EQUAL(memcmp(out.data(), script.data() + 1, 1), 0);
# 117 : 2 : BOOST_CHECK_EQUAL(memcmp(out.data() + 1, script.data() + 2, 32), 0); // compare the 32 chars of the compressed CPubKey
# 118 : 2 : }
# 119 : :
# 120 : : BOOST_AUTO_TEST_CASE(compress_script_to_uncompressed_pubkey_id)
# 121 : 2 : {
# 122 : 2 : CKey key;
# 123 : 2 : key.MakeNewKey(false); // case uncompressed PubKeyID
# 124 : 2 : CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // PUBLIC_KEY_SIZE (65)
# 125 : 2 : BOOST_CHECK_EQUAL(script.size(), 67U); // 1 char code + 65 char pubkey + OP_CHECKSIG
# 126 : :
# 127 : 2 : CompressedScript out;
# 128 : 2 : bool done = CompressScript(script, out);
# 129 : 2 : BOOST_CHECK_EQUAL(done, true);
# 130 : :
# 131 : : // Check compressed script
# 132 : 2 : BOOST_CHECK_EQUAL(out.size(), 33U);
# 133 : 2 : BOOST_CHECK_EQUAL(memcmp(out.data() + 1, script.data() + 2, 32), 0); // first 32 chars of CPubKey are copied into out[1:]
# 134 : 2 : BOOST_CHECK_EQUAL(out[0], 0x04 | (script[65] & 0x01)); // least significant bit (lsb) of last char of pubkey is mapped into out[0]
# 135 : 2 : }
# 136 : :
# 137 : : BOOST_AUTO_TEST_SUITE_END()
|