Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feed environment data into RNG initializers #17270

Merged
merged 11 commits into from Nov 18, 2019
Merged

Conversation

@sipa
Copy link
Member

sipa commented Oct 27, 2019

This introduces a new randomenv module that queries varies non-cryptographic (and non-RNG) sources of entropy available on the system; things like user IDs, system configuration, time, statistics, CPUID data.

The idea is that these provide a fallback in scenarios where system entropy is somehow broken (note that if system entropy fails we will abort regardless; this is only meant to function as a last resort against undetected failure). It includes some data sources OpenSSL currently uses, and more.

The separation between random and randomenv is a bit arbitrary, but I felt that all this "non-essential" functionality deserved to be separated from the core random module.

@sipa sipa force-pushed the sipa:201910_seedrandom branch 4 times, most recently from 0971ae9 to 0c6d5cb Oct 27, 2019
@DrahtBot

This comment has been minimized.

Copy link
Contributor

DrahtBot commented Oct 27, 2019

The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

Conflicts

Reviewers, this pull request conflicts with the following ones:

  • #12557 ([WIP] 64 bit iOS device support by Sjors)

If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

src/randomenv.cpp Show resolved Hide resolved
@laanwj laanwj mentioned this pull request Oct 27, 2019
@laanwj

This comment has been minimized.

Copy link
Member

laanwj commented Oct 27, 2019

