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