|
4 | 4 |
|
5 | 5 | #include <compressor.h>
|
6 | 6 | #include <test/setup_common.h>
|
| 7 | +#include <script/standard.h> |
7 | 8 |
|
8 | 9 | #include <stdint.h>
|
9 | 10 |
|
@@ -61,4 +62,76 @@ BOOST_AUTO_TEST_CASE(compress_amounts)
|
61 | 62 | BOOST_CHECK(TestDecode(i));
|
62 | 63 | }
|
63 | 64 |
|
| 65 | +BOOST_AUTO_TEST_CASE(compress_script_to_ckey_id) |
| 66 | +{ |
| 67 | + // case CKeyID |
| 68 | + CKey key; |
| 69 | + key.MakeNewKey(true); |
| 70 | + CPubKey pubkey = key.GetPubKey(); |
| 71 | + |
| 72 | + CScript script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG; |
| 73 | + BOOST_CHECK_EQUAL(script.size(), 25); |
| 74 | + |
| 75 | + std::vector<unsigned char> out; |
| 76 | + bool done = CompressScript(script, out); |
| 77 | + BOOST_CHECK_EQUAL(done, true); |
| 78 | + |
| 79 | + // Check compressed script |
| 80 | + BOOST_CHECK_EQUAL(out.size(), 21); |
| 81 | + BOOST_CHECK_EQUAL(out[0], 0x00); |
| 82 | + BOOST_CHECK_EQUAL(memcmp(&out[1], &script[3], 20), 0); // compare the 20 relevant chars of the CKeyId in the script |
| 83 | +} |
| 84 | + |
| 85 | +BOOST_AUTO_TEST_CASE(compress_script_to_cscript_id) |
| 86 | +{ |
| 87 | + // case CScriptID |
| 88 | + CScript script, redeemScript; |
| 89 | + script << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL; |
| 90 | + BOOST_CHECK_EQUAL(script.size(), 23); |
| 91 | + |
| 92 | + std::vector<unsigned char> out; |
| 93 | + bool done = CompressScript(script, out); |
| 94 | + BOOST_CHECK_EQUAL(done, true); |
| 95 | + |
| 96 | + // Check compressed script |
| 97 | + BOOST_CHECK_EQUAL(out.size(), 21); |
| 98 | + BOOST_CHECK_EQUAL(out[0], 0x01); |
| 99 | + BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 20), 0); // compare the 20 relevant chars of the CScriptId in the script |
| 100 | +} |
| 101 | + |
| 102 | +BOOST_AUTO_TEST_CASE(compress_script_to_compressed_pubkey_id) |
| 103 | +{ |
| 104 | + CKey key; |
| 105 | + key.MakeNewKey(true); // case compressed PubKeyID |
| 106 | + |
| 107 | + CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // COMPRESSED_PUBLIC_KEY_SIZE (33) |
| 108 | + BOOST_CHECK_EQUAL(script.size(), 35); |
| 109 | + |
| 110 | + std::vector<unsigned char> out; |
| 111 | + bool done = CompressScript(script, out); |
| 112 | + BOOST_CHECK_EQUAL(done, true); |
| 113 | + |
| 114 | + // Check compressed script |
| 115 | + BOOST_CHECK_EQUAL(out.size(), 33); |
| 116 | + BOOST_CHECK_EQUAL(memcmp(&out[0], &script[1], 1), 0); |
| 117 | + BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 32), 0); // compare the 32 chars of the compressed CPubKey |
| 118 | +} |
| 119 | + |
| 120 | +BOOST_AUTO_TEST_CASE(compress_script_to_uncompressed_pubkey_id) |
| 121 | +{ |
| 122 | + CKey key; |
| 123 | + key.MakeNewKey(false); // case uncompressed PubKeyID |
| 124 | + CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // PUBLIC_KEY_SIZE (65) |
| 125 | + BOOST_CHECK_EQUAL(script.size(), 67); // 1 char code + 65 char pubkey + OP_CHECKSIG |
| 126 | + |
| 127 | + std::vector<unsigned char> out; |
| 128 | + bool done = CompressScript(script, out); |
| 129 | + BOOST_CHECK_EQUAL(done, true); |
| 130 | + |
| 131 | + // Check compressed script |
| 132 | + BOOST_CHECK_EQUAL(out.size(), 33); |
| 133 | + BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 32), 0); // first 32 chars of CPubKey are copied into out[1:] |
| 134 | + BOOST_CHECK_EQUAL(out[0], 0x04 | (script[65] & 0x01)); // least significant bit (lsb) of last char of pubkey is mapped into out[0] |
| 135 | +} |
| 136 | + |
64 | 137 | BOOST_AUTO_TEST_SUITE_END()
|
0 commit comments