Skip to content

Commit cb40c76

Browse files
authored
Merge pull request #159 from frstrtr/dgb/version-gate-delegation
dgb: delegate V36 version-gate sites to core::version_gate SSOT (#148)
2 parents a637b36 + 7fa527b commit cb40c76

3 files changed

Lines changed: 36 additions & 33 deletions

File tree

src/impl/dgb/share.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <core/pack_types.hpp>
99
#include <core/netaddress.hpp>
1010
#include <core/uint256.hpp>
11+
#include <core/version_gate.hpp> // SSOT: core::version_gate::is_v36_active
1112
#include <core/target_utils.hpp>
1213

1314
#include <map>
@@ -159,7 +160,7 @@ struct Formatter
159160
);
160161

161162
// Address handling — version-dependent
162-
if constexpr (version >= 36)
163+
if constexpr (core::version_gate::is_v36_active(version))
163164
{
164165
READWRITE(obj->m_pubkey_hash); // IntType(160)
165166
READWRITE(obj->m_pubkey_type); // IntType(8)
@@ -174,7 +175,7 @@ struct Formatter
174175
}
175176

176177
// Subsidy — V36 uses VarInt, others use fixed uint64
177-
if constexpr (version >= 36)
178+
if constexpr (core::version_gate::is_v36_active(version))
178179
{
179180
READWRITE(VarInt(obj->m_subsidy));
180181
}
@@ -195,7 +196,7 @@ struct Formatter
195196
}
196197

197198
// V36: merged_addresses (after segwit_data, before far_share_hash)
198-
if constexpr (version >= 36)
199+
if constexpr (core::version_gate::is_v36_active(version))
199200
{
200201
READWRITE(obj->m_merged_addresses);
201202
}
@@ -214,7 +215,7 @@ struct Formatter
214215
);
215216

216217
// Abswork — V36 uses VarInt-encoded uint64, others use fixed uint128
217-
if constexpr (version >= 36)
218+
if constexpr (core::version_gate::is_v36_active(version))
218219
{
219220
READWRITE(Using<AbsworkV36Format>(obj->m_abswork));
220221
}
@@ -224,7 +225,7 @@ struct Formatter
224225
}
225226

226227
// V36: merged_coinbase_info + merged_payout_hash (after abswork)
227-
if constexpr (version >= 36)
228+
if constexpr (core::version_gate::is_v36_active(version))
228229
{
229230
READWRITE(obj->m_merged_coinbase_info);
230231
READWRITE(obj->m_merged_payout_hash);
@@ -244,7 +245,7 @@ struct Formatter
244245
);
245246

246247
// V36: message_data (at the end)
247-
if constexpr (version >= 36)
248+
if constexpr (core::version_gate::is_v36_active(version))
248249
{
249250
READWRITE(obj->m_message_data);
250251
}

