|
| 1 | +// DASH S8 get_work() JOB-TARGET assembly KAT. |
| 2 | +// |
| 3 | +// Pins dash::stratum::{modulate_desired_pseudoshare_target, clip_to_sane, |
| 4 | +// assemble_work_job_targets} to oracle-EXACT arithmetic from |
| 5 | +// frstrtr/p2pool-dash @9a0a609 work.py:368-426 (the get_work() pseudoshare |
| 6 | +// modulation + SANE clip + the two job-target fields of the stratum work blob). |
| 7 | +// Every expected value below was computed independently from the oracle integer |
| 8 | +// formulas (see the derive comment on each vector), NOT from the SUT — a true |
| 9 | +// byte-parity pin, not a tautology. |
| 10 | +// |
| 11 | +// Pure / socket-free / node-free: no VM200/201 dashd, no live sharechain. |
| 12 | +// |
| 13 | +// SANE_TARGET_RANGE inputs read from dash::PoolConfig SSOT (config_pool.hpp). |
| 14 | + |
| 15 | +#include <gtest/gtest.h> |
| 16 | + |
| 17 | +#include <impl/dash/stratum/work_job_targets.hpp> |
| 18 | +#include <impl/dash/config_pool.hpp> |
| 19 | + |
| 20 | +using namespace dash::stratum; |
| 21 | + |
| 22 | +namespace { |
| 23 | +constexpr const char* MAX_HEX = |
| 24 | + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; |
| 25 | +// Oracle SANE_TARGET_RANGE, mainnet (networks/dash.py:33): |
| 26 | +// min = (0xFFFF*2**208)//10000 ; max = 0xFFFF*2**208 |
| 27 | +constexpr const char* SMIN_HEX = |
| 28 | + "0000000000068db22d0e5604189374bc6a7ef9db22d0e5604189374bc6a7ef9d"; |
| 29 | +constexpr const char* SMAX_HEX = |
| 30 | + "00000000ffff0000000000000000000000000000000000000000000000000000"; |
| 31 | + |
| 32 | +uint256 U(const char* h) { uint256 t; t.SetHex(h); return t; } |
| 33 | +} // namespace |
| 34 | + |
| 35 | +// modulate_desired_pseudoshare_target: no measured rate -> unconstrained MAX |
| 36 | +// (work.py:369 target = 2**256-1, local_hash_rate path skipped). |
| 37 | +TEST(DashWorkJobTargets, PseudoshareNoRate) |
| 38 | +{ |
| 39 | + EXPECT_EQ(modulate_desired_pseudoshare_target(0.0).GetHex(), MAX_HEX); |
| 40 | +} |
| 41 | + |
| 42 | +// modulate_desired_pseudoshare_target(lhr) == average_attempts_to_target(lhr*1) |
| 43 | +// == 2**256 // int(lhr) - 1 (work.py:372-373). Derive (python3): |
| 44 | +// "%064x" % (2**256//10000000000 - 1) |
| 45 | +TEST(DashWorkJobTargets, PseudoshareExact) |
| 46 | +{ |
| 47 | + EXPECT_EQ(modulate_desired_pseudoshare_target(1e10).GetHex(), |
| 48 | + "000000006df37f675ef6eadf5ab9a2072d44268d97df837e6748956e5c6c2116"); |
| 49 | +} |
| 50 | + |
| 51 | +// clip_to_sane = math.clip(x, (lo, hi)) (work.py:393). |
| 52 | +TEST(DashWorkJobTargets, ClipBelowMinReturnsMin) |
| 53 | +{ |
| 54 | + EXPECT_EQ(clip_to_sane(U("01"), U(SMIN_HEX), U(SMAX_HEX)).GetHex(), SMIN_HEX); |
| 55 | +} |
| 56 | +TEST(DashWorkJobTargets, ClipAboveMaxReturnsMax) |
| 57 | +{ |
| 58 | + EXPECT_EQ(clip_to_sane(U(MAX_HEX), U(SMIN_HEX), U(SMAX_HEX)).GetHex(), SMAX_HEX); |
| 59 | +} |
| 60 | +TEST(DashWorkJobTargets, ClipInRangeUnchanged) |
| 61 | +{ |
| 62 | + // MID = SMIN*2, derived in-range (python3): smin=(0xFFFF*2**208)//10000 |
| 63 | + const char* MID = |
| 64 | + "00000000000d1b645a1cac083126e978d4fdf3b645a1cac083126e978d4fdf3a"; |
| 65 | + EXPECT_EQ(clip_to_sane(U(MID), U(SMIN_HEX), U(SMAX_HEX)).GetHex(), MID); |
| 66 | +} |
| 67 | + |
| 68 | +// dash::PoolConfig SANE_TARGET_RANGE SSOT == oracle networks/dash.py:33 + |
| 69 | +// dash_testnet.py:27. |
| 70 | +TEST(DashWorkJobTargets, PoolConfigSaneMatchesOracleMainnet) |
| 71 | +{ |
| 72 | + dash::PoolConfig::is_testnet = false; |
| 73 | + EXPECT_EQ(dash::PoolConfig::sane_target_min().GetHex(), SMIN_HEX); |
| 74 | + EXPECT_EQ(dash::PoolConfig::sane_target_max().GetHex(), SMAX_HEX); |
| 75 | +} |
| 76 | +TEST(DashWorkJobTargets, PoolConfigSaneMatchesOracleTestnet) |
| 77 | +{ |
| 78 | + dash::PoolConfig::is_testnet = true; |
| 79 | + EXPECT_EQ(dash::PoolConfig::sane_target_min().GetHex(), |
| 80 | + "00000000000010c6f7a0b5ed8d36b4c7f34938583621fafc8b0079a2834d26f9"); |
| 81 | + EXPECT_EQ(dash::PoolConfig::sane_target_max().GetHex(), |
| 82 | + "00000fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); |
| 83 | + dash::PoolConfig::is_testnet = false; // restore SSOT default |
| 84 | +} |
| 85 | + |
| 86 | +// assemble: None-path, modulated pseudoshare in SANE range -> share_target is the |
| 87 | +// modulated value unchanged; min_share_target = share bits (below sane_max). |
| 88 | +// SHAREBITS = SMIN*3 (in-range, < sane_max). lhr=1e10 -> PseudoshareExact value. |
| 89 | +TEST(DashWorkJobTargets, AssembleNonePathInRange) |
| 90 | +{ |
| 91 | + WorkJobTargetInputs in; |
| 92 | + in.share_info_bits_target = |
| 93 | + U("000000000013a916872b020c49ba5e353f7ced916872b020c49ba5e353f7ced7"); |
| 94 | + in.sane_target_min = U(SMIN_HEX); |
| 95 | + in.sane_target_max = U(SMAX_HEX); |
| 96 | + in.have_desired_pseudoshare = false; |
| 97 | + in.local_hash_rate = 1e10; |
| 98 | + |
| 99 | + WorkJobTargets out = assemble_work_job_targets(in); |
| 100 | + EXPECT_EQ(out.share_target.GetHex(), |
| 101 | + "000000006df37f675ef6eadf5ab9a2072d44268d97df837e6748956e5c6c2116"); |
| 102 | + EXPECT_EQ(out.min_share_target.GetHex(), |
| 103 | + "000000000013a916872b020c49ba5e353f7ced916872b020c49ba5e353f7ced7"); |
| 104 | +} |
| 105 | + |
| 106 | +// assemble: client-SUPPLIED pseudoshare target above sane_max -> clipped to |
| 107 | +// sane_max; share bits also above sane_max -> min_share_target floored to sane_max. |
| 108 | +TEST(DashWorkJobTargets, AssembleSuppliedClippedAndFloored) |
| 109 | +{ |
| 110 | + WorkJobTargetInputs in; |
| 111 | + in.share_info_bits_target = U(MAX_HEX); // above sane_max -> floored |
| 112 | + in.sane_target_min = U(SMIN_HEX); |
| 113 | + in.sane_target_max = U(SMAX_HEX); |
| 114 | + in.have_desired_pseudoshare = true; |
| 115 | + in.desired_pseudoshare_target = U(MAX_HEX); // above sane_max -> clipped |
| 116 | + |
| 117 | + WorkJobTargets out = assemble_work_job_targets(in); |
| 118 | + EXPECT_EQ(out.share_target.GetHex(), SMAX_HEX); |
| 119 | + EXPECT_EQ(out.min_share_target.GetHex(), SMAX_HEX); |
| 120 | +} |
0 commit comments