Bitcoin Core  29.1.0
P2P Digital Currency
random.cpp
Go to the documentation of this file.
1 // Copyright (c) 2023-present The Bitcoin Core developers
2 // Distributed under the MIT software license, see the accompanying
3 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 
5 #include <test/util/random.h>
6 
7 #include <logging.h>
8 #include <random.h>
9 #include <uint256.h>
10 #include <util/check.h>
11 
12 #include <cstdlib>
13 #include <iostream>
14 
15 std::atomic<bool> g_seeded_g_prng_zero{false};
16 
17 extern void MakeRandDeterministicDANGEROUS(const uint256& seed) noexcept;
18 
20 {
21  constexpr auto RANDOM_CTX_SEED{"RANDOM_CTX_SEED"};
22 
23  // Do this once, on the first call, regardless of seedtype, because once
24  // MakeRandDeterministicDANGEROUS is called, the output of GetRandHash is
25  // no longer truly random. It should be enough to get the seed once for the
26  // process.
27  static const auto g_ctx_seed = []() -> std::optional<uint256> {
28  if constexpr (G_FUZZING) return {};
29  // If RANDOM_CTX_SEED is set, use that as seed.
30  if (const char* num{std::getenv(RANDOM_CTX_SEED)}) {
31  if (auto num_parsed{uint256::FromUserHex(num)}) {
32  return *num_parsed;
33  } else {
34  std::cerr << RANDOM_CTX_SEED << " must consist of up to " << uint256::size() * 2 << " hex digits (\"0x\" prefix allowed), it was set to: '" << num << "'.\n";
35  std::abort();
36  }
37  }
38  // Otherwise use a (truly) random value.
39  return GetRandHash();
40  }();
41 
43  if constexpr (G_FUZZING) {
44  Assert(g_seeded_g_prng_zero); // Only SeedRandomStateForTest(SeedRand::ZEROS) is allowed in fuzz tests
45  Assert(!g_used_g_prng); // The global PRNG must not have been used before SeedRandomStateForTest(SeedRand::ZEROS)
46  }
47  const uint256& seed{seedtype == SeedRand::FIXED_SEED ? g_ctx_seed.value() : uint256::ZERO};
48  LogInfo("Setting random seed for current tests to %s=%s\n", RANDOM_CTX_SEED, seed.GetHex());
50 }
constexpr bool G_FUZZING
Definition: check.h:16
Seed with a fixed value that never changes over the lifetime of this process.
static constexpr unsigned int size()
Definition: uint256.h:121
void MakeRandDeterministicDANGEROUS(const uint256 &seed) noexcept
Internal function to set g_determinstic_rng.
Definition: random.cpp:597
SeedRand
Definition: random.h:15
static std::optional< uint256 > FromUserHex(std::string_view str)
Definition: uint256.h:204
static const uint256 ZERO
Definition: uint256.h:209
#define LogInfo(...)
Definition: logging.h:356
void SeedRandomStateForTest(SeedRand seedtype)
Seed the global RNG state for testing and log the seed value.
Definition: random.cpp:19
256-bit opaque blob.
Definition: uint256.h:201
std::atomic< bool > g_used_g_prng
Definition: random.cpp:601
uint256 GetRandHash() noexcept
Generate a random uint256.
Definition: random.h:454
std::atomic< bool > g_seeded_g_prng_zero
Definition: random.cpp:15
Seed with a compile time constant of zeros.
#define Assert(val)
Identity function.
Definition: check.h:85