// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2022 The Limenka developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef LIMENKA_CONSENSUS_PARAMS_H #define LIMENKA_CONSENSUS_PARAMS_H #include #include #include #include #include #include namespace Consensus { // Fork identifier committed to sighash preimage for replay protection. /** * A buried deployment is one where the height of the activation has been hardcoded into * the client implementation long after the consensus change has activated. See BIP 90. */ enum BuriedDeployment : int16_t { // buried deployments get negative values to avoid overlap with DeploymentPos DEPLOYMENT_HEIGHTINCB = std::numeric_limits::min(), DEPLOYMENT_CLTV, DEPLOYMENT_DERSIG, DEPLOYMENT_CSV, DEPLOYMENT_SEGWIT, }; constexpr bool ValidDeployment(BuriedDeployment dep) { return dep <= DEPLOYMENT_SEGWIT; } enum DeploymentPos : uint16_t { DEPLOYMENT_TESTDUMMY, DEPLOYMENT_TAPROOT, // Deployment of Schnorr/Taproot (BIPs 340-342) DEPLOYMENT_REDUCED_DATA, // ReducedData Temporary Softfork (RDTS) DEPLOYMENT_P2SPKH, // NOTE: Also add new deployments to VersionBitsDeploymentInfo in deploymentinfo.cpp MAX_VERSION_BITS_DEPLOYMENTS }; constexpr bool ValidDeployment(DeploymentPos dep) { return dep < MAX_VERSION_BITS_DEPLOYMENTS; } /** * Struct for each individual consensus rule change using BIP9. */ struct BIP9Deployment { /** Bit position to select the particular bit in nVersion. */ int bit{28}; /** Start MedianTime for version bits miner confirmation. Can be a date in the past */ int64_t nStartTime{NEVER_ACTIVE}; /** Timeout/expiry MedianTime for the deployment attempt. */ int64_t nTimeout{NEVER_ACTIVE}; /** If lock in occurs, delay activation until at least this block * height. Note that activation will only occur on a retarget * boundary. */ int min_activation_height{0}; /** Maximum height for activation. If less than INT_MAX, the deployment will activate * at this height regardless of signaling (similar to BIP8 flag day). * std::numeric_limits::max() means no maximum (activation only via signaling). */ int max_activation_height{std::numeric_limits::max()}; /** For temporary softforks: number of blocks the deployment remains active after activation. * std::numeric_limits::max() means permanent (never expires). */ int active_duration{std::numeric_limits::max()}; /** Per-deployment activation threshold. If 0, uses the global nRuleChangeActivationThreshold. * Otherwise, specifies the number of blocks required for this specific deployment. */ int threshold{0}; /** Constant for nTimeout very far in the future. */ static constexpr int64_t NO_TIMEOUT = std::numeric_limits::max(); /** Special value for nStartTime indicating that the deployment is always active. * This is useful for testing, as it means tests don't need to deal with the activation * process (which takes at least 3 BIP9 intervals). Only tests that specifically test the * behaviour during activation cannot use this. */ static constexpr int64_t ALWAYS_ACTIVE = -1; /** Special value for nStartTime indicating that the deployment is never active. * This is useful for integrating the code changes for a new feature * prior to deploying it on some or all networks. */ static constexpr int64_t NEVER_ACTIVE = -2; }; /** * Parameters that influence chain consensus. */ struct Params { uint256 hashGenesisBlock; int nSubsidyHalvingInterval; /** * Hashes of blocks that * - are known to be consensus valid, and * - buried in the chain, and * - fail if the default script verify flags are applied. */ std::map script_flag_exceptions; /** Block height and hash at which BIP34 becomes active */ int BIP34Height; uint256 BIP34Hash; /** Block height at which BIP65 becomes active */ int BIP65Height; /** Block height at which BIP66 becomes active */ int BIP66Height; /** Block height at which CSV (BIP68, BIP112 and BIP113) becomes active */ int CSVHeight; /** Block height at which Segwit (BIP141, BIP143 and BIP147) becomes active. * Note that segwit v0 script rules are enforced on all blocks except the * BIP 16 exception blocks. */ int SegwitHeight; /** Don't warn about unknown BIP 9 activations below this height. * This prevents us from warning about the CSV and segwit activations. */ int MinBIP9WarningHeight; /** * Minimum blocks including miner confirmation of the total of 2016 blocks in a retargeting period, * (nPowTargetTimespan / nPowTargetSpacing) which is also used for BIP9 deployments. * Examples: 1916 for 95%, 1512 for testchains. */ uint32_t nRuleChangeActivationThreshold; uint32_t nMinerConfirmationWindow; BIP9Deployment vDeployments[MAX_VERSION_BITS_DEPLOYMENTS]; /** Proof of work parameters */ uint256 powLimit; bool fPowAllowMinDifficultyBlocks; /** * Enforce BIP94 timewarp attack mitigation. On testnet4 this also enforces * the block storm mitigation. */ bool enforce_BIP94; bool fPowNoRetargeting; int64_t nPowTargetSpacing; int64_t nPowTargetTimespan; std::chrono::seconds PowTargetSpacing() const { return std::chrono::seconds{nPowTargetSpacing}; } int64_t DifficultyAdjustmentInterval() const { return nPowTargetTimespan / nPowTargetSpacing; } /** The best chain should have at least this much work */ uint256 nMinimumChainWork; /** By default assume that the signatures in ancestors of this block are valid */ uint256 defaultAssumeValid; /** * If true, witness commitments contain a payload equal to a Limenka Script solution * to the signet challenge. See BIP325. */ bool signet_blocks{false}; std::vector signet_challenge; // Fork chain parameters (only meaningful when ChainType == FORK) int64_t nForkActivationMTP{std::numeric_limits::max()}; // MTP-based activation timestamp (2026-10-18 09:00 EDT = 1792328400) int64_t nForkActivationBias{30000}; // median-lag compensation: 50 blocks * 600s int32_t nForkMTPWindow{101}; // activation gate median window int64_t nForkFutureLimit{60}; // fork block future-time limit (down from the parent's 2h) int64_t nForkIntervalTarget{617}; // calibrated controller setpoint (lands the cadence at ~600s) uint64_t nForkDelaySteps{0}; // long-division delay: sequential steps per block (2^33) // PI gains (corrected naming: P = instantaneous error, I = EMA // accumulator - the 2021 lineage had these swapped), scaled by 1e6. int64_t nForkKp{}; // proportional, symmetric int64_t nForkKiUp{}; // integral when blocks are early (raise slow, flood-proof) int64_t nForkKiDown{}; // integral when blocks are late (lower fast, quick restore) int DeploymentHeight(BuriedDeployment dep) const { switch (dep) { case DEPLOYMENT_HEIGHTINCB: return BIP34Height; case DEPLOYMENT_CLTV: return BIP65Height; case DEPLOYMENT_DERSIG: return BIP66Height; case DEPLOYMENT_CSV: return CSVHeight; case DEPLOYMENT_SEGWIT: return SegwitHeight; } // no default case, so the compiler can warn about missing cases return std::numeric_limits::max(); } }; } // namespace Consensus class CBlockIndex; // Returns true if fork rules are active for a block built on pindexPrev: // the fork activates when MTP(pindexPrev) (nForkMTPWindow-window median, // compensated by nForkActivationBias for the median's ~50-block lag) // reaches nForkActivationMTP. Blocks below the gate use parent chain // rules. Defined in chain.h after CBlockIndex. bool IsForkActive(const CBlockIndex* pindexPrev, const Consensus::Params& params); #endif // LIMENKA_CONSENSUS_PARAMS_H