Skip to content

Commit a637b36

Browse files
authored
Merge pull request #160 from frstrtr/bch/version-gate-ssot-delegation
bch: delegate V36 share-version gate to core::version_gate SSOT
2 parents 02a9571 + 7d43194 commit a637b36

2 files changed

Lines changed: 34 additions & 32 deletions

File tree

src/impl/bch/share.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "coin/block.hpp"
44
#include "share_types.hpp"
5+
#include <core/version_gate.hpp> // SSOT: core::version_gate::is_v36_active
56

67
#include <sharechain/sharechain.hpp>
78
#include <sharechain/share.hpp>
@@ -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/bch/share_check.hpp

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "share.hpp"
88
#include "share_messages.hpp"
99
#include "share_types.hpp"
10+
#include <core/version_gate.hpp> // SSOT: core::version_gate::is_v36_active
1011

1112
#include <core/hash.hpp>
1213
#include <core/pack.hpp>
@@ -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, bool check_pow = true)
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, bool check_pow = true)
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, bool check_pow = true)
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, bool check_pow = true)
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, bool check_pow = true)
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;
@@ -935,7 +936,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, bool
935936
// p2pool selects PPLNS formula by runtime AutoRatchet state, not compile-time
936937
// share version. When v36_active is true (AutoRatchet ACTIVATED/CONFIRMED),
937938
// use v36 PPLNS even for v35 shares. Ref: p2pool data.py:879, work.py:759.
938-
const bool use_v36_pplns = v36_active || (ver >= 36);
939+
const bool use_v36_pplns = v36_active || (core::version_gate::is_v36_active(ver));
939940
const uint64_t subsidy = share.m_subsidy;
940941
const uint16_t donation = share.m_donation;
941942

@@ -1268,7 +1269,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, bool
12681269
else
12691270
ref_stream << share.m_pubkey_hash;
12701271

1271-
if constexpr (ver >= 36)
1272+
if constexpr (core::version_gate::is_v36_active(ver))
12721273
::Serialize(ref_stream, VarInt(share.m_subsidy));
12731274
else
12741275
ref_stream << share.m_subsidy;
@@ -1297,7 +1298,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, bool
12971298
}
12981299
}
12991300

