aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/chainparams.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/chainparams.h')
-rw-r--r--src/kernel/chainparams.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/kernel/chainparams.h b/src/kernel/chainparams.h
new file mode 100644
index 0000000000..32fe618dbd
--- /dev/null
+++ b/src/kernel/chainparams.h
@@ -0,0 +1,187 @@
+// Copyright (c) 2009-2010 Satoshi Nakamoto
+// Copyright (c) 2009-2021 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_KERNEL_CHAINPARAMS_H
+#define BITCOIN_KERNEL_CHAINPARAMS_H
+
+#include <consensus/params.h>
+#include <netaddress.h>
+#include <primitives/block.h>
+#include <protocol.h>
+#include <uint256.h>
+#include <util/hash_type.h>
+
+#include <cstdint>
+#include <iterator>
+#include <map>
+#include <memory>
+#include <optional>
+#include <string>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+
+typedef std::map<int, uint256> MapCheckpoints;
+
+struct CCheckpointData {
+ MapCheckpoints mapCheckpoints;
+
+ int GetHeight() const {
+ const auto& final_checkpoint = mapCheckpoints.rbegin();
+ return final_checkpoint->first /* height */;
+ }
+};
+
+struct AssumeutxoHash : public BaseHash<uint256> {
+ explicit AssumeutxoHash(const uint256& hash) : BaseHash(hash) {}
+};
+
+/**
+ * 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.
+ const AssumeutxoHash hash_serialized;
+
+ //! 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>;
+
+/**
+ * Holds various statistics on transactions within a chain. Used to estimate
+ * verification progress during chain sync.
+ *
+ * See also: CChainParams::TxData, GuessVerificationProgress.
+ */
+struct ChainTxData {
+ int64_t nTime; //!< UNIX timestamp of last known number of transactions
+ int64_t nTxCount; //!< total number of transactions between genesis and that timestamp
+ double dTxRate; //!< estimated number of transactions per second after that timestamp
+};
+
+/**
+ * CChainParams defines various tweakable parameters of a given instance of the
+ * Bitcoin system.
+ */
+class CChainParams
+{
+public:
+ enum Base58Type {
+ PUBKEY_ADDRESS,
+ SCRIPT_ADDRESS,
+ SECRET_KEY,
+ EXT_PUBLIC_KEY,
+ EXT_SECRET_KEY,
+
+ MAX_BASE58_TYPES
+ };
+
+ const Consensus::Params& GetConsensus() const { return consensus; }
+ const CMessageHeader::MessageStartChars& MessageStart() const { return pchMessageStart; }
+ uint16_t GetDefaultPort() const { return nDefaultPort; }
+ 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();
+ }
+
+ const CBlock& GenesisBlock() const { return genesis; }
+ /** Default value for -checkmempool and -checkblockindex argument */
+ bool DefaultConsistencyChecks() const { return fDefaultConsistencyChecks; }
+ /** Policy: Filter transactions that do not match well-defined patterns */
+ bool RequireStandard() const { return fRequireStandard; }
+ /** If this chain is exclusively used for testing */
+ bool IsTestChain() const { return m_is_test_chain; }
+ /** If this chain allows time to be mocked */
+ bool IsMockableChain() const { return m_is_mockable_chain; }
+ uint64_t PruneAfterHeight() const { return nPruneAfterHeight; }
+ /** 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; }
+ /** Whether it is possible to mine blocks on demand (no retargeting) */
+ bool MineBlocksOnDemand() const { return consensus.fPowNoRetargeting; }
+ /** Return the network string */
+ std::string NetworkIDString() const { return strNetworkID; }
+ /** Return the list of hostnames to look up for DNS seeds */
+ const std::vector<std::string>& DNSSeeds() const { return vSeeds; }
+ const std::vector<unsigned char>& Base58Prefix(Base58Type type) const { return base58Prefixes[type]; }
+ const std::string& Bech32HRP() const { return bech32_hrp; }
+ const std::vector<uint8_t>& FixedSeeds() const { return vFixedSeeds; }
+ const CCheckpointData& Checkpoints() const { return checkpointData; }
+
+ //! Get allowed assumeutxo configuration.
+ //! @see ChainstateManager
+ const MapAssumeutxo& Assumeutxo() const { return m_assumeutxo_data; }
+
+ const ChainTxData& TxData() const { return chainTxData; }
+
+ /**
+ * SigNetOptions holds configurations for creating a signet CChainParams.
+ */
+ struct SigNetOptions {
+ std::optional<std::vector<uint8_t>> challenge{};
+ std::optional<std::vector<std::string>> seeds{};
+ };
+
+ /**
+ * VersionBitsParameters holds activation parameters
+ */
+ struct VersionBitsParameters {
+ int64_t start_time;
+ int64_t timeout;
+ int min_activation_height;
+ };
+
+ /**
+ * RegTestOptions holds configurations for creating a regtest CChainParams.
+ */
+ struct RegTestOptions {
+ std::unordered_map<Consensus::DeploymentPos, VersionBitsParameters> version_bits_parameters{};
+ std::unordered_map<Consensus::BuriedDeployment, int> activation_heights{};
+ bool fastprune{false};
+ };
+
+ static std::unique_ptr<const CChainParams> RegTest(const RegTestOptions& options);
+ static std::unique_ptr<const CChainParams> SigNet(const SigNetOptions& options);
+ static std::unique_ptr<const CChainParams> Main();
+ static std::unique_ptr<const CChainParams> TestNet();
+
+protected:
+ CChainParams() {}
+
+ Consensus::Params consensus;
+ CMessageHeader::MessageStartChars pchMessageStart;
+ uint16_t nDefaultPort;
+ uint64_t nPruneAfterHeight;
+ uint64_t m_assumed_blockchain_size;
+ uint64_t m_assumed_chain_state_size;
+ std::vector<std::string> vSeeds;
+ std::vector<unsigned char> base58Prefixes[MAX_BASE58_TYPES];
+ std::string bech32_hrp;
+ std::string strNetworkID;
+ CBlock genesis;
+ std::vector<uint8_t> vFixedSeeds;
+ bool fDefaultConsistencyChecks;
+ bool fRequireStandard;
+ bool m_is_test_chain;
+ bool m_is_mockable_chain;
+ CCheckpointData checkpointData;
+ MapAssumeutxo m_assumeutxo_data;
+ ChainTxData chainTxData;
+};
+
+#endif // BITCOIN_KERNEL_CHAINPARAMS_H