#include <test/util/random.h>
#include <logging.h>
#include <random.h>
#include <uint256.h>
#include <util/check.h>
#include <cstdlib>
#include <iostream>
std::atomic<bool> g_seeded_g_prng_zero{false};
extern void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept;
void SeedRandomStateForTest(SeedRand seedtype)
{
constexpr auto RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
static const auto g_ctx_seed = []() -> std::optional<uint256> {
if (EnableFuzzDeterminism()) return {};
if (const char* num{std::getenv(RANDOM_CTX_SEED)}) {
if (auto num_parsed{uint256::FromUserHex(num)}) {
return *num_parsed;
} else {
std::cerr << RANDOM_CTX_SEED << " must consist of up to " << uint256::size() * 2 << " hex digits (\"0x\" prefix allowed), it was set to: '" << num << "'.\n";
std::abort();
}
}
return GetRandHash();
}();
g_seeded_g_prng_zero = seedtype == SeedRand::ZEROS;
if (EnableFuzzDeterminism()) {
Assert(g_seeded_g_prng_zero); Assert(!g_used_g_prng); }
const uint256& seed{seedtype == SeedRand::FIXED_SEED ? g_ctx_seed.value() : uint256::ZERO};
LogInfo("Setting random seed for current tests to %s=%s\n", RANDOM_CTX_SEED, seed.GetHex());
MakeRandDeterministicDANGEROUS(seed);
}