src/impl/dgb/share_check.hpp

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <core/pow.hpp>
1616
#include <core/target_utils.hpp>
1717
#include <core/uint256.hpp>
18+
#include <core/version_gate.hpp> // SSOT: core::version_gate::is_v36_active
1819
#include <btclibs/crypto/common.h>
1920
#include <btclibs/crypto/sha256.h>
2021
#include <btclibs/crypto/scrypt.h>
@@ -374,7 +375,7 @@ inline std::pair<uint256, uint64_t> compute_ref_hash_for_work(const RefHashParam
374375

375376
ref_stream << p.share_nonce;
376377

377-
if (p.share_version >= 36) {
378+
if (core::version_gate::is_v36_active(p.share_version)) {
378379
// V36: pubkey_hash (uint160) + pubkey_type (uint8)
379380
ref_stream << p.pubkey_hash;
380381
ref_stream << p.pubkey_type;
@@ -399,7 +400,7 @@ inline std::pair<uint256, uint64_t> compute_ref_hash_for_work(const RefHashParam
399400
ref_stream << p.segwit_data;
400401

401402
// V36: merged_addresses (after segwit_data, before far_share_hash)
402-
if (p.share_version >= 36)
403+
if (core::version_gate::is_v36_active(p.share_version))
403404
ref_stream << p.merged_addresses;
404405

405406
ref_stream << p.far_share_hash;
@@ -408,7 +409,7 @@ inline std::pair<uint256, uint64_t> compute_ref_hash_for_work(const RefHashParam
408409
ref_stream << p.timestamp;
409410
ref_stream << p.absheight;
410411

411-
if (p.share_version >= 36) {
412+
if (core::version_gate::is_v36_active(p.share_version)) {
412413
::Serialize(ref_stream, Using<AbsworkV36Format>(p.abswork));
413414
ref_stream << p.merged_coinbase_info;
414415
ref_stream << p.merged_payout_hash;
@@ -426,10 +427,10 @@ inline std::pair<uint256, uint64_t> compute_ref_hash_for_work(const RefHashParam
426427
{
427428
static int rfn_log = 0;
428429
static int rfn_v36_log = 0;
429-
bool should_log = (rfn_log < 3) || (p.share_version >= 36 && rfn_v36_log < 5);
430+
bool should_log = (rfn_log < 3) || (core::version_gate::is_v36_active(p.share_version) && rfn_v36_log < 5);
430431
if (should_log) {
431432
rfn_log++;
432-
if (p.share_version >= 36) rfn_v36_log++;
433+
if (core::version_gate::is_v36_active(p.share_version)) rfn_v36_log++;
433434
static const char* HX = "0123456789abcdef";
434435
std::string hex;
435436
auto* rd = reinterpret_cast<const unsigned char*>(ref_stream.data());
@@ -543,7 +544,7 @@ uint256 share_init_verify(const ShareT& share, const core::CoinParams& params, b
543544
ref_stream << share.m_pubkey_hash;
544545

545546
// subsidy: VarInt for V36+, raw uint64_t LE for older
546-
if constexpr (ver >= 36)
547+
if constexpr (core::version_gate::is_v36_active(ver))
547548
::Serialize(ref_stream, VarInt(share.m_subsidy));
548549
else
549550
ref_stream << share.m_subsidy;
@@ -578,7 +579,7 @@ uint256 share_init_verify(const ShareT& share, const core::CoinParams& params, b
578579
}
579580

580581
// merged_addresses (V36+)
581-
if constexpr (ver >= 36)
582+
if constexpr (core::version_gate::is_v36_active(ver))
582583
{
583584
if constexpr (requires { share.m_merged_addresses; })
584585
ref_stream << share.m_merged_addresses;
@@ -599,7 +600,7 @@ uint256 share_init_verify(const ShareT& share, const core::CoinParams& params, b
599600
ref_stream << share.m_absheight;
600601

601602
// abswork: AbsworkV36Format for V36+, raw uint128 LE for older
602-
if constexpr (ver >= 36)
603+
if constexpr (core::version_gate::is_v36_active(ver))
603604
{
604605
if constexpr (requires { share.m_abswork; })
605606
::Serialize(ref_stream, Using<AbsworkV36Format>(share.m_abswork));
@@ -610,7 +611,7 @@ uint256 share_init_verify(const ShareT& share, const core::CoinParams& params, b
610611
}
611612

612613
// V36+ merged mining commitment fields
613-
if constexpr (ver >= 36)
614+
if constexpr (core::version_gate::is_v36_active(ver))
614615
{
615616
if constexpr (requires { share.m_merged_coinbase_info; })
616617
ref_stream << share.m_merged_coinbase_info;
@@ -621,7 +622,7 @@ uint256 share_init_verify(const ShareT& share, const core::CoinParams& params, b
621622

622623
// V36 ref_type includes message_data as PossiblyNoneType(b'', VarStrType())
623624
// When m_message_data is empty, BaseScript serialises as varint(0) = 0x00.
624-
if constexpr (ver >= 36)
625+
if constexpr (core::version_gate::is_v36_active(ver))
625626
{
626627
if constexpr (requires { share.m_message_data; })
627628
ref_stream << share.m_message_data;
@@ -937,7 +938,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, const
937938
// p2pool selects PPLNS formula by runtime AutoRatchet state, not compile-time
938939
// share version. When v36_active is true (AutoRatchet ACTIVATED/CONFIRMED),
939940
// use v36 PPLNS even for v35 shares. Ref: p2pool data.py:879, work.py:759.
940-
const bool use_v36_pplns = v36_active || (ver >= 36);
941+
const bool use_v36_pplns = v36_active || (core::version_gate::is_v36_active(ver));
941942
const uint64_t subsidy = share.m_subsidy;
942943
const uint16_t donation = share.m_donation;
943944

@@ -1270,7 +1271,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, const
12701271
else
12711272
ref_stream << share.m_pubkey_hash;
12721273

1273-
if constexpr (ver >= 36)
1274+
if constexpr (core::version_gate::is_v36_active(ver))
12741275
::Serialize(ref_stream, VarInt(share.m_subsidy));
12751276
else
12761277
ref_stream << share.m_subsidy;
@@ -1299,7 +1300,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, const
12991300
}
13001301
}
13011302

1302-
if constexpr (ver >= 36)
1303+
if constexpr (core::version_gate::is_v36_active(ver))
13031304
{
13041305
if constexpr (requires { share.m_merged_addresses; })
13051306
ref_stream << share.m_merged_addresses;
@@ -1317,7 +1318,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, const
13171318
ref_stream << share.m_timestamp;
13181319
ref_stream << share.m_absheight;
13191320

1320-
if constexpr (ver >= 36)
1321+
if constexpr (core::version_gate::is_v36_active(ver))
13211322
{
13221323
if constexpr (requires { share.m_abswork; })
13231324
::Serialize(ref_stream, Using<AbsworkV36Format>(share.m_abswork));
@@ -1327,7 +1328,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, const
13271328
ref_stream << share.m_abswork;
13281329
}
13291330

1330-
if constexpr (ver >= 36)
1331+
if constexpr (core::version_gate::is_v36_active(ver))
13311332
{
13321333
if constexpr (requires { share.m_merged_coinbase_info; })
13331334
ref_stream << share.m_merged_coinbase_info;
@@ -1337,7 +1338,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, const
13371338
}
13381339

13391340
// V36 ref_type includes message_data (must match verify_share)
1340-
if constexpr (ver >= 36)
1341+
if constexpr (core::version_gate::is_v36_active(ver))
13411342
{
13421343
if constexpr (requires { share.m_message_data; })
13431344
ref_stream << share.m_message_data;
@@ -1779,7 +1780,7 @@ bool share_check(const ShareT& share,
17791780
// This ensures V35 shares always verify with V35 PPLNS formula, even after
17801781
// the AutoRatchet transitions to ACTIVATED.
17811782
constexpr int64_t share_ver = ShareT::version;
1782-
bool v36_active = (share_ver >= 36);
1783+
bool v36_active = (core::version_gate::is_v36_active(share_ver));
17831784
if (!share.m_prev_hash.IsNull() && tracker.chain.contains(share.m_prev_hash))
17841785
{
17851786
uint256 expected_gentx = generate_share_transaction(share, tracker, params, false, v36_active);
@@ -1903,7 +1904,7 @@ bool share_check(const ShareT& share,
19031904
// independently compute from the share chain. Without this, a malicious
19041905
// node could steal all merged chain (DOGE) rewards while appearing honest
19051906
// on the parent chain (LTC payouts are consensus-enforced via gentx above).
1906-
if constexpr (ShareT::version >= 36)
1907+
if constexpr (core::version_gate::is_v36_active(ShareT::version))
19071908
{
19081909
if constexpr (requires { share.m_merged_payout_hash; })
19091910
{
@@ -1931,7 +1932,7 @@ bool share_check(const ShareT& share,
19311932

19321933
// 5. V36+ merged coinbase commitment verification (7-step chain)
19331934
// Verifies the actual merged coinbase matches canonical PPLNS construction.
1934-
if constexpr (ShareT::version >= 36)
1935+
if constexpr (core::version_gate::is_v36_active(ShareT::version))
19351936
{
19361937
auto mcv_err = verify_merged_coinbase_commitment(share, tracker, params);
19371938
if (!mcv_err.empty())
@@ -2001,7 +2002,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker, const core::CoinPar
20012002
else
20022003
ref_stream << share.m_pubkey_hash;
20032004

2004-
if constexpr (ver >= 36)
2005+
if constexpr (core::version_gate::is_v36_active(ver))
20052006
::Serialize(ref_stream, VarInt(share.m_subsidy));
20062007
else
20072008
ref_stream << share.m_subsidy;
@@ -2029,7 +2030,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker, const core::CoinPar
20292030
}
20302031
}
20312032

2032-
if constexpr (ver >= 36)
2033+
if constexpr (core::version_gate::is_v36_active(ver))
20332034
{
20342035
if constexpr (requires { share.m_merged_addresses; })
20352036
ref_stream << share.m_merged_addresses;
@@ -2047,7 +2048,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker, const core::CoinPar
20472048
ref_stream << share.m_timestamp;
20482049
ref_stream << share.m_absheight;
20492050

2050-
if constexpr (ver >= 36)
2051+
if constexpr (core::version_gate::is_v36_active(ver))
20512052
{
20522053
if constexpr (requires { share.m_abswork; })
20532054
::Serialize(ref_stream, Using<AbsworkV36Format>(share.m_abswork));
@@ -2057,7 +2058,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker, const core::CoinPar
20572058
ref_stream << share.m_abswork;
20582059
}
20592060

2060-
if constexpr (ver >= 36)
2061+
if constexpr (core::version_gate::is_v36_active(ver))
20612062
{
20622063
if constexpr (requires { share.m_merged_coinbase_info; })
20632064
ref_stream << share.m_merged_coinbase_info;
@@ -2067,7 +2068,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker, const core::CoinPar
20672068
}
20682069

20692070
// V36 ref_type includes message_data
2070-
if constexpr (ver >= 36)
2071+
if constexpr (core::version_gate::is_v36_active(ver))
20712072
{
20722073
if constexpr (requires { share.m_message_data; })
20732074
ref_stream << share.m_message_data;
@@ -2092,7 +2093,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker, const core::CoinPar
20922093
uint256 gentx_hash = check_hash_link(share.m_hash_link, hash_link_data, gentx_before_refhash);
20932094

20942095
// V36+: Validate message_data (reject shares with invalid encrypted messages)
2095-
if constexpr (ver >= 36)
2096+
if constexpr (core::version_gate::is_v36_active(ver))
20962097
{
20972098
if constexpr (requires { share.m_message_data; })
20982099
{
@@ -3280,7 +3281,7 @@ uint256 create_local_share(
32803281
{
32813282
static int xcheck_count = 0;
32823283
if (true) { // Always cross-check (was: xcheck_count < 5)
3283-
uint256 verify_hash = generate_share_transaction<MergedMiningShare>(*heap_share, tracker, params, true, (MergedMiningShare::version >= 36));
3284+
uint256 verify_hash = generate_share_transaction<MergedMiningShare>(*heap_share, tracker, params, true, (core::version_gate::is_v36_active(MergedMiningShare::version)));
32843285
bool xcheck_ok = (verify_hash == gentx_hash_for_header);
32853286
if (xcheck_ok) {
32863287
LOG_INFO << "[Pool] Cross-check PASSED";

src/impl/dgb/share_tracker.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ inline uint64_t mul128_shift(uint64_t a, uint64_t b, unsigned shift) {
2727
#include <core/target_utils.hpp>
2828
#include <core/coin_params.hpp>
2929
#include <core/uint256.hpp>
30+
#include <core/version_gate.hpp> // SSOT: core::version_gate::is_v36_active
3031
#include <core/netaddress.hpp>
3132
#include <sharechain/weights_skiplist.hpp>
3233
#include <btclibs/base58.h>
@@ -958,7 +959,7 @@ class ShareTracker
958959
prev_hash = obj->m_prev_hash;
959960
share_ver = obj->version;
960961
});
961-
if (share_ver >= 36) {
962+
if (core::version_gate::is_v36_active(share_ver)) {
962963

963964
if (!prev_hash.IsNull() && chain.contains(prev_hash)) {
964965
if (!pplns_active) {

0 commit comments

Comments
 (0)