6#include <chainparams.h>
30 std::vector<std::unique_ptr<CBlockIndex>> blocks;
31 const uint32_t fixed_time = fuzzed_data_provider.
ConsumeIntegral<uint32_t>();
32 const uint32_t fixed_bits = fuzzed_data_provider.
ConsumeIntegral<uint32_t>();
34 const std::optional<CBlockHeader> block_header = ConsumeDeserializable<CBlockHeader>(fuzzed_data_provider);
39 *blocks.emplace_back(std::make_unique<CBlockIndex>(*block_header))};
41 CBlockIndex* previous_block = blocks.empty() ? nullptr :
PickValue(fuzzed_data_provider, blocks).get();
42 const int current_height = (previous_block !=
nullptr && previous_block->
nHeight != std::numeric_limits<int>::max()) ? previous_block->
nHeight + 1 : 0;
44 current_block.pprev = previous_block;
47 current_block.
nHeight = current_height;
52 current_block.nTime = fixed_time + seconds;
56 current_block.nBits = fixed_bits;
67 if (current_block.nHeight != std::numeric_limits<int>::max() && current_block.nHeight - (consensus_params.
DifficultyAdjustmentInterval() - 1) >= 0) {
72 const auto& to =
PickValue(fuzzed_data_provider, blocks);
73 const auto& from =
PickValue(fuzzed_data_provider, blocks);
74 const auto& tip =
PickValue(fuzzed_data_provider, blocks);
81 const std::optional<uint256> hash = ConsumeDeserializable<uint256>(fuzzed_data_provider);
94 std::vector<std::unique_ptr<CBlockIndex>> blocks;
96 const uint32_t old_time{fuzzed_data_provider.
ConsumeIntegral<uint32_t>()};
97 const uint32_t new_time{fuzzed_data_provider.
ConsumeIntegral<uint32_t>()};
104 if (old_target > pow_limit) {
108 for (
int height = 0; height < consensus_params.DifficultyAdjustmentInterval(); ++height) {
111 header.
nTime = old_time;
112 header.
nBits = nbits;
113 if (height == consensus_params.DifficultyAdjustmentInterval() - 1) {
114 header.
nTime = new_time;
116 auto current_block{std::make_unique<CBlockIndex>(header)};
117 current_block->pprev = blocks.empty() ? nullptr : blocks.back().get();
118 current_block->nHeight = height;
119 blocks.emplace_back(std::move(current_block));
121 auto last_block{blocks.back().get()};
arith_uint256 UintToArith256(const uint256 &a)
arith_uint256 GetBlockProof(const CBlockIndex &block)
int64_t GetBlockProofEquivalentTime(const CBlockIndex &to, const CBlockIndex &from, const CBlockIndex &tip, const Consensus::Params ¶ms)
Return the time it would take to redo the work difference between from and to, assuming the current h...
void SelectParams(const ChainType chain)
Sets the params returned by Params() to those for the given chain type.
const CChainParams & Params()
Return the currently selected parameters.
#define Assert(val)
Identity function.
The block chain is a tree shaped structure starting with the genesis block at the root,...
arith_uint256 nChainWork
(memory only) Total amount of work (expected number of hashes) in the chain up to and including this ...
int nHeight
height of the entry in the chain. The genesis block has height 0
const Consensus::Params & GetConsensus() const
T ConsumeIntegralInRange(T min, T max)
256-bit unsigned big integer.
arith_uint256 & SetCompact(uint32_t nCompact, bool *pfNegative=nullptr, bool *pfOverflow=nullptr)
The "compact" format is a representation of a whole number N using an unsigned 32bit number similar t...
uint32_t GetCompact(bool fNegative=false) const
#define LIMITED_WHILE(condition, limit)
Can be used to limit a theoretically unbounded loop.
bool AdditionOverflow(const T i, const T j) noexcept
bool PermittedDifficultyTransition(const Consensus::Params ¶ms, int64_t height, uint32_t old_nbits, uint32_t new_nbits)
Return false if the proof-of-work requirement specified by new_nbits at a given height is not possibl...
unsigned int GetNextWorkRequired(const CBlockIndex *pindexLast, const CBlockHeader *pblock, const Consensus::Params ¶ms)
bool CheckProofOfWorkImpl(uint256 hash, unsigned int nBits, const Consensus::Params ¶ms)
unsigned int CalculateNextWorkRequired(const CBlockIndex *pindexLast, int64_t nFirstBlockTime, const Consensus::Params ¶ms)
Parameters that influence chain consensus.
int64_t DifficultyAdjustmentInterval() const
int64_t nPowTargetSpacing
FUZZ_TARGET(pow,.init=initialize_pow)
auto & PickValue(FuzzedDataProvider &fuzzed_data_provider, Collection &col)
arith_uint256 ConsumeArithUInt256(FuzzedDataProvider &fuzzed_data_provider) noexcept