AngusP 55eea003af
test: Make blockencodings_tests deterministic
refactor: CBlockHeaderAndShortTxIDs constructor now always takes an explicit nonce.
test: Make blockencodings_tests deterministic using fixed seed providing deterministic
CBlockHeaderAndShortTxID nonces and dummy transaction IDs.

Fixes very rare flaky test failures, where the ShortIDs of test transactions collide, leading to
`READ_STATUS_FAILED` from PartiallyDownloadedBlock::InitData and/or `IsTxAvailable` giving `false`
when the transaction should actually be available.

 * Use a new `FastRandomContext` with a fixed seed in each test, to ensure 'random' uint256s
   used as fake prevouts are deterministic, so in-turn test txids and short IDs are deterministic
   and don't collide causing very rare but flaky test failures.
 * Add new test-only/internal initializer for `CBlockHeaderAndShortTxIDs` that takes a specified
   nonce to further ensure determinism and avoid rare but undesireable short ID collisions.
   In a test context this nonce is set to a fixed known-good value. Normally it is random, as
   previously.

Flaky test failures can be reproduced with:

```patch
diff --git a/src/blockencodings.cpp b/src/blockencodings.cpp
index 695e8d806a..64d635a97a 100644
--- a/src/blockencodings.cpp
+++ b/src/blockencodings.cpp
@@ -44,7 +44,8 @@ void CBlockHeaderAndShortTxIDs::FillShortTxIDSelector() const {

 uint64_t CBlockHeaderAndShortTxIDs::GetShortID(const Wtxid& wtxid) const {
     static_assert(SHORTTXIDS_LENGTH == 6, "shorttxids calculation assumes 6-byte shorttxids");
-    return SipHashUint256(shorttxidk0, shorttxidk1, wtxid) & 0xffffffffffffL;
+    // return SipHashUint256(shorttxidk0, shorttxidk1, wtxid) & 0xffffffffffffL;
+    return SipHashUint256(shorttxidk0, shorttxidk1, wtxid) & 0x0f;
 }

```

to increase the likelihood of a short ID collision; and running

```shell
set -e;
n=0;
while (( n++ < 5000 )); do
    src/test/test_bitcoin --run_test=blockencodings_tests;
done
```
2024-06-19 22:56:30 +01:00
..
2024-05-21 10:29:51 +01:00
2024-05-21 10:29:51 +01:00
2024-05-20 16:48:19 +00:00
2023-10-12 11:27:19 +02:00
2024-04-10 17:01:27 +02:00
2024-05-21 09:14:55 +02:00
2024-03-04 19:53:30 -05:00
2023-11-21 13:15:44 +00:00
2023-12-11 18:22:13 +01:00
2024-03-26 16:51:46 +00:00
2023-11-16 11:36:22 +10:00
2024-05-16 11:28:46 +02:00
2024-02-11 15:25:07 +01:00
2023-09-13 11:37:45 +01:00
2024-05-20 16:48:19 +00:00
2023-11-30 11:28:19 +01:00
2023-11-28 12:42:07 +01:00
2024-05-14 10:24:31 +02:00
2024-05-14 10:24:31 +02:00
2024-05-20 16:48:19 +00:00
2024-04-01 14:37:24 -04:00
2024-04-01 14:37:24 -04:00
2023-11-16 11:36:22 +10:00