2013-05-07 15:16:25 +02:00
|
|
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
2023-08-16 19:27:31 +02:00
|
|
|
// Copyright (c) 2009-2020 The Bitcoin Core developers
|
2014-10-25 11:24:16 +02:00
|
|
|
// Distributed under the MIT software license, see the accompanying
|
2013-05-07 15:16:25 +02:00
|
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
|
2014-11-03 16:16:40 +01:00
|
|
|
#ifndef BITCOIN_CHAINPARAMS_H
|
|
|
|
#define BITCOIN_CHAINPARAMS_H
|
2013-05-07 15:16:25 +02:00
|
|
|
|
2020-03-19 23:46:56 +01:00
|
|
|
#include <chainparamsbase.h>
|
|
|
|
#include <consensus/params.h>
|
2021-10-15 12:28:19 +02:00
|
|
|
#include <llmq/params.h>
|
2023-07-14 17:22:44 +02:00
|
|
|
#include <netaddress.h>
|
2020-03-19 23:46:56 +01:00
|
|
|
#include <primitives/block.h>
|
|
|
|
#include <protocol.h>
|
2023-04-26 08:28:10 +02:00
|
|
|
#include <util/hash_type.h>
|
2013-05-07 15:16:25 +02:00
|
|
|
|
2017-05-09 09:29:12 +02:00
|
|
|
#include <memory>
|
fix: add missing includes and remove obsolete includes (#5562)
## Issue being fixed or feature implemented
Some headers or modules are used objects from STL without including it
directly, it cause compilation failures on some platforms for some
specific compilers such as #5554
## What was done?
Added missing includes and removed obsolete includes for `optional`,
`deque`, `tuple`, `unordered_set`, `unordered_map`, `set` and `atomic`.
Please, note, that this PR doesn't cover all cases, only cases when it
is obviously missing or obviously obsolete.
Also most of changes belongs to to dash specific code; but for cases of
original bitcoin code I keep it untouched, such as missing <map> in
`src/psbt.h`
I used this script to get a list of files/headers which looks suspicious
`./headers-scanner.sh std::optional optional`:
```bash
#!/bin/bash
set -e
function check_includes() {
obj=$1
header=$2
file=$3
used=0
included=0
grep "$obj" "$file" >/dev/null 2>/dev/null && used=1
grep "include <$header>" $file >/dev/null 2>/dev/null && included=1
if [ $used == 1 ] && [ $included == 0 ]
then echo "missing <$header> in $file"
fi
if [ $used == 0 ] && [ $included == 1 ]
then echo "obsolete <$header> in $file"
fi
}
export -f check_includes
obj=$1
header=$2
find src \( -name '*.h' -or -name '*.cpp' -or -name '*.hpp' \) -exec bash -c 'check_includes "$0" "$1" "$2"' "$obj" "$header" {} \;
```
## How Has This Been Tested?
Built code locally
## Breaking Changes
n/a
## Checklist:
- [x] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added or updated relevant unit/integration/functional/e2e
tests
- [ ] I have made corresponding changes to the documentation
- [x] I have assigned this pull request to a milestone
2023-09-07 16:07:02 +02:00
|
|
|
#include <optional>
|
2023-07-14 17:22:44 +02:00
|
|
|
#include <string>
|
2013-05-07 15:16:25 +02:00
|
|
|
#include <vector>
|
|
|
|
|
2015-06-05 21:36:34 +02:00
|
|
|
typedef std::map<int, uint256> MapCheckpoints;
|
|
|
|
|
|
|
|
struct CCheckpointData {
|
|
|
|
MapCheckpoints mapCheckpoints;
|
2017-01-12 12:12:56 +01:00
|
|
|
};
|
|
|
|
|
2023-04-26 08:28:10 +02:00
|
|
|
struct AssumeutxoHash : public BaseHash<uint256> {
|
|
|
|
explicit AssumeutxoHash(const uint256& hash) : BaseHash(hash) {}
|
|
|
|
};
|
|
|
|
|
2023-06-01 16:57:52 +02:00
|
|
|
/**
|
|
|
|
* Holds configuration for use during UTXO snapshot load and validation. The contents
|
|
|
|
* here are security critical, since they dictate which UTXO snapshots are recognized
|
|
|
|
* as valid.
|
|
|
|
*/
|
|
|
|
struct AssumeutxoData {
|
|
|
|
//! The expected hash of the deserialized UTXO set.
|
2023-04-26 08:28:10 +02:00
|
|
|
const AssumeutxoHash hash_serialized;
|
2023-06-01 16:57:52 +02:00
|
|
|
|
|
|
|
//! Used to populate the nChainTx value, which is used during BlockManager::LoadBlockIndex().
|
|
|
|
//!
|
|
|
|
//! We need to hardcode the value here because this is computed cumulatively using block data,
|
|
|
|
//! which we do not necessarily have at the time of snapshot load.
|
|
|
|
const unsigned int nChainTx;
|
|
|
|
};
|
|
|
|
|
|
|
|
using MapAssumeutxo = std::map<int, const AssumeutxoData>;
|
|
|
|
|
2018-04-23 17:08:34 +02:00
|
|
|
/**
|
|
|
|
* Holds various statistics on transactions within a chain. Used to estimate
|
|
|
|
* verification progress during chain sync.
|
|
|
|
*
|
|
|
|
* See also: CChainParams::TxData, GuessVerificationProgress.
|
|
|
|
*/
|
2017-01-12 12:12:56 +01:00
|
|
|
struct ChainTxData {
|
|
|
|
int64_t nTime;
|
|
|
|
int64_t nTxCount;
|
|
|
|
double dTxRate;
|
2015-06-05 21:36:34 +02:00
|
|
|
};
|
2015-01-24 05:40:50 +01:00
|
|
|
|
2013-05-07 15:16:25 +02:00
|
|
|
/**
|
|
|
|
* CChainParams defines various tweakable parameters of a given instance of the
|
2021-04-01 19:00:34 +02:00
|
|
|
* Dash system.
|
2013-05-07 15:16:25 +02:00
|
|
|
*/
|
|
|
|
class CChainParams
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
enum Base58Type {
|
|
|
|
PUBKEY_ADDRESS,
|
|
|
|
SCRIPT_ADDRESS,
|
2015-01-15 12:55:38 +01:00
|
|
|
SECRET_KEY, // BIP16
|
|
|
|
EXT_PUBLIC_KEY, // BIP32
|
|
|
|
EXT_SECRET_KEY, // BIP32
|
2013-05-07 15:16:25 +02:00
|
|
|
|
|
|
|
MAX_BASE58_TYPES
|
|
|
|
};
|
|
|
|
|
2015-02-11 11:58:11 +01:00
|
|
|
const Consensus::Params& GetConsensus() const { return consensus; }
|
2014-10-28 01:24:31 +01:00
|
|
|
const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; }
|
2021-03-01 21:35:28 +01:00
|
|
|
uint16_t GetDefaultPort() const { return nDefaultPort; }
|
2023-07-14 17:22:44 +02:00
|
|
|
uint16_t GetDefaultPort(Network net) const
|
|
|
|
{
|
|
|
|
return net == NET_I2P ? I2P_SAM31_PORT : GetDefaultPort();
|
|
|
|
}
|
|
|
|
uint16_t GetDefaultPort(const std::string& addr) const
|
|
|
|
{
|
|
|
|
CNetAddr a;
|
|
|
|
return a.SetSpecial(addr) ? GetDefaultPort(a.GetNetwork()) : GetDefaultPort();
|
|
|
|
}
|
2023-02-14 19:48:33 +01:00
|
|
|
uint16_t GetDefaultPlatformP2PPort() const { return nDefaultPlatformP2PPort; }
|
|
|
|
uint16_t GetDefaultPlatformHTTPPort() const { return nDefaultPlatformHTTPPort; }
|
2014-03-22 19:52:26 +01:00
|
|
|
|
2014-06-10 19:33:12 +02:00
|
|
|
const CBlock& GenesisBlock() const { return genesis; }
|
2017-12-20 12:45:01 +01:00
|
|
|
const CBlock& DevNetGenesisBlock() const { return devnetGenesis; }
|
2015-03-13 17:25:34 +01:00
|
|
|
/** Default value for -checkmempool and -checkblockindex argument */
|
|
|
|
bool DefaultConsistencyChecks() const { return fDefaultConsistencyChecks; }
|
2015-04-28 16:47:17 +02:00
|
|
|
/** Policy: Filter transactions that do not match well-defined patterns */
|
2014-06-04 12:51:29 +02:00
|
|
|
bool RequireStandard() const { return fRequireStandard; }
|
2018-07-12 11:04:42 +02:00
|
|
|
/** Require addresses specified with "-externalip" parameter to be routable */
|
|
|
|
bool RequireRoutableExternalIP() const { return fRequireRoutableExternalIP; }
|
2022-01-09 18:03:26 +01:00
|
|
|
/** If this chain allows time to be mocked */
|
|
|
|
bool IsMockableChain() const { return m_is_mockable_chain; }
|
2019-07-27 12:28:24 +02:00
|
|
|
/** If this chain is exclusively used for testing */
|
2019-07-16 22:07:14 +02:00
|
|
|
bool IsTestChain() const { return m_is_test_chain; }
|
2015-11-27 15:12:08 +01:00
|
|
|
uint64_t PruneAfterHeight() const { return nPruneAfterHeight; }
|
2019-01-12 01:33:11 +01:00
|
|
|
/** Minimum free space (in GB) needed for data directory */
|
|
|
|
uint64_t AssumedBlockchainSize() const { return m_assumed_blockchain_size; }
|
|
|
|
/** Minimum free space (in GB) needed for data directory when pruned; Does not include prune target*/
|
|
|
|
uint64_t AssumedChainStateSize() const { return m_assumed_chain_state_size; }
|
2019-07-16 22:07:14 +02:00
|
|
|
/** Whether it is possible to mine blocks on demand (no retargeting) */
|
|
|
|
bool MineBlocksOnDemand() const { return consensus.fPowNoRetargeting; }
|
2017-12-20 12:45:01 +01:00
|
|
|
/** Allow multiple addresses to be selected from the same network group (e.g. 192.168.x.x) */
|
|
|
|
bool AllowMultipleAddressesFromGroup() const { return fAllowMultipleAddressesFromGroup; }
|
2018-03-08 13:16:52 +01:00
|
|
|
/** Allow nodes with the same address and multiple ports */
|
|
|
|
bool AllowMultiplePorts() const { return fAllowMultiplePorts; }
|
2020-03-21 12:21:09 +01:00
|
|
|
/** How long to wait until we allow retrying of a LLMQ connection */
|
|
|
|
int LLMQConnectionRetryTimeout() const { return nLLMQConnectionRetryTimeout; }
|
2019-11-02 14:47:34 +01:00
|
|
|
/** Return the network string */
|
2014-06-11 12:23:49 +02:00
|
|
|
std::string NetworkIDString() const { return strNetworkID; }
|
2018-01-24 13:01:14 +01:00
|
|
|
/** Return the list of hostnames to look up for DNS seeds */
|
|
|
|
const std::vector<std::string>& DNSSeeds() const { return vSeeds; }
|
2014-06-04 12:51:29 +02:00
|
|
|
const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; }
|
2017-05-29 13:51:40 +02:00
|
|
|
int ExtCoinType() const { return nExtCoinType; }
|
2023-09-10 16:10:08 +02:00
|
|
|
const std::vector<uint8_t>& FixedSeeds() const { return vFixedSeeds; }
|
2015-06-05 21:36:34 +02:00
|
|
|
const CCheckpointData& Checkpoints() const { return checkpointData; }
|
2023-06-01 16:57:52 +02:00
|
|
|
|
|
|
|
//! Get allowed assumeutxo configuration.
|
|
|
|
//! @see ChainstateManager
|
|
|
|
const MapAssumeutxo& Assumeutxo() const { return m_assumeutxo_data; }
|
|
|
|
|
2017-01-12 12:12:56 +01:00
|
|
|
const ChainTxData& TxData() const { return chainTxData; }
|
2017-05-09 09:29:12 +02:00
|
|
|
void UpdateDIP3Parameters(int nActivationHeight, int nEnforcementHeight);
|
2020-12-28 12:21:01 +01:00
|
|
|
void UpdateDIP8Parameters(int nActivationHeight);
|
2017-05-09 09:29:12 +02:00
|
|
|
void UpdateBudgetParameters(int nMasternodePaymentsStartBlock, int nBudgetPaymentsStartBlock, int nSuperblockStartBlock);
|
2021-01-21 21:29:14 +01:00
|
|
|
void UpdateLLMQInstantSend(Consensus::LLMQType llmqType);
|
2023-09-06 15:10:26 +02:00
|
|
|
/**
|
2023-11-10 15:31:12 +01:00
|
|
|
* Validate params for Masternodes EHF
|
2023-09-06 15:10:26 +02:00
|
|
|
*
|
|
|
|
* @param[in] nBit The version bit to update
|
|
|
|
* @param[in] timePast The block time to validate if release is already time-outed
|
|
|
|
* @return Whether params are legit and params are updated (if release is known)
|
|
|
|
*/
|
2023-11-10 15:31:12 +01:00
|
|
|
bool IsValidMNActivation(int nBit, int64_t timePast) const;
|
2019-01-07 11:21:10 +01:00
|
|
|
int PoolMinParticipants() const { return nPoolMinParticipants; }
|
|
|
|
int PoolMaxParticipants() const { return nPoolMaxParticipants; }
|
2016-09-27 09:50:04 +02:00
|
|
|
int FulfilledRequestExpireTime() const { return nFulfilledRequestExpireTime; }
|
2018-09-30 19:01:33 +02:00
|
|
|
const std::vector<std::string>& SporkAddresses() const { return vSporkAddresses; }
|
|
|
|
int MinSporkKeys() const { return nMinSporkKeys; }
|
2023-03-13 17:11:17 +01:00
|
|
|
std::optional<Consensus::LLMQParams> GetLLMQ(Consensus::LLMQType llmqType) const;
|
2022-01-10 19:36:18 +01:00
|
|
|
|
2013-05-07 15:16:25 +02:00
|
|
|
protected:
|
2013-10-15 12:13:54 +02:00
|
|
|
CChainParams() {}
|
2013-05-07 15:16:25 +02:00
|
|
|
|
2015-02-11 11:58:11 +01:00
|
|
|
Consensus::Params consensus;
|
2014-10-28 01:24:31 +01:00
|
|
|
CMessageHeader::MessageStartChars pchMessageStart;
|
2021-03-01 21:35:28 +01:00
|
|
|
uint16_t nDefaultPort;
|
Add block pruning functionality
This adds a -prune=N option to bitcoind, which if set to N>0 will enable block
file pruning. When pruning is enabled, block and undo files will be deleted to
try to keep total space used by those files to below the prune target (N, in
MB) specified by the user, subject to some constraints:
- The last 288 blocks on the main chain are always kept (MIN_BLOCKS_TO_KEEP),
- N must be at least 550MB (chosen as a value for the target that could
reasonably be met, with some assumptions about block sizes, orphan rates,
etc; see comment in main.h),
- No blocks are pruned until chainActive is at least 100,000 blocks long (on
mainnet; defined separately for mainnet, testnet, and regtest in chainparams
as nPruneAfterHeight).
This unsets NODE_NETWORK if pruning is enabled.
Also included is an RPC test for pruning (pruning.py).
Thanks to @rdponticelli for earlier work on this feature; this is based in
part off that work.
2015-02-23 20:27:44 +01:00
|
|
|
uint64_t nPruneAfterHeight;
|
2019-01-12 01:33:11 +01:00
|
|
|
uint64_t m_assumed_blockchain_size;
|
|
|
|
uint64_t m_assumed_chain_state_size;
|
2018-01-24 13:01:14 +01:00
|
|
|
std::vector<std::string> vSeeds;
|
2013-06-23 02:33:47 +02:00
|
|
|
std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
|
2017-05-29 13:51:40 +02:00
|
|
|
int nExtCoinType;
|
2014-06-11 12:23:49 +02:00
|
|
|
std::string strNetworkID;
|
2014-06-04 12:51:29 +02:00
|
|
|
CBlock genesis;
|
2017-12-20 12:45:01 +01:00
|
|
|
CBlock devnetGenesis;
|
2023-09-10 16:10:08 +02:00
|
|
|
std::vector<uint8_t> vFixedSeeds;
|
2015-03-13 17:25:34 +01:00
|
|
|
bool fDefaultConsistencyChecks;
|
2014-06-04 12:51:29 +02:00
|
|
|
bool fRequireStandard;
|
2018-07-12 11:04:42 +02:00
|
|
|
bool fRequireRoutableExternalIP;
|
2019-07-16 22:07:14 +02:00
|
|
|
bool m_is_test_chain;
|
2017-12-20 12:45:01 +01:00
|
|
|
bool fAllowMultipleAddressesFromGroup;
|
2018-03-08 13:16:52 +01:00
|
|
|
bool fAllowMultiplePorts;
|
2022-01-09 18:03:26 +01:00
|
|
|
bool m_is_mockable_chain;
|
2020-03-21 12:21:09 +01:00
|
|
|
int nLLMQConnectionRetryTimeout;
|
2015-06-05 21:36:34 +02:00
|
|
|
CCheckpointData checkpointData;
|
2023-06-01 16:57:52 +02:00
|
|
|
MapAssumeutxo m_assumeutxo_data;
|
2017-01-12 12:12:56 +01:00
|
|
|
ChainTxData chainTxData;
|
2019-07-01 20:48:19 +02:00
|
|
|
int nPoolMinParticipants;
|
|
|
|
int nPoolMaxParticipants;
|
|
|
|
int nFulfilledRequestExpireTime;
|
2018-09-30 19:01:33 +02:00
|
|
|
std::vector<std::string> vSporkAddresses;
|
|
|
|
int nMinSporkKeys;
|
2023-02-14 19:48:33 +01:00
|
|
|
uint16_t nDefaultPlatformP2PPort;
|
|
|
|
uint16_t nDefaultPlatformHTTPPort;
|
2021-10-15 12:28:19 +02:00
|
|
|
|
|
|
|
void AddLLMQ(Consensus::LLMQType llmqType);
|
2013-05-07 15:16:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2017-05-09 09:29:12 +02:00
|
|
|
* Creates and returns a std::unique_ptr<CChainParams> of the chosen chain.
|
|
|
|
* @returns a CChainParams* of the chosen chain.
|
|
|
|
* @throws a std::runtime_error if the chain is not supported.
|
2013-05-07 15:16:25 +02:00
|
|
|
*/
|
2021-09-03 00:36:11 +02:00
|
|
|
std::unique_ptr<const CChainParams> CreateChainParams(const std::string& chain);
|
2013-05-07 15:16:25 +02:00
|
|
|
|
2015-06-30 21:39:49 +02:00
|
|
|
/**
|
2017-05-09 09:29:12 +02:00
|
|
|
* Return the currently selected parameters. This won't change after app
|
|
|
|
* startup, except for unit tests.
|
2015-06-30 21:39:49 +02:00
|
|
|
*/
|
2017-05-09 09:29:12 +02:00
|
|
|
const CChainParams &Params();
|
2013-05-07 15:16:25 +02:00
|
|
|
|
|
|
|
/**
|
2019-11-02 14:47:34 +01:00
|
|
|
* Sets the params returned by Params() to those for the given chain name.
|
2015-06-30 21:39:49 +02:00
|
|
|
* @throws std::runtime_error when the chain is not supported.
|
2013-05-07 15:16:25 +02:00
|
|
|
*/
|
2015-06-30 21:39:49 +02:00
|
|
|
void SelectParams(const std::string& chain);
|
2013-05-07 15:16:25 +02:00
|
|
|
|
2014-11-03 16:16:40 +01:00
|
|
|
#endif // BITCOIN_CHAINPARAMS_H
|