/root/bitcoin/src/chainparams.cpp
| Line | Count | Source | 
| 1 |  | // Copyright (c) 2010 Satoshi Nakamoto | 
| 2 |  | // Copyright (c) 2009-2022 The Bitcoin Core developers | 
| 3 |  | // Distributed under the MIT software license, see the accompanying | 
| 4 |  | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | 
| 5 |  |  | 
| 6 |  | #include <chainparams.h> | 
| 7 |  |  | 
| 8 |  | #include <chainparamsbase.h> | 
| 9 |  | #include <common/args.h> | 
| 10 |  | #include <consensus/params.h> | 
| 11 |  | #include <deploymentinfo.h> | 
| 12 |  | #include <logging.h> | 
| 13 |  | #include <tinyformat.h> | 
| 14 |  | #include <util/chaintype.h> | 
| 15 |  | #include <util/strencodings.h> | 
| 16 |  | #include <util/string.h> | 
| 17 |  |  | 
| 18 |  | #include <cassert> | 
| 19 |  | #include <cstdint> | 
| 20 |  | #include <limits> | 
| 21 |  | #include <stdexcept> | 
| 22 |  | #include <vector> | 
| 23 |  |  | 
| 24 |  | using util::SplitString; | 
| 25 |  |  | 
| 26 |  | void ReadSigNetArgs(const ArgsManager& args, CChainParams::SigNetOptions& options) | 
| 27 | 0 | { | 
| 28 | 0 |     if (!args.GetArgs("-signetseednode").empty()) { | 
| 29 | 0 |         options.seeds.emplace(args.GetArgs("-signetseednode")); | 
| 30 | 0 |     } | 
| 31 | 0 |     if (!args.GetArgs("-signetchallenge").empty()) { | 
| 32 | 0 |         const auto signet_challenge = args.GetArgs("-signetchallenge"); | 
| 33 | 0 |         if (signet_challenge.size() != 1) { | 
| 34 | 0 |             throw std::runtime_error("-signetchallenge cannot be multiple values."); | 
| 35 | 0 |         } | 
| 36 | 0 |         const auto val{TryParseHex<uint8_t>(signet_challenge[0])}; | 
| 37 | 0 |         if (!val) { | 
| 38 | 0 |             throw std::runtime_error(strprintf("-signetchallenge must be hex, not '%s'.", signet_challenge[0])); | 
| 39 | 0 |         } | 
| 40 | 0 |         options.challenge.emplace(*val); | 
| 41 | 0 |     } | 
| 42 | 0 | } | 
| 43 |  |  | 
| 44 |  | void ReadRegTestArgs(const ArgsManager& args, CChainParams::RegTestOptions& options) | 
| 45 | 0 | { | 
| 46 | 0 |     if (auto value = args.GetBoolArg("-fastprune")) options.fastprune = *value; | 
| 47 | 0 |     if (HasTestOption(args, "bip94")) options.enforce_bip94 = true; | 
| 48 |  | 
 | 
| 49 | 0 |     for (const std::string& arg : args.GetArgs("-testactivationheight")) { | 
| 50 | 0 |         const auto found{arg.find('@')}; | 
| 51 | 0 |         if (found == std::string::npos) { | 
| 52 | 0 |             throw std::runtime_error(strprintf("Invalid format (%s) for -testactivationheight=name@height.", arg)); | 
| 53 | 0 |         } | 
| 54 |  |  | 
| 55 | 0 |         const auto value{arg.substr(found + 1)}; | 
| 56 | 0 |         const auto height{ToIntegral<int32_t>(value)}; | 
| 57 | 0 |         if (!height || *height < 0 || *height >= std::numeric_limits<int>::max()) { | 
| 58 | 0 |             throw std::runtime_error(strprintf("Invalid height value (%s) for -testactivationheight=name@height.", arg)); | 
| 59 | 0 |         } | 
| 60 |  |  | 
| 61 | 0 |         const auto deployment_name{arg.substr(0, found)}; | 
| 62 | 0 |         if (const auto buried_deployment = GetBuriedDeployment(deployment_name)) { | 
| 63 | 0 |             options.activation_heights[*buried_deployment] = *height; | 
| 64 | 0 |         } else { | 
| 65 | 0 |             throw std::runtime_error(strprintf("Invalid name (%s) for -testactivationheight=name@height.", arg)); | 
| 66 | 0 |         } | 
| 67 | 0 |     } | 
| 68 |  |  | 
| 69 | 0 |     for (const std::string& strDeployment : args.GetArgs("-vbparams")) { | 
| 70 | 0 |         std::vector<std::string> vDeploymentParams = SplitString(strDeployment, ':'); | 
| 71 | 0 |         if (vDeploymentParams.size() < 3 || 4 < vDeploymentParams.size()) { | 
| 72 | 0 |             throw std::runtime_error("Version bits parameters malformed, expecting deployment:start:end[:min_activation_height]"); | 
| 73 | 0 |         } | 
| 74 | 0 |         CChainParams::VersionBitsParameters vbparams{}; | 
| 75 | 0 |         const auto start_time{ToIntegral<int64_t>(vDeploymentParams[1])}; | 
| 76 | 0 |         if (!start_time) { | 
| 77 | 0 |             throw std::runtime_error(strprintf("Invalid nStartTime (%s)", vDeploymentParams[1])); | 
| 78 | 0 |         } | 
| 79 | 0 |         vbparams.start_time = *start_time; | 
| 80 | 0 |         const auto timeout{ToIntegral<int64_t>(vDeploymentParams[2])}; | 
| 81 | 0 |         if (!timeout) { | 
| 82 | 0 |             throw std::runtime_error(strprintf("Invalid nTimeout (%s)", vDeploymentParams[2])); | 
| 83 | 0 |         } | 
| 84 | 0 |         vbparams.timeout = *timeout; | 
| 85 | 0 |         if (vDeploymentParams.size() >= 4) { | 
| 86 | 0 |             const auto min_activation_height{ToIntegral<int64_t>(vDeploymentParams[3])}; | 
| 87 | 0 |             if (!min_activation_height) { | 
| 88 | 0 |                 throw std::runtime_error(strprintf("Invalid min_activation_height (%s)", vDeploymentParams[3])); | 
| 89 | 0 |             } | 
| 90 | 0 |             vbparams.min_activation_height = *min_activation_height; | 
| 91 | 0 |         } else { | 
| 92 | 0 |             vbparams.min_activation_height = 0; | 
| 93 | 0 |         } | 
| 94 | 0 |         bool found = false; | 
| 95 | 0 |         for (int j=0; j < (int)Consensus::MAX_VERSION_BITS_DEPLOYMENTS; ++j) { | 
| 96 | 0 |             if (vDeploymentParams[0] == VersionBitsDeploymentInfo[j].name) { | 
| 97 | 0 |                 options.version_bits_parameters[Consensus::DeploymentPos(j)] = vbparams; | 
| 98 | 0 |                 found = true; | 
| 99 | 0 |                 LogInfo("Setting version bits activation parameters for %s to start=%ld, timeout=%ld, min_activation_height=%d", | 
| 100 | 0 |                         vDeploymentParams[0], vbparams.start_time, vbparams.timeout, vbparams.min_activation_height); | 
| 101 | 0 |                 break; | 
| 102 | 0 |             } | 
| 103 | 0 |         } | 
| 104 | 0 |         if (!found) { | 
| 105 | 0 |             throw std::runtime_error(strprintf("Invalid deployment (%s)", vDeploymentParams[0])); | 
| 106 | 0 |         } | 
| 107 | 0 |     } | 
| 108 | 0 | } | 
| 109 |  |  | 
| 110 |  | static std::unique_ptr<const CChainParams> globalChainParams; | 
| 111 |  |  | 
| 112 | 618 | const CChainParams &Params() { | 
| 113 | 618 |     assert(globalChainParams); | 
| 114 | 618 |     return *globalChainParams; | 
| 115 | 618 | } | 
| 116 |  |  | 
| 117 |  | std::unique_ptr<const CChainParams> CreateChainParams(const ArgsManager& args, const ChainType chain) | 
| 118 | 0 | { | 
| 119 | 0 |     switch (chain) { | 
| 120 | 0 |     case ChainType::MAIN: | 
| 121 | 0 |         return CChainParams::Main(); | 
| 122 | 0 |     case ChainType::TESTNET: | 
| 123 | 0 |         return CChainParams::TestNet(); | 
| 124 | 0 |     case ChainType::TESTNET4: | 
| 125 | 0 |         return CChainParams::TestNet4(); | 
| 126 | 0 |     case ChainType::SIGNET: { | 
| 127 | 0 |         auto opts = CChainParams::SigNetOptions{}; | 
| 128 | 0 |         ReadSigNetArgs(args, opts); | 
| 129 | 0 |         return CChainParams::SigNet(opts); | 
| 130 | 0 |     } | 
| 131 | 0 |     case ChainType::REGTEST: { | 
| 132 | 0 |         auto opts = CChainParams::RegTestOptions{}; | 
| 133 | 0 |         ReadRegTestArgs(args, opts); | 
| 134 | 0 |         return CChainParams::RegTest(opts); | 
| 135 | 0 |     } | 
| 136 | 0 |     } | 
| 137 | 0 |     assert(false); | 
| 138 | 0 | } | 
| 139 |  |  | 
| 140 |  | void SelectParams(const ChainType chain) | 
| 141 | 0 | { | 
| 142 | 0 |     SelectBaseParams(chain); | 
| 143 | 0 |     globalChainParams = CreateChainParams(gArgs, chain); | 
| 144 | 0 | } |