// Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2014 The Bitcoin Core developers // Copyright (c) 2016-2020 The Hush developers // Distributed under the GPLv3 software license, see the accompanying // file COPYING or https://www.gnu.org/licenses/gpl-3.0.en.html /****************************************************************************** * Copyright © 2014-2019 The SuperNET Developers. * * * * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * * the top-level directory of this distribution for the individual copyright * * holder information and the developer policies on copyright and licensing. * * * * Unless otherwise agreed in a custom licensing agreement, no part of the * * SuperNET software, including this file may be copied, modified, propagated * * or distributed except according to the terms contained in the LICENSE file * * * * Removal or modification of this copyright notice is prohibited. * * * ******************************************************************************/ #ifndef HUSH_CONSENSUS_PARAMS_H #define HUSH_CONSENSUS_PARAMS_H #include "uint256.h" #include int32_t MAX_BLOCK_SIZE(int32_t height); namespace Consensus { /** * Index into Params.vUpgrades and NetworkUpgradeInfo * * Being array indices, these MUST be numbered consecutively. * * The order of these indices MUST match the order of the upgrades on-chain, as * several functions depend on the enum being sorted. */ enum UpgradeIndex { // Sprout must be first, puke BASE_SPROUT, UPGRADE_TESTDUMMY, UPGRADE_OVERWINTER, UPGRADE_SAPLING, // NOTE: Also add new upgrades to NetworkUpgradeInfo in upgrades.cpp MAX_NETWORK_UPGRADES }; struct NetworkUpgrade { /** * The first protocol version which will understand the new consensus rules */ int nProtocolVersion; /** * Height of the first block for which the new consensus rules will be active */ int nActivationHeight; /** * Special value for nActivationHeight indicating that the upgrade is always active. * This is useful for testing, as it means tests don't need to deal with the activation * process (namely, faking a chain of somewhat-arbitrary length). * * New blockchains that want to enable upgrade rules from the beginning can also use * this value. However, additional care must be taken to ensure the genesis block * satisfies the enabled rules. */ static constexpr int ALWAYS_ACTIVE = 0; /** * Special value for nActivationHeight indicating that the upgrade will never activate. * This is useful when adding upgrade code that has a testnet activation height, but * should remain disabled on mainnet. */ static constexpr int NO_ACTIVATION_HEIGHT = -1; }; // Parameters that influence chain consensus. struct Params { uint256 hashGenesisBlock; bool fCoinbaseMustBeProtected; /** Used to check majorities for block version upgrade */ int nMajorityEnforceBlockUpgrade; int nMajorityRejectBlockOutdated; int nMajorityWindow; NetworkUpgrade vUpgrades[MAX_NETWORK_UPGRADES]; /** Proof of work parameters */ uint256 powLimit; uint256 powAlternate; boost::optional nPowAllowMinDifficultyBlocksAfterHeight; int64_t nPowAveragingWindow; int64_t nPowMaxAdjustDown; int64_t nPowMaxAdjustUp; int64_t nPowTargetSpacing; int64_t nLwmaAjustedWeight; /* applied to all block times */ int64_t nMaxFutureBlockTime; // NOTE: These 3 functions should not have const return values because our blocktime halved at block 340k // but the entire codebase assumes Consensus::Params are const, route around the damange int64_t AveragingWindowTimespan() const { return nPowAveragingWindow * nPowTargetSpacing; } int64_t MinActualTimespan() const { return (AveragingWindowTimespan() * (100 - nPowMaxAdjustUp )) / 100; } int64_t MaxActualTimespan() const { return (AveragingWindowTimespan() * (100 + nPowMaxAdjustDown)) / 100; } void SetSaplingHeight(int32_t height) { vUpgrades[Consensus::UPGRADE_SAPLING].nActivationHeight = height; } void SetOverwinterHeight(int32_t height) { vUpgrades[Consensus::UPGRADE_OVERWINTER].nActivationHeight = height; } uint256 nMinimumChainWork; }; } // namespace Consensus #endif // HUSH_CONSENSUS_PARAMS_H