mining_args.cpp raw

   1  // Copyright (c) The Bitcoin Core developers
   2  // Distributed under the MIT software license, see the accompanying
   3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
   4  
   5  #include <node/mining_args.h>
   6  
   7  #include <common/args.h>
   8  #include <common/messages.h>
   9  #include <consensus/amount.h>
  10  #include <consensus/consensus.h>
  11  #include <node/mining_types.h>
  12  #include <policy/feerate.h>
  13  #include <policy/policy.h>
  14  #include <tinyformat.h>
  15  #include <util/moneystr.h>
  16  #include <util/result.h>
  17  #include <util/translation.h>
  18  
  19  #include <cstdint>
  20  #include <optional>
  21  #include <string>
  22  #include <utility>
  23  
  24  using common::AmountErrMsg;
  25  using util::Error;
  26  using util::Result;
  27  
  28  namespace node {
  29  
  30  Result<void> CheckMiningOptions(BlockCreateOptions options, bool use_argnames)
  31  {
  32      options = FlattenMiningOptions(std::move(options));
  33      if (*options.block_reserved_weight < MINIMUM_BLOCK_RESERVED_WEIGHT) {
  34          return Error{Untranslated(strprintf("%s (%d) is lower than minimum safety value of (%d)",
  35                                              use_argnames ? "-blockreservedweight" : "block_reserved_weight",
  36                                              *options.block_reserved_weight, MINIMUM_BLOCK_RESERVED_WEIGHT))};
  37      }
  38      if (*options.block_reserved_weight > MAX_BLOCK_WEIGHT) {
  39          return Error{Untranslated(strprintf("%s (%d) exceeds consensus maximum block weight (%d)",
  40                                              use_argnames ? "-blockreservedweight" : "block_reserved_weight",
  41                                              *options.block_reserved_weight, MAX_BLOCK_WEIGHT))};
  42      }
  43      if (*options.block_max_weight > MAX_BLOCK_WEIGHT) {
  44          return Error{Untranslated(strprintf("%s (%d) exceeds consensus maximum block weight (%d)",
  45                                              use_argnames ? "-blockmaxweight" : "block_max_weight",
  46                                              *options.block_max_weight, MAX_BLOCK_WEIGHT))};
  47      }
  48      if (*options.block_reserved_weight > *options.block_max_weight) {
  49          return Error{Untranslated(strprintf("%s (%d) exceeds %s (%d)",
  50                                              use_argnames ? "-blockreservedweight" : "block_reserved_weight",
  51                                              *options.block_reserved_weight,
  52                                              use_argnames ? "-blockmaxweight" : "block_max_weight",
  53                                              *options.block_max_weight))};
  54      }
  55      if (options.coinbase_output_max_additional_sigops > MAX_BLOCK_SIGOPS_COST) {
  56          return Error{Untranslated(strprintf("%s (%zu) exceeds consensus maximum block sigops cost (%d)",
  57                                              "coinbase_output_max_additional_sigops",
  58                                              options.coinbase_output_max_additional_sigops, MAX_BLOCK_SIGOPS_COST))};
  59      }
  60      return {};
  61  }
  62  
  63  Result<BlockCreateOptions> ReadMiningArgs(const ArgsManager& args)
  64  {
  65      BlockCreateOptions options;
  66      if (const auto arg{args.GetArg("-blockmintxfee")}) {
  67          std::optional<CAmount> block_min_tx_fee{ParseMoney(*arg)};
  68          if (!block_min_tx_fee) return Error{AmountErrMsg("blockmintxfee", *arg)};
  69          options.block_min_fee_rate = CFeeRate{*block_min_tx_fee};
  70      }
  71  
  72      if (const auto arg{args.GetBoolArg("-printpriority")}) options.print_modified_fee = *arg;
  73  
  74      options.block_reserved_weight = args.GetArg<uint64_t>("-blockreservedweight");
  75      options.block_max_weight = args.GetArg<uint64_t>("-blockmaxweight");
  76  
  77      if (auto result{CheckMiningOptions(options, /*use_argnames=*/true)}; !result) return Error{util::ErrorString(result)};
  78      return options;
  79  }
  80  
  81  BlockCreateOptions FlattenMiningOptions(BlockCreateOptions options)
  82  {
  83      if (!options.block_min_fee_rate) options.block_min_fee_rate = CFeeRate{DEFAULT_BLOCK_MIN_TX_FEE};
  84      if (!options.print_modified_fee) options.print_modified_fee = DEFAULT_PRINT_MODIFIED_FEE;
  85      if (!options.block_reserved_weight) options.block_reserved_weight = DEFAULT_BLOCK_RESERVED_WEIGHT;
  86      if (!options.block_max_weight) options.block_max_weight = DEFAULT_BLOCK_MAX_WEIGHT;
  87      return options;
  88  }
  89  
  90  BlockCreateOptions MergeMiningOptions(BlockCreateOptions x, const BlockCreateOptions& y)
  91  {
  92      if (!x.block_min_fee_rate) x.block_min_fee_rate = y.block_min_fee_rate;
  93      if (!x.print_modified_fee) x.print_modified_fee = y.print_modified_fee;
  94      if (!x.block_reserved_weight) x.block_reserved_weight = y.block_reserved_weight;
  95      if (!x.block_max_weight) x.block_max_weight = y.block_max_weight;
  96      return x;
  97  }
  98  
  99  } // namespace node
 100