From 84ad5d48f77feff4998a0a5fb7915f2dd40ba142 Mon Sep 17 00:00:00 2001 From: Alec Muffett Date: Sat, 30 May 2026 22:21:34 +0400 Subject: [PATCH] bucket-A3: add core/coin_params.hpp scaffolding (SAFE-ADDITIVE) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New coin-agnostic CoinParams scaffolding header — the shared description of a coin's consensus/network constants that the per-coin layers will populate and the core will consume. Purely additive: one new file, nothing on master includes it yet (the LTC/c2pool plumbing that consumes it is bucket A7), so no existing translation unit compiles it and LTC+DOGE behavior is unchanged. coin_params.hpp #includes core/pow.hpp, which lands in bucket A1 (#46) — that gives A3 a merge-ordering dependency on A1, not a code dependency on this branch: since nothing #includes coin_params.hpp on master, it is never pulled into a TU here and CI stays green. The include resolves once A1 is merged (A1 → A2/A3/A4 back-to-back per the landing plan). pow.hpp is intentionally NOT re-added here — it already ships in A1; adding it again would create a duplicate-add merge conflict. Cherry-picked from dash-spv-embedded HEAD 8249dc28. 1 file, +133: - new src/core/coin_params.hpp --- src/core/coin_params.hpp | 133 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 src/core/coin_params.hpp diff --git a/src/core/coin_params.hpp b/src/core/coin_params.hpp new file mode 100644 index 000000000..0fe31d128 --- /dev/null +++ b/src/core/coin_params.hpp @@ -0,0 +1,133 @@ +#pragma once + +// CoinParams: the "net" equivalent from Python p2pool. +// A single struct that carries ALL coin-specific and pool-specific parameters. +// Flows through the entire stack — share verification, tracker, node, stratum. +// Each coin module (ltc, dash, doge, btc) provides a factory function +// that returns a populated CoinParams instance. + +#include "pow.hpp" +#include "uint256.hpp" + +#include +#include +#include +#include +#include +#include + +namespace core +{ + +struct CoinParams +{ + // ======================================================================= + // Coin-level parameters (p2pool's net.PARENT) + // ======================================================================= + + std::string symbol; // "LTC", "DASH", "BTC", "DOGE" + uint32_t block_period = 0; // target block interval (seconds) + + // Address encoding + uint8_t address_version = 0; // P2PKH version byte + uint8_t address_p2sh_version = 0; // P2SH version byte + uint8_t address_p2sh_version2 = 0; // secondary P2SH version (LTC: 5) + std::string bech32_hrp; // bech32 prefix ("ltc1", "bc1", "") + + // PoW + PowFunc pow_func; // scrypt, sha256d, x11, ... + BlockHashFunc block_hash_func; // block identity hash (usually sha256d) + + // Block rewards + SubsidyFunc subsidy_func; // height -> reward in satoshis + + // Dust + uint64_t dust_threshold = 0; + + // Softforks + std::set softforks_required; + uint32_t segwit_activation_version = 0; // 0 = no segwit (Dash) + + // ======================================================================= + // Pool-level parameters (p2pool's net) + // ======================================================================= + + uint16_t p2p_port = 0; // p2pool P2P port + uint16_t worker_port = 0; // Stratum port + + uint32_t share_period = 0; // target share interval (seconds) + uint32_t chain_length = 0; // PPLNS window size (shares) + uint32_t real_chain_length = 0; // actual chain length for lookups + uint32_t target_lookbehind = 0; // shares to look back for target calc + uint32_t spread = 0; // PPLNS spread multiplier + uint32_t minimum_protocol_version = 0; // min p2pool protocol version + uint32_t block_max_size = 0; + uint32_t block_max_weight = 0; + + uint256 max_target; // easiest allowed share difficulty + + // Network identification + std::string identifier_hex; // 8-byte hex identifier + std::string prefix_hex; // 8-byte hex prefix + std::string testnet_identifier_hex; + std::string testnet_prefix_hex; + + // Bootstrap peers + std::vector bootstrap_addrs; + + // Donation scripts (consensus-critical) + DonationScriptFunc donation_script_func; + + // Share version + uint32_t current_share_version = 0; // 36 (LTC), 16 (Dash) + + // ======================================================================= + // Stratum vardiff config (matches upstream ref per coin) + // ======================================================================= + // + // LTC defaults match p2pool-merged-v36/bitcoin/stratum.py (jtoomim's + // two-trigger algorithm with N−1 interval denominator). + // + // Dash overrides match p2pool-dash/dash/stratum.py + networks/dash.py + // (ASIC-tuned three-trigger algorithm with quickup support and tighter + // clip bounds; uses N interval denominator). + struct VardiffConfig + { + double target_share_rate = 3.0; // target seconds per pseudoshare + uint32_t shares_trigger = 12; // trigger 1: adjust after this many shares + double timeout_mult = 10.0; // trigger 2: adjust if time > mult * N * rate + // Quickup trigger (p2pool-dash only; set quickup_shares = 0 to disable): + uint32_t quickup_shares = 0; // trigger 3: need at least N shares + double quickup_divisor = 3.0; // trigger 3: fire if time < target_time/divisor + double min_adjust = 0.1; // clip(ratio, min, max) bounds + double max_adjust = 10.0; + // Denominator policy for actual_rate calculation: + // false → N−1 intervals (matches p2pool-merged-v36 LTC: del [0]) + // true → N shares (matches p2pool-dash: no del) + bool use_full_window = false; + }; + VardiffConfig vardiff; + + // Runtime state + bool is_testnet = false; + + // ======================================================================= + // Convenience accessors (testnet-aware, like PoolConfig:: methods) + // ======================================================================= + + // These are populated by the coin module's factory based on is_testnet. + // Unlike PoolConfig's static methods, these are already resolved at + // construction time — no branching needed at call sites. + + const std::string& active_identifier_hex() const + { + return is_testnet ? testnet_identifier_hex : identifier_hex; + } + + const std::string& active_prefix_hex() const + { + return is_testnet ? testnet_prefix_hex : prefix_hex; + } +}; + +} // namespace core