Errors on MacOSX (looks like it doesn't have environ and CLOCK_MONOTONIC):

andomenv.cpp:177:19: error: use of undeclared identifier 'CLOCK_MONOTONIC'
    clock_gettime(CLOCK_MONOTONIC, &ts);
randomenv.cpp:222:64: error: use of undeclared identifier 'environ'
    hasher << &x << &RandAddStaticEnv << &malloc << &errno << &environ << addr;                                                
randomenv.cpp:282:9: error: use of undeclared identifier 'environ'
    if (environ) {
randomenv.cpp:283:28: error: use of undeclared identifier 'environ'
        for (size_t i = 0; environ[i]; ++i) {
randomenv.cpp:284:48: error: use of undeclared identifier 'environ'; did you mean 'union'?
            hasher.Write((const unsigned char*)environ[i], strlen(environ[i]));
                                               ^~~~~~~
                                               union
randomenv.cpp:284:48: error: expected expression
randomenv.cpp:284:67: error: use of undeclared identifier 'environ'
            hasher.Write((const unsigned char*)environ[i], strlen(environ[i]));
                                                                 ^
7 errors generated.
@sipa sipa force-pushed the sipa:201910_seedrandom branch 2 times, most recently from c197258 to 4b12381 Oct 27, 2019
@practicalswift

This comment has been minimized.

Copy link
Member

practicalswift commented Oct 27, 2019

Concept ACK: good idea

@sipa sipa force-pushed the sipa:201910_seedrandom branch 2 times, most recently from 0b1d233 to eed8cfe Oct 27, 2019
@sipa

This comment has been minimized.

Copy link
Member Author

sipa commented Oct 27, 2019

I think I've addressed a compatibility/build issues. Can someone try this on OSX, and perhaps some BSD flavor?

@RandyMcMillan

This comment has been minimized.

Copy link
Contributor

RandyMcMillan commented Oct 27, 2019

Copy link
Member

promag left a comment

Concept ACK, nice commit sequence.

@fanquake

This comment has been minimized.

Copy link
Member

fanquake commented Oct 28, 2019

Can someone try this on OSX, and perhaps some BSD flavor?

I get the following error when building eed8cfe on OpenBSD 6.6:

  CXX      libbitcoin_util_a-randomenv.o
In file included from randomenv.cpp:37:
/usr/include/netinet/ip.h:67:19: error: field has incomplete type 'struct in_addr'
        struct    in_addr ip_src, ip_dst; /* source and dest address */
                          ^
/usr/include/netinet/ip.h:67:11: note: forward declaration of 'in_addr'
        struct    in_addr ip_src, ip_dst; /* source and dest address */
                  ^
/usr/include/netinet/ip.h:67:27: error: field has incomplete type 'struct in_addr'
        struct    in_addr ip_src, ip_dst; /* source and dest address */
                                  ^
/usr/include/netinet/ip.h:67:11: note: forward declaration of 'in_addr'
        struct    in_addr ip_src, ip_dst; /* source and dest address */
                  ^
/usr/include/netinet/ip.h:181:19: error: field has incomplete type 'struct in_addr'
                        struct in_addr ipt_addr;
                                       ^
/usr/include/netinet/ip.h:67:11: note: forward declaration of 'in_addr'
        struct    in_addr ip_src, ip_dst; /* source and dest address */
                  ^
randomenv.cpp:101:57: error: unknown type name 'sockaddr_in'; did you mean 'sockaddr'?
        hasher.Write((const unsigned char*)addr, sizeof(sockaddr_in));
                                                        ^~~~~~~~~~~
                                                        sockaddr
/usr/include/sys/socket.h:207:8: note: 'sockaddr' declared here
struct sockaddr {
       ^
randomenv.cpp:104:57: error: unknown type name 'sockaddr_in6'; did you mean 'sockaddr'?
        hasher.Write((const unsigned char*)addr, sizeof(sockaddr_in6));
                                                        ^~~~~~~~~~~~
                                                        sockaddr
/usr/include/sys/socket.h:207:8: note: 'sockaddr' declared here
struct sockaddr {
       ^
5 errors generated.
@laanwj

This comment has been minimized.

Copy link
Member

laanwj commented Oct 28, 2019

Log on FreeBSD 12.0-RELEASE-p10 (same complaint, about sockaddr)

Making all in src
gmake[1]: Entering directory '/usr/home/user/src/bitcoin/src'
gmake[2]: Entering directory '/usr/home/user/src/bitcoin/src'
  CXX      libbitcoin_util_a-randomenv.o
In file included from randomenv.cpp:37:
/usr/include/netinet/ip.h:71:17: error: field has incomplete type 'struct in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                        ^
/usr/include/netinet/ip.h:71:9: note: forward declaration of 'in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                ^
/usr/include/netinet/ip.h:71:24: error: field has incomplete type 'struct in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                               ^
/usr/include/netinet/ip.h:71:9: note: forward declaration of 'in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                ^
/usr/include/netinet/ip.h:188:19: error: field has incomplete type 'struct in_addr'
                        struct in_addr ipt_addr;
                                       ^
/usr/include/netinet/ip.h:71:9: note: forward declaration of 'in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                ^
/usr/include/netinet/ip.h:223:17: error: field has incomplete type 'struct in_addr'
        struct  in_addr ippseudo_src;   /* source internet address */
                        ^
/usr/include/netinet/ip.h:71:9: note: forward declaration of 'in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                ^
/usr/include/netinet/ip.h:224:17: error: field has incomplete type 'struct in_addr'
        struct  in_addr ippseudo_dst;   /* destination internet address */
                        ^
/usr/include/netinet/ip.h:71:9: note: forward declaration of 'in_addr'
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
                ^
randomenv.cpp:101:57: error: unknown type name 'sockaddr_in'; did you mean 'sockaddr'?
        hasher.Write((const unsigned char*)addr, sizeof(sockaddr_in));
                                                        ^~~~~~~~~~~
                                                        sockaddr
/usr/include/sys/socket.h:328:8: note: 'sockaddr' declared here
struct sockaddr {
       ^
randomenv.cpp:104:57: error: unknown type name 'sockaddr_in6'; did you mean 'sockaddr'?
        hasher.Write((const unsigned char*)addr, sizeof(sockaddr_in6));
                                                        ^~~~~~~~~~~~
                                                        sockaddr
/usr/include/sys/socket.h:328:8: note: 'sockaddr' declared here
struct sockaddr {
       ^
7 errors generated.
gmake[2]: *** [Makefile:8866: libbitcoin_util_a-randomenv.o] Error 1
gmake[2]: Leaving directory '/usr/home/user/src/bitcoin/src'
gmake[1]: *** [Makefile:14135: all-recursive] Error 1
gmake[1]: Leaving directory '/usr/home/user/src/bitcoin/src'
gmake: *** [Makefile:774: all-recursive] Error 1
@MarcoFalke

This comment has been minimized.

Copy link
Member

MarcoFalke commented Oct 28, 2019

@MarcoFalke

This comment has been minimized.

Copy link
Member

MarcoFalke commented Oct 28, 2019

Does the comment in random.h need to be updated?

@fanquake

This comment has been minimized.

Copy link
Member

fanquake commented Oct 28, 2019

Does the comment in random.h need to be updated?

If that is updated, you could also cherry-pick 770cd96 out of #17265 which contains some related corrections.

@sipa sipa force-pushed the sipa:201910_seedrandom branch 4 times, most recently from e604e52 to 8470cbb Oct 28, 2019
@MarcoFalke

This comment has been minimized.

Copy link
Member

MarcoFalke commented Oct 28, 2019

sipa added 4 commits Oct 27, 2019
Suggested by Wladimir van der Laan.
* Instead of calling RandAddSeedSleep anytime the scheduler goes
  idle, call its replacement (RandAddSeedPeriodic) just once per
  minute. This has better guarantees of actually being run, and
  helps limit how frequently the dynamic env data is gathered.
* Since this code runs once per minute regardless now, we no
  longer need to keep track of the last time strengthening was
  run; just do it always.
* Make strengthening time context dependent (100 ms at startup,
  10 ms once per minute afterwards).
Also switch to chrono based types.
@sipa sipa force-pushed the sipa:201910_seedrandom branch from 9cd62cf to d1c0277 Nov 12, 2019
@TheBlueMatt

This comment has been minimized.

Copy link
Contributor

TheBlueMatt commented Nov 13, 2019

utACK d1c0277. Certainly no longer measuring the time elapsed between a 1ms sleep (which got removed in the latest change) is a fair tradeoff for adding about 2 million other actually-higher-entropy bits :).

@fanquake

This comment has been minimized.

Copy link
Member

fanquake commented Nov 14, 2019

I've been testing d1c0277 across various operating systems. Few logs for anyone who's interested. Will post a final review shortly.

macOS 10.14.6

2019-11-13T18:24:03Z Feeding 1066350 bytes of environment data into RNG
2019-11-13T18:25:03Z Feeding 216 bytes of dynamic environment data into RNG
2019-11-13T18:26:03Z Feeding 216 bytes of dynamic environment data into RNG

OpenBSD 6.6

2019-11-13T19:21:17Z Feeding 9334 bytes of environment data into RNG
2019-11-13T19:22:18Z Feeding 504 bytes of dynamic environment data into RNG
2019-11-13T19:23:18Z Feeding 504 bytes of dynamic environment data into RNG

FreeBSD 12

2019-11-13T21:04:50Z Feeding 74253 bytes of environment data into RNG
2019-11-13T21:05:51Z Feeding 66068 bytes of dynamic environment data into RNG
2019-11-13T21:06:51Z Feeding 66068 bytes of dynamic environment data into RNG

Windows 10 WSL

2019-11-13T23:05:00Z Feeding 435111 bytes of environment data into RNG
2019-11-13T23:06:00Z Feeding 48 bytes of dynamic environment data into RNG
2019-11-13T23:07:00Z Feeding 48 bytes of dynamic environment data into RNG

Windows 10 MSVC

2019-11-13T23:16:08Z Feeding 378764 bytes of environment data into RNG
2019-11-13T23:17:08Z Feeding 48 bytes of dynamic environment data into RNG
2019-11-13T23:18:08Z Feeding 48 bytes of dynamic environment data into RNG

NetBSD 8.1

2019-11-13T23:50:05Z Feeding 35503 bytes of environment data into RNG
2019-11-13T23:51:05Z Feeding 28268 bytes of dynamic environment data into RNG
2019-11-13T23:52:05Z Feeding 28268 bytes of dynamic environment data into RNG

Alpine

2019-11-14T00:45:33Z Feeding 23631 bytes of environment data into RNG
2019-11-14T00:46:33Z Feeding 14196 bytes of dynamic environment data into RNG
2019-11-14T00:47:33Z Feeding 14206 bytes of dynamic environment data into RNG
2019-11-14T00:48:33Z Feeding 14208 bytes of dynamic environment data into RNG
2019-11-14T00:49:33Z Feeding 14211 bytes of dynamic environment data into RNG

Debian 10

2019-11-14T00:21:13Z Feeding 23714 bytes of environment data into RNG
2019-11-14T00:22:13Z Feeding 13980 bytes of dynamic environment data into RNG
2019-11-14T00:23:13Z Feeding 13983 bytes of dynamic environment data into RNG
2019-11-14T00:24:13Z Feeding 13991 bytes of dynamic environment data into RNG
2019-11-14T00:25:13Z Feeding 13988 bytes of dynamic environment data into RNG
2019-11-14T00:26:13Z Feeding 13993 bytes of dynamic environment data into RNG
2019-11-14T00:27:13Z Feeding 14024 bytes of dynamic environment data into RNG
Copy link
Member

fanquake left a comment

I think the changes here should be sufficient that we can remove our OpenSSL usage (#17265). This is now likely doing above and beyond what (depends) OpenSSL was doing. I prefer the recent refactor to RandAddPeriodic and removing the RandAdd call from scheduler.cpp. I've done some sanity checking across various operating systems.

GetSystemTimeAsFileTime(&ftime);
hasher << ftime;
#else
# ifndef __MACH__

This comment has been minimized.

Copy link
@fanquake

fanquake Nov 14, 2019

Member

Using __MACH__ here and above is unusual for a our codebase, we use MAC_OSX throughout. Also __MACH__ by itself isn't necessarily macOS, looks like if you were to use it you'd want to couple it with __APPLE__.

hasher << ts;
# endif
# else
// On MacOS use mach_absolute_time (number of CPU ticks since boot) as a replacement for CLOCK_MONOTONIC,

This comment has been minimized.

Copy link
@fanquake

fanquake Nov 14, 2019

Member

After #16392 (bumping our SDK and minimum required macOS to 10.12), clock_gettime, CLOCK_REALTIME and CLOCK_MONOTONIC will be available to use on macOS. Not necessarily anything that needs to change here now, but the potential to simplify this later.

@laanwj

This comment has been minimized.

Copy link
Member

laanwj commented Nov 18, 2019

ACK d1c0277

I agree with @fanquake. I think this is good for merge. It has been tested on a wide range of platforms, and unarguably works.

Additional bits of entropy for specific arch and OS can be added later.

laanwj added a commit that referenced this pull request Nov 18, 2019
d1c0277 Report amount of data gathered from environment (Pieter Wuille)
64e1e02 Use thread-safe atomic in perfmon seeder (Pieter Wuille)
d61f2bb Run background seeding periodically instead of unpredictably (Pieter Wuille)
483b942 Add information gathered through getauxval() (Pieter Wuille)
11793ea Feed CPUID data into RNG (Pieter Wuille)
a81c494 Use sysctl for seeding on MacOS/BSD (Pieter Wuille)
2554c1b Gather additional entropy from the environment (Pieter Wuille)
c2a262a Seed randomness with process id / thread id / various clocks (Pieter Wuille)
723c796 [MOVEONLY] Move cpuid code from random & sha256 to compat/cpuid (Pieter Wuille)
cea3902 [MOVEONLY] Move perfmon data gathering to new randomenv module (Pieter Wuille)
b51bae1 doc: minor corrections in random.cpp (fanquake)

Pull request description:

  This introduces a new `randomenv` module that queries varies non-cryptographic (and non-RNG) sources of entropy available on the system; things like user IDs, system configuration, time, statistics, CPUID data.

  The idea is that these provide a fallback in scenarios where system entropy is somehow broken (note that if system entropy *fails* we will abort regardless; this is only meant to function as a last resort against undetected failure). It includes some data sources OpenSSL currently uses, and more.

  The separation between random and randomenv is a bit arbitrary, but I felt that all this "non-essential" functionality deserved to be separated from the core random module.

ACKs for top commit:
  TheBlueMatt:
    utACK d1c0277. Certainly no longer measuring the time elapsed between a 1ms sleep (which got removed in the latest change) is a fair tradeoff for adding about 2 million other actually-higher-entropy bits :).
  laanwj:
    ACK d1c0277

Tree-SHA512: d290a8db6538a164348118ee02079e4f4c8551749ea78fa44b2aad57f5df2ccbc2a12dc7d80d8f3e916d68cdd8e204faf9e1bcbec15f9054eba6b22f17c66ae3
@laanwj laanwj merged commit d1c0277 into bitcoin:master Nov 18, 2019
2 checks passed
2 checks passed
continuous-integration/appveyor/pr AppVeyor build succeeded
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details
@fanquake fanquake removed this from Blockers in High-priority for review Nov 18, 2019
fanquake added a commit to fanquake/bitcoin that referenced this pull request Nov 18, 2019
fanquake added a commit to fanquake/bitcoin that referenced this pull request Nov 18, 2019
The usage of MilliSleep() in SeedPeriodic (previously SeedSleep) was
removed in bitcoin#17270, meaning it, and its users can now be marked noexcept.
sidhujag added a commit to syscoin/syscoin that referenced this pull request Nov 18, 2019
d1c0277 Report amount of data gathered from environment (Pieter Wuille)
64e1e02 Use thread-safe atomic in perfmon seeder (Pieter Wuille)
d61f2bb Run background seeding periodically instead of unpredictably (Pieter Wuille)
483b942 Add information gathered through getauxval() (Pieter Wuille)
11793ea Feed CPUID data into RNG (Pieter Wuille)
a81c494 Use sysctl for seeding on MacOS/BSD (Pieter Wuille)
2554c1b Gather additional entropy from the environment (Pieter Wuille)
c2a262a Seed randomness with process id / thread id / various clocks (Pieter Wuille)
723c796 [MOVEONLY] Move cpuid code from random & sha256 to compat/cpuid (Pieter Wuille)
cea3902 [MOVEONLY] Move perfmon data gathering to new randomenv module (Pieter Wuille)
b51bae1 doc: minor corrections in random.cpp (fanquake)

Pull request description:

  This introduces a new `randomenv` module that queries varies non-cryptographic (and non-RNG) sources of entropy available on the system; things like user IDs, system configuration, time, statistics, CPUID data.

  The idea is that these provide a fallback in scenarios where system entropy is somehow broken (note that if system entropy *fails* we will abort regardless; this is only meant to function as a last resort against undetected failure). It includes some data sources OpenSSL currently uses, and more.

  The separation between random and randomenv is a bit arbitrary, but I felt that all this "non-essential" functionality deserved to be separated from the core random module.

ACKs for top commit:
  TheBlueMatt:
    utACK d1c0277. Certainly no longer measuring the time elapsed between a 1ms sleep (which got removed in the latest change) is a fair tradeoff for adding about 2 million other actually-higher-entropy bits :).
  laanwj:
    ACK d1c0277

Tree-SHA512: d290a8db6538a164348118ee02079e4f4c8551749ea78fa44b2aad57f5df2ccbc2a12dc7d80d8f3e916d68cdd8e204faf9e1bcbec15f9054eba6b22f17c66ae3
laanwj added a commit to laanwj/bitcoin that referenced this pull request Nov 23, 2019
This export was introduced in bitcoin#17270 which added
```
//! Necessary on some platforms
extern char** environ;
```
laanwj added a commit that referenced this pull request Nov 24, 2019
f93fc61 Put bounds on the number of CPUID leaves explored (Pieter Wuille)
ba2c5fe Fix CPUID subleaf iteration (Pieter Wuille)

Pull request description:

  This fixes #17523.

  The code to determine which CPUID subleaves to explore was incorrect in #17270. The new code here is based on Intel's reference documentation for CPUID (a document called "Intel® Processor Identification and the CPUID Instruction - Application Note 485", which I cannot actually find on their own website).

ACKs for top commit:
  laanwj:
    ACK f93fc61
  jonatack:
    ACK f93fc61 code review, tested rebased on current master bb862d7 with Debian 4.19 x86_64
  mzumsande:
    ACK f93fc61, reviewed code and compared with the intel doc, tested on an AMD and an Intel processor.

Tree-SHA512: 2790b326fa397b736c0f39f25807bea57de2752fdd58bf6693d044b8cb26df36c11cce165a334b471f8e33724f10e3b76edab5cc4e0e7776601aabda13277245
sidhujag added a commit to syscoin/syscoin that referenced this pull request Nov 24, 2019
f93fc61 Put bounds on the number of CPUID leaves explored (Pieter Wuille)
ba2c5fe Fix CPUID subleaf iteration (Pieter Wuille)

Pull request description:

  This fixes bitcoin#17523.

  The code to determine which CPUID subleaves to explore was incorrect in bitcoin#17270. The new code here is based on Intel's reference documentation for CPUID (a document called "Intel® Processor Identification and the CPUID Instruction - Application Note 485", which I cannot actually find on their own website).

ACKs for top commit:
  laanwj:
    ACK f93fc61
  jonatack:
    ACK f93fc61 code review, tested rebased on current master bb862d7 with Debian 4.19 x86_64
  mzumsande:
    ACK f93fc61, reviewed code and compared with the intel doc, tested on an AMD and an Intel processor.

Tree-SHA512: 2790b326fa397b736c0f39f25807bea57de2752fdd58bf6693d044b8cb26df36c11cce165a334b471f8e33724f10e3b76edab5cc4e0e7776601aabda13277245
MarcoFalke added a commit that referenced this pull request Nov 25, 2019
…rv64 toolchain issue

eafd259 build: Add NX workaround for RV64 (Wladimir J. van der Laan)
f6e4225 build: Allow export of environ symbols (Wladimir J. van der Laan)

Pull request description:

  This export was introduced in #17270 which added
  ```
  //! Necessary on some platforms
  extern char** environ;
  ```
  This should (finally) make the gitian build pass again (fix issue #17525.).

  Built on top of #17538 which should be merged first.

Top commit has no ACKs.

Tree-SHA512: 5c2054d52d0957aec3dc945b76d8e219187d22dc03889e7a88fb76049bf8e4a3e9f4da00dd1e9dd0351211f8e70d1a1b8ad7244f0348dab698e9d14b9d0c0bd4
sidhujag added a commit to syscoin/syscoin that referenced this pull request Nov 25, 2019
…around rv64 toolchain issue

eafd259 build: Add NX workaround for RV64 (Wladimir J. van der Laan)
f6e4225 build: Allow export of environ symbols (Wladimir J. van der Laan)

Pull request description:

  This export was introduced in bitcoin#17270 which added
  ```
  //! Necessary on some platforms
  extern char** environ;
  ```
  This should (finally) make the gitian build pass again (fix issue bitcoin#17525.).

  Built on top of bitcoin#17538 which should be merged first.

Top commit has no ACKs.

Tree-SHA512: 5c2054d52d0957aec3dc945b76d8e219187d22dc03889e7a88fb76049bf8e4a3e9f4da00dd1e9dd0351211f8e70d1a1b8ad7244f0348dab698e9d14b9d0c0bd4
laanwj added a commit that referenced this pull request Dec 5, 2019
55b2cb1 random: mark RandAddPeriodic and SeedPeriodic as noexcept (fanquake)
461e547 doc: correct random.h docs after #17270 (fanquake)

Pull request description:

  The usage of `MilliSleep()` in SeedPeriodic (previously SeedSleep) was
  [removed](d61f2bb) in #17270, meaning it, and its users can now be marked `noexcept`.

  This also corrects the docs in random.h for some of the changes in #17270.

ACKs for top commit:
  practicalswift:
    ACK 55b2cb1
  laanwj:
    ACK 55b2cb1
  sipa:
    ACK 55b2cb1

Tree-SHA512: 672d369796e7c4f9b4d98dc545e5454999fa1bef373871994a26041d6163c58909e2255e4f820d3ef011679aa3392754eb57477306a89f5fd3d57e2bd7f0811a
sidhujag added a commit to syscoin/syscoin that referenced this pull request Dec 6, 2019
… noexcept

55b2cb1 random: mark RandAddPeriodic and SeedPeriodic as noexcept (fanquake)
461e547 doc: correct random.h docs after bitcoin#17270 (fanquake)

Pull request description:

  The usage of `MilliSleep()` in SeedPeriodic (previously SeedSleep) was
  [removed](bitcoin@d61f2bb) in bitcoin#17270, meaning it, and its users can now be marked `noexcept`.

  This also corrects the docs in random.h for some of the changes in bitcoin#17270.

ACKs for top commit:
  practicalswift:
    ACK 55b2cb1
  laanwj:
    ACK 55b2cb1
  sipa:
    ACK 55b2cb1

Tree-SHA512: 672d369796e7c4f9b4d98dc545e5454999fa1bef373871994a26041d6163c58909e2255e4f820d3ef011679aa3392754eb57477306a89f5fd3d57e2bd7f0811a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.