Branch data Line data Source code
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 : 8979 : Result<void> CheckMiningOptions(BlockCreateOptions options, bool use_argnames)
31 : : {
32 [ + - ]: 8979 : options = FlattenMiningOptions(std::move(options));
33 [ - + ]: 8979 : if (*options.block_reserved_weight < MINIMUM_BLOCK_RESERVED_WEIGHT) {
34 [ # # ]: 0 : return Error{Untranslated(strprintf("%s (%d) is lower than minimum safety value of (%d)",
35 [ # # ]: 0 : use_argnames ? "-blockreservedweight" : "block_reserved_weight",
36 [ # # ]: 0 : *options.block_reserved_weight, MINIMUM_BLOCK_RESERVED_WEIGHT))};
37 : : }
38 [ - + ]: 8979 : if (*options.block_reserved_weight > MAX_BLOCK_WEIGHT) {
39 [ # # ]: 0 : return Error{Untranslated(strprintf("%s (%d) exceeds consensus maximum block weight (%d)",
40 [ # # ]: 0 : use_argnames ? "-blockreservedweight" : "block_reserved_weight",
41 [ # # ]: 0 : *options.block_reserved_weight, MAX_BLOCK_WEIGHT))};
42 : : }
43 [ - + ]: 8979 : if (*options.block_max_weight > MAX_BLOCK_WEIGHT) {
44 [ # # ]: 0 : return Error{Untranslated(strprintf("%s (%d) exceeds consensus maximum block weight (%d)",
45 [ # # ]: 0 : use_argnames ? "-blockmaxweight" : "block_max_weight",
46 [ # # ]: 0 : *options.block_max_weight, MAX_BLOCK_WEIGHT))};
47 : : }
48 [ + + ]: 8979 : if (*options.block_reserved_weight > *options.block_max_weight) {
49 [ + - ]: 2 : return Error{Untranslated(strprintf("%s (%d) exceeds %s (%d)",
50 : 1 : use_argnames ? "-blockreservedweight" : "block_reserved_weight",
51 : 1 : *options.block_reserved_weight,
52 [ - + ]: 1 : use_argnames ? "-blockmaxweight" : "block_max_weight",
53 [ - + ]: 2 : *options.block_max_weight))};
54 : : }
55 [ - + ]: 8978 : if (options.coinbase_output_max_additional_sigops > MAX_BLOCK_SIGOPS_COST) {
56 [ # # ]: 0 : return Error{Untranslated(strprintf("%s (%zu) exceeds consensus maximum block sigops cost (%d)",
57 : : "coinbase_output_max_additional_sigops",
58 : 0 : options.coinbase_output_max_additional_sigops, MAX_BLOCK_SIGOPS_COST))};
59 : : }
60 : 8978 : return {};
61 : : }
62 : :
63 : 834 : Result<BlockCreateOptions> ReadMiningArgs(const ArgsManager& args)
64 : : {
65 : 834 : BlockCreateOptions options;
66 [ + - + - : 1668 : if (const auto arg{args.GetArg("-blockmintxfee")}) {
- + ]
67 [ # # ]: 0 : std::optional<CAmount> block_min_tx_fee{ParseMoney(*arg)};
68 [ # # # # : 0 : if (!block_min_tx_fee) return Error{AmountErrMsg("blockmintxfee", *arg)};
# # ]
69 [ - - ]: 834 : options.block_min_fee_rate = CFeeRate{*block_min_tx_fee};
70 : 0 : }
71 : :
72 [ + - + - : 1668 : if (const auto arg{args.GetBoolArg("-printpriority")}) options.print_modified_fee = *arg;
- + ]
73 : :
74 [ + - + - ]: 834 : options.block_reserved_weight = args.GetArg<uint64_t>("-blockreservedweight");
75 [ + - + - ]: 834 : options.block_max_weight = args.GetArg<uint64_t>("-blockmaxweight");
76 : :
77 [ + - - + : 1668 : if (auto result{CheckMiningOptions(options, /*use_argnames=*/true)}; !result) return Error{util::ErrorString(result)};
- - ]
78 : 834 : return options;
79 : 834 : }
80 : :
81 : 17123 : BlockCreateOptions FlattenMiningOptions(BlockCreateOptions options)
82 : : {
83 [ + - ]: 17123 : if (!options.block_min_fee_rate) options.block_min_fee_rate = CFeeRate{DEFAULT_BLOCK_MIN_TX_FEE};
84 [ + - ]: 17123 : if (!options.print_modified_fee) options.print_modified_fee = DEFAULT_PRINT_MODIFIED_FEE;
85 [ + - ]: 17123 : if (!options.block_reserved_weight) options.block_reserved_weight = DEFAULT_BLOCK_RESERVED_WEIGHT;
86 [ + + ]: 17123 : if (!options.block_max_weight) options.block_max_weight = DEFAULT_BLOCK_MAX_WEIGHT;
87 : 17123 : return options;
88 : : }
89 : :
90 : 8082 : BlockCreateOptions MergeMiningOptions(BlockCreateOptions x, const BlockCreateOptions& y)
91 : : {
92 [ + - ]: 8082 : if (!x.block_min_fee_rate) x.block_min_fee_rate = y.block_min_fee_rate;
93 [ + - ]: 8082 : if (!x.print_modified_fee) x.print_modified_fee = y.print_modified_fee;
94 [ + - ]: 8082 : if (!x.block_reserved_weight) x.block_reserved_weight = y.block_reserved_weight;
95 [ + + ]: 8082 : if (!x.block_max_weight) x.block_max_weight = y.block_max_weight;
96 : 8082 : return x;
97 : : }
98 : :
99 : : } // namespace node
|