1300-
if constexpr (ver >= 36)
1301+
if constexpr (core::version_gate::is_v36_active(ver))
13011302
{
13021303
if constexpr (requires { share.m_merged_addresses; })
13031304
ref_stream << share.m_merged_addresses;
@@ -1315,7 +1316,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, bool
13151316
ref_stream << share.m_timestamp;
13161317
ref_stream << share.m_absheight;
13171318

1318-
if constexpr (ver >= 36)
1319+
if constexpr (core::version_gate::is_v36_active(ver))
13191320
{
13201321
if constexpr (requires { share.m_abswork; })
13211322
::Serialize(ref_stream, Using<AbsworkV36Format>(share.m_abswork));
@@ -1325,7 +1326,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, bool
13251326
ref_stream << share.m_abswork;
13261327
}
13271328

1328-
if constexpr (ver >= 36)
1329+
if constexpr (core::version_gate::is_v36_active(ver))
13291330
{
13301331
if constexpr (requires { share.m_merged_coinbase_info; })
13311332
ref_stream << share.m_merged_coinbase_info;
@@ -1335,7 +1336,7 @@ uint256 generate_share_transaction(const ShareT& share, TrackerT& tracker, bool
13351336
}
13361337

13371338
// V36 ref_type includes message_data (must match verify_share)
1338-
if constexpr (ver >= 36)
1339+
if constexpr (core::version_gate::is_v36_active(ver))
13391340
{
13401341
if constexpr (requires { share.m_message_data; })
13411342
ref_stream << share.m_message_data;
@@ -1737,7 +1738,7 @@ bool share_check(const ShareT& share,
17371738
// This ensures V35 shares always verify with V35 PPLNS formula, even after
17381739
// the AutoRatchet transitions to ACTIVATED.
17391740
constexpr int64_t share_ver = ShareT::version;
1740-
bool v36_active = (share_ver >= 36);
1741+
bool v36_active = (core::version_gate::is_v36_active(share_ver));
17411742
if (!share.m_prev_hash.IsNull() && tracker.chain.contains(share.m_prev_hash))
17421743
{
17431744
uint256 expected_gentx = generate_share_transaction(share, tracker, false, v36_active);
@@ -1861,7 +1862,7 @@ bool share_check(const ShareT& share,
18611862
// independently compute from the share chain. Without this, a malicious
18621863
// node could steal all merged chain (DOGE) rewards while appearing honest
18631864
// on the parent chain (LTC payouts are consensus-enforced via gentx above).
1864-
if constexpr (ShareT::version >= 36)
1865+
if constexpr (core::version_gate::is_v36_active(ShareT::version))
18651866
{
18661867
if constexpr (requires { share.m_merged_payout_hash; })
18671868
{
@@ -1889,7 +1890,7 @@ bool share_check(const ShareT& share,
18891890

18901891
// 5. V36+ merged coinbase commitment verification (7-step chain)
18911892
// Verifies the actual merged coinbase matches canonical PPLNS construction.
1892-
if constexpr (ShareT::version >= 36)
1893+
if constexpr (core::version_gate::is_v36_active(ShareT::version))
18931894
{
18941895
auto mcv_err = verify_merged_coinbase_commitment(share, tracker);
18951896
if (!mcv_err.empty())
@@ -1959,7 +1960,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker)
19591960
else
19601961
ref_stream << share.m_pubkey_hash;
19611962

1962-
if constexpr (ver >= 36)
1963+
if constexpr (core::version_gate::is_v36_active(ver))
19631964
::Serialize(ref_stream, VarInt(share.m_subsidy));
19641965
else
19651966
ref_stream << share.m_subsidy;
@@ -1987,7 +1988,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker)
19871988
}
19881989
}
19891990

1990-
if constexpr (ver >= 36)
1991+
if constexpr (core::version_gate::is_v36_active(ver))
19911992
{
19921993
if constexpr (requires { share.m_merged_addresses; })
19931994
ref_stream << share.m_merged_addresses;
@@ -2005,7 +2006,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker)
20052006
ref_stream << share.m_timestamp;
20062007
ref_stream << share.m_absheight;
20072008

2008-
if constexpr (ver >= 36)
2009+
if constexpr (core::version_gate::is_v36_active(ver))
20092010
{
20102011
if constexpr (requires { share.m_abswork; })
20112012
::Serialize(ref_stream, Using<AbsworkV36Format>(share.m_abswork));
@@ -2015,7 +2016,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker)
20152016
ref_stream << share.m_abswork;
20162017
}
20172018

2018-
if constexpr (ver >= 36)
2019+
if constexpr (core::version_gate::is_v36_active(ver))
20192020
{
20202021
if constexpr (requires { share.m_merged_coinbase_info; })
20212022
ref_stream << share.m_merged_coinbase_info;
@@ -2025,7 +2026,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker)
20252026
}
20262027

20272028
// V36 ref_type includes message_data
2028-
if constexpr (ver >= 36)
2029+
if constexpr (core::version_gate::is_v36_active(ver))
20292030
{
20302031
if constexpr (requires { share.m_message_data; })
20312032
ref_stream << share.m_message_data;
@@ -2050,7 +2051,7 @@ uint256 verify_share(const ShareT& share, TrackerT& tracker)
20502051
uint256 gentx_hash = check_hash_link(share.m_hash_link, hash_link_data, gentx_before_refhash);
20512052

20522053
// V36+: Validate message_data (reject shares with invalid encrypted messages)
2053-
if constexpr (ver >= 36)
2054+
if constexpr (core::version_gate::is_v36_active(ver))
20542055
{
20552056
if constexpr (requires { share.m_message_data; })
20562057
{
@@ -3252,7 +3253,7 @@ uint256 create_local_share(
32523253
{
32533254
static int xcheck_count = 0;
32543255
if (true) { // Always cross-check (was: xcheck_count < 5)
3255-
uint256 verify_hash = generate_share_transaction<MergedMiningShare>(*heap_share, tracker, true, (MergedMiningShare::version >= 36));
3256+
uint256 verify_hash = generate_share_transaction<MergedMiningShare>(*heap_share, tracker, true, (core::version_gate::is_v36_active(MergedMiningShare::version)));
32563257
bool xcheck_ok = (verify_hash == gentx_hash_for_header);
32573258
if (xcheck_ok) {
32583259
LOG_INFO << "[Pool] Cross-check PASSED";

0 commit comments

Comments
 (0)