0) Adjust BIP30 enforcement values 1) Reduce amount that peers can adjust our time to eliminate an attack vector. Thanks to coblee for this fix. 2) Zeitgeist2 patch - thanks to Lolcust and ArtForz. This fixes an issue where a 51% attack can change difficulty at will. Go back the full period unless it's the first retarget after genesis. 3) Avoid overflow in CalculateNextWorkRequired(). Thanks to pooler for the overflow fix. 4) Zeitgeist2 bool fshift bnNew.bits(). Thanks to romanornr for this path. 5) SegWit ContextualCheckBlockHeader adjustment and extra coverage. 6) Reject peer proto version below 70002. Thanks to wtogami for this patch. 7) Send final alert message to nodes warning about removal of the alert system. Thanks to coblee for this patch. 8) Adjust default settings for Litecoin. 9) Adjust STALE_CHECK_INTERVAL value
138 lines
4.4 KiB
C++
138 lines
4.4 KiB
C++
// Copyright (c) 2012-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 <compressor.h>
|
|
#include <script/standard.h>
|
|
#include <test/util/setup_common.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
// amounts 0.00000001 .. 0.00100000
|
|
#define NUM_MULTIPLES_UNIT 100000
|
|
|
|
// amounts 0.01 .. 100.00
|
|
#define NUM_MULTIPLES_CENT 10000
|
|
|
|
// amounts 1 .. 10000
|
|
#define NUM_MULTIPLES_1BTC 10000
|
|
|
|
// amounts 50 .. 21000000
|
|
#define NUM_MULTIPLES_50BTC 1680000
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(compress_tests, BasicTestingSetup)
|
|
|
|
bool static TestEncode(uint64_t in) {
|
|
return in == DecompressAmount(CompressAmount(in));
|
|
}
|
|
|
|
bool static TestDecode(uint64_t in) {
|
|
return in == CompressAmount(DecompressAmount(in));
|
|
}
|
|
|
|
bool static TestPair(uint64_t dec, uint64_t enc) {
|
|
return CompressAmount(dec) == enc &&
|
|
DecompressAmount(enc) == dec;
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(compress_amounts)
|
|
{
|
|
BOOST_CHECK(TestPair( 0, 0x0));
|
|
BOOST_CHECK(TestPair( 1, 0x1));
|
|
BOOST_CHECK(TestPair( CENT, 0x7));
|
|
BOOST_CHECK(TestPair( COIN, 0x9));
|
|
BOOST_CHECK(TestPair( 50*COIN, 0x32));
|
|
BOOST_CHECK(TestPair(84000000*COIN, 0x501BD00));
|
|
|
|
for (uint64_t i = 1; i <= NUM_MULTIPLES_UNIT; i++)
|
|
BOOST_CHECK(TestEncode(i));
|
|
|
|
for (uint64_t i = 1; i <= NUM_MULTIPLES_CENT; i++)
|
|
BOOST_CHECK(TestEncode(i * CENT));
|
|
|
|
for (uint64_t i = 1; i <= NUM_MULTIPLES_1BTC; i++)
|
|
BOOST_CHECK(TestEncode(i * COIN));
|
|
|
|
for (uint64_t i = 1; i <= NUM_MULTIPLES_50BTC; i++)
|
|
BOOST_CHECK(TestEncode(i * 50 * COIN));
|
|
|
|
for (uint64_t i = 0; i < 100000; i++)
|
|
BOOST_CHECK(TestDecode(i));
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(compress_script_to_ckey_id)
|
|
{
|
|
// case CKeyID
|
|
CKey key;
|
|
key.MakeNewKey(true);
|
|
CPubKey pubkey = key.GetPubKey();
|
|
|
|
CScript script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
|
|
BOOST_CHECK_EQUAL(script.size(), 25U);
|
|
|
|
std::vector<unsigned char> out;
|
|
bool done = CompressScript(script, out);
|
|
BOOST_CHECK_EQUAL(done, true);
|
|
|
|
// Check compressed script
|
|
BOOST_CHECK_EQUAL(out.size(), 21U);
|
|
BOOST_CHECK_EQUAL(out[0], 0x00);
|
|
BOOST_CHECK_EQUAL(memcmp(&out[1], &script[3], 20), 0); // compare the 20 relevant chars of the CKeyId in the script
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(compress_script_to_cscript_id)
|
|
{
|
|
// case CScriptID
|
|
CScript script, redeemScript;
|
|
script << OP_HASH160 << ToByteVector(CScriptID(redeemScript)) << OP_EQUAL;
|
|
BOOST_CHECK_EQUAL(script.size(), 23U);
|
|
|
|
std::vector<unsigned char> out;
|
|
bool done = CompressScript(script, out);
|
|
BOOST_CHECK_EQUAL(done, true);
|
|
|
|
// Check compressed script
|
|
BOOST_CHECK_EQUAL(out.size(), 21U);
|
|
BOOST_CHECK_EQUAL(out[0], 0x01);
|
|
BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 20), 0); // compare the 20 relevant chars of the CScriptId in the script
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(compress_script_to_compressed_pubkey_id)
|
|
{
|
|
CKey key;
|
|
key.MakeNewKey(true); // case compressed PubKeyID
|
|
|
|
CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // COMPRESSED_PUBLIC_KEY_SIZE (33)
|
|
BOOST_CHECK_EQUAL(script.size(), 35U);
|
|
|
|
std::vector<unsigned char> out;
|
|
bool done = CompressScript(script, out);
|
|
BOOST_CHECK_EQUAL(done, true);
|
|
|
|
// Check compressed script
|
|
BOOST_CHECK_EQUAL(out.size(), 33U);
|
|
BOOST_CHECK_EQUAL(memcmp(&out[0], &script[1], 1), 0);
|
|
BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 32), 0); // compare the 32 chars of the compressed CPubKey
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(compress_script_to_uncompressed_pubkey_id)
|
|
{
|
|
CKey key;
|
|
key.MakeNewKey(false); // case uncompressed PubKeyID
|
|
CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // PUBLIC_KEY_SIZE (65)
|
|
BOOST_CHECK_EQUAL(script.size(), 67U); // 1 char code + 65 char pubkey + OP_CHECKSIG
|
|
|
|
std::vector<unsigned char> out;
|
|
bool done = CompressScript(script, out);
|
|
BOOST_CHECK_EQUAL(done, true);
|
|
|
|
// Check compressed script
|
|
BOOST_CHECK_EQUAL(out.size(), 33U);
|
|
BOOST_CHECK_EQUAL(memcmp(&out[1], &script[2], 32), 0); // first 32 chars of CPubKey are copied into out[1:]
|
|
BOOST_CHECK_EQUAL(out[0], 0x04 | (script[65] & 0x01)); // least significant bit (lsb) of last char of pubkey is mapped into out[0]
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|