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