chainstatemanager_args.cpp raw

   1  // Copyright (c) 2022 The Limenka 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/chainstatemanager_args.h>
   6  
   7  #include <arith_uint256.h>
   8  #include <common/args.h>
   9  #include <common/system.h>
  10  #include <logging.h>
  11  #include <node/coins_view_args.h>
  12  #include <node/database_args.h>
  13  #include <tinyformat.h>
  14  #include <uint256.h>
  15  #include <util/result.h>
  16  #include <util/strencodings.h>
  17  #include <util/translation.h>
  18  #include <validation.h>
  19  
  20  #include <algorithm>
  21  #include <chrono>
  22  #include <string>
  23  
  24  namespace node {
  25  util::Result<void> ApplyArgsManOptions(const ArgsManager& args, ChainstateManager::Options& opts)
  26  {
  27      if (auto value{args.GetIntArg("-checkblockindex")}) {
  28          // Interpret bare -checkblockindex argument as 1 instead of 0.
  29          opts.check_block_index = args.GetArg("-checkblockindex")->empty() ? 1 : *value;
  30      }
  31  
  32      if (auto value{args.GetBoolArg("-checkpoints")}) opts.checkpoints_enabled = *value;
  33  
  34      if (auto value{args.GetArg("-minimumchainwork")}) {
  35          if (auto min_work{uint256::FromUserHex(*value)}) {
  36              opts.minimum_chain_work = UintToArith256(*min_work);
  37          } else {
  38              return util::Error{Untranslated(strprintf("Invalid minimum work specified (%s), must be up to %d hex digits", *value, uint256::size() * 2))};
  39          }
  40      }
  41  
  42      if (auto value{args.GetArg("-assumevalid")}) {
  43          if (auto block_hash{uint256::FromUserHex(*value)}) {
  44              opts.assumed_valid_block = *block_hash;
  45          } else {
  46              return util::Error{Untranslated(strprintf("Invalid assumevalid block hash specified (%s), must be up to %d hex digits (or 0 to disable)", *value, uint256::size() * 2))};
  47          }
  48      }
  49  
  50      if (auto value{args.GetIntArg("-maxtipage")}) opts.max_tip_age = std::chrono::seconds{*value};
  51  
  52      ReadDatabaseArgs(args, opts.coins_db);
  53      ReadCoinsViewArgs(args, opts.coins_view);
  54  
  55      int script_threads = args.GetIntArg("-par", DEFAULT_SCRIPTCHECK_THREADS);
  56      if (script_threads <= 0) {
  57          // -par=0 means autodetect (number of cores - 1 script threads)
  58          // -par=-n means "leave n cores free" (number of cores - n - 1 script threads)
  59          script_threads += GetNumCores();
  60      }
  61      // Subtract 1 because the main thread counts towards the par threads.
  62      opts.worker_threads_num = script_threads - 1;
  63  
  64      if (auto max_size = args.GetIntArg("-maxsigcachesize")) {
  65          // 1. When supplied with a max_size of 0, both the signature cache and
  66          //    script execution cache create the minimum possible cache (2
  67          //    elements). Therefore, we can use 0 as a floor here.
  68          // 2. Multiply first, divide after to avoid integer truncation.
  69          size_t clamped_size_each = std::max<int64_t>(*max_size, 0) * (1 << 20) / 2;
  70          opts.script_execution_cache_bytes = clamped_size_each;
  71          opts.signature_cache_bytes = clamped_size_each;
  72      }
  73  
  74      return {};
  75  }
  76  } // namespace node
  77