mirror of
https://github.com/bitcoin/bitcoin.git
synced 2024-11-20 10:38:42 +01:00
Merge #17917: tests: Add amount compression/decompression fuzzing to existing fuzzing harness
7e9c7113af
compressor: Make the domain of CompressAmount(...) explicit (practicalswift)4a7fd7a712
tests: Add amount compression/decompression fuzzing to existing fuzzing harness: test compression round-trip (practicalswift) Pull request description: Small fuzzing improvement: Add amount compression/decompression fuzzing to existing fuzzing harness: test compression round-trip (`DecompressAmount(CompressAmount(…))`). Make the domain of `CompressAmount(…)` explicit. Amount compression primer: ``` Compact serialization for amounts Special serializer/deserializer for amount values. It is optimized for values which have few non-zero digits in decimal representation. Most amounts currently in the txout set take only 1 or 2 bytes to represent. ``` **How to test this PR** ``` $ make distclean $ ./autogen.sh $ CC=clang CXX=clang++ ./configure --enable-fuzz \ --with-sanitizers=address,fuzzer,undefined $ make $ src/test/fuzz/integer … ``` Top commit has no ACKs. Tree-SHA512: 0f7c05b97012ccd5cd05a96c209e6b4d7d2fa73138bac9615cf531baa3f614f9003e29a198015bcc083af9f5bdc752bb52615b82c5df3c519b1a064bd4fc6664
This commit is contained in:
commit
d7134b306a
@ -15,7 +15,17 @@ bool CompressScript(const CScript& script, std::vector<unsigned char> &out);
|
|||||||
unsigned int GetSpecialScriptSize(unsigned int nSize);
|
unsigned int GetSpecialScriptSize(unsigned int nSize);
|
||||||
bool DecompressScript(CScript& script, unsigned int nSize, const std::vector<unsigned char> &out);
|
bool DecompressScript(CScript& script, unsigned int nSize, const std::vector<unsigned char> &out);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compress amount.
|
||||||
|
*
|
||||||
|
* nAmount is of type uint64_t and thus cannot be negative. If you're passing in
|
||||||
|
* a CAmount (int64_t), make sure to properly handle the case where the amount
|
||||||
|
* is negative before calling CompressAmount(...).
|
||||||
|
*
|
||||||
|
* @pre Function defined only for 0 <= nAmount <= MAX_MONEY.
|
||||||
|
*/
|
||||||
uint64_t CompressAmount(uint64_t nAmount);
|
uint64_t CompressAmount(uint64_t nAmount);
|
||||||
|
|
||||||
uint64_t DecompressAmount(uint64_t nAmount);
|
uint64_t DecompressAmount(uint64_t nAmount);
|
||||||
|
|
||||||
/** Compact serializer for scripts.
|
/** Compact serializer for scripts.
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
// Distributed under the MIT software license, see the accompanying
|
// Distributed under the MIT software license, see the accompanying
|
||||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <amount.h>
|
||||||
#include <arith_uint256.h>
|
#include <arith_uint256.h>
|
||||||
#include <compressor.h>
|
#include <compressor.h>
|
||||||
#include <consensus/merkle.h>
|
#include <consensus/merkle.h>
|
||||||
@ -56,7 +57,14 @@ void test_one_input(const std::vector<uint8_t>& buffer)
|
|||||||
|
|
||||||
const Consensus::Params& consensus_params = Params().GetConsensus();
|
const Consensus::Params& consensus_params = Params().GetConsensus();
|
||||||
(void)CheckProofOfWork(u256, u32, consensus_params);
|
(void)CheckProofOfWork(u256, u32, consensus_params);
|
||||||
|
if (u64 <= MAX_MONEY) {
|
||||||
|
const uint64_t compressed_money_amount = CompressAmount(u64);
|
||||||
|
assert(u64 == DecompressAmount(compressed_money_amount));
|
||||||
|
static const uint64_t compressed_money_amount_max = CompressAmount(MAX_MONEY - 1);
|
||||||
|
assert(compressed_money_amount <= compressed_money_amount_max);
|
||||||
|
} else {
|
||||||
(void)CompressAmount(u64);
|
(void)CompressAmount(u64);
|
||||||
|
}
|
||||||
static const uint256 u256_min(uint256S("0000000000000000000000000000000000000000000000000000000000000000"));
|
static const uint256 u256_min(uint256S("0000000000000000000000000000000000000000000000000000000000000000"));
|
||||||
static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
|
static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
|
||||||
const std::vector<uint256> v256{u256, u256_min, u256_max};
|
const std::vector<uint256> v256{u256, u256_min, u256_max};
|
||||||
|
Loading…
Reference in New Issue
Block a user