/root/bitcoin/src/rpc/server_util.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2021-2022 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 <rpc/server_util.h> |
6 | | |
7 | | #include <chain.h> |
8 | | #include <common/args.h> |
9 | | #include <net_processing.h> |
10 | | #include <node/context.h> |
11 | | #include <node/miner.h> |
12 | | #include <policy/fees.h> |
13 | | #include <pow.h> |
14 | | #include <rpc/protocol.h> |
15 | | #include <rpc/request.h> |
16 | | #include <txmempool.h> |
17 | | #include <util/any.h> |
18 | | #include <validation.h> |
19 | | |
20 | | #include <any> |
21 | | |
22 | | using node::NodeContext; |
23 | | using node::UpdateTime; |
24 | | |
25 | | NodeContext& EnsureAnyNodeContext(const std::any& context) |
26 | 0 | { |
27 | 0 | auto node_context = util::AnyPtr<NodeContext>(context); |
28 | 0 | if (!node_context) { |
29 | 0 | throw JSONRPCError(RPC_INTERNAL_ERROR, "Node context not found"); |
30 | 0 | } |
31 | 0 | return *node_context; |
32 | 0 | } |
33 | | |
34 | | CTxMemPool& EnsureMemPool(const NodeContext& node) |
35 | 0 | { |
36 | 0 | if (!node.mempool) { |
37 | 0 | throw JSONRPCError(RPC_CLIENT_MEMPOOL_DISABLED, "Mempool disabled or instance not found"); |
38 | 0 | } |
39 | 0 | return *node.mempool; |
40 | 0 | } |
41 | | |
42 | | CTxMemPool& EnsureAnyMemPool(const std::any& context) |
43 | 0 | { |
44 | 0 | return EnsureMemPool(EnsureAnyNodeContext(context)); |
45 | 0 | } |
46 | | |
47 | | |
48 | | BanMan& EnsureBanman(const NodeContext& node) |
49 | 0 | { |
50 | 0 | if (!node.banman) { |
51 | 0 | throw JSONRPCError(RPC_DATABASE_ERROR, "Error: Ban database not loaded"); |
52 | 0 | } |
53 | 0 | return *node.banman; |
54 | 0 | } |
55 | | |
56 | | BanMan& EnsureAnyBanman(const std::any& context) |
57 | 0 | { |
58 | 0 | return EnsureBanman(EnsureAnyNodeContext(context)); |
59 | 0 | } |
60 | | |
61 | | ArgsManager& EnsureArgsman(const NodeContext& node) |
62 | 0 | { |
63 | 0 | if (!node.args) { |
64 | 0 | throw JSONRPCError(RPC_INTERNAL_ERROR, "Node args not found"); |
65 | 0 | } |
66 | 0 | return *node.args; |
67 | 0 | } |
68 | | |
69 | | ArgsManager& EnsureAnyArgsman(const std::any& context) |
70 | 0 | { |
71 | 0 | return EnsureArgsman(EnsureAnyNodeContext(context)); |
72 | 0 | } |
73 | | |
74 | | ChainstateManager& EnsureChainman(const NodeContext& node) |
75 | 0 | { |
76 | 0 | if (!node.chainman) { |
77 | 0 | throw JSONRPCError(RPC_INTERNAL_ERROR, "Node chainman not found"); |
78 | 0 | } |
79 | 0 | return *node.chainman; |
80 | 0 | } |
81 | | |
82 | | ChainstateManager& EnsureAnyChainman(const std::any& context) |
83 | 0 | { |
84 | 0 | return EnsureChainman(EnsureAnyNodeContext(context)); |
85 | 0 | } |
86 | | |
87 | | CBlockPolicyEstimator& EnsureFeeEstimator(const NodeContext& node) |
88 | 0 | { |
89 | 0 | if (!node.fee_estimator) { |
90 | 0 | throw JSONRPCError(RPC_INTERNAL_ERROR, "Fee estimation disabled"); |
91 | 0 | } |
92 | 0 | return *node.fee_estimator; |
93 | 0 | } |
94 | | |
95 | | CBlockPolicyEstimator& EnsureAnyFeeEstimator(const std::any& context) |
96 | 0 | { |
97 | 0 | return EnsureFeeEstimator(EnsureAnyNodeContext(context)); |
98 | 0 | } |
99 | | |
100 | | CConnman& EnsureConnman(const NodeContext& node) |
101 | 0 | { |
102 | 0 | if (!node.connman) { |
103 | 0 | throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled"); |
104 | 0 | } |
105 | 0 | return *node.connman; |
106 | 0 | } |
107 | | |
108 | | interfaces::Mining& EnsureMining(const NodeContext& node) |
109 | 0 | { |
110 | 0 | if (!node.mining) { |
111 | 0 | throw JSONRPCError(RPC_INTERNAL_ERROR, "Node miner not found"); |
112 | 0 | } |
113 | 0 | return *node.mining; |
114 | 0 | } |
115 | | |
116 | | PeerManager& EnsurePeerman(const NodeContext& node) |
117 | 0 | { |
118 | 0 | if (!node.peerman) { |
119 | 0 | throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled"); |
120 | 0 | } |
121 | 0 | return *node.peerman; |
122 | 0 | } |
123 | | |
124 | | AddrMan& EnsureAddrman(const NodeContext& node) |
125 | 0 | { |
126 | 0 | if (!node.addrman) { |
127 | 0 | throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Address manager functionality missing or disabled"); |
128 | 0 | } |
129 | 0 | return *node.addrman; |
130 | 0 | } |
131 | | |
132 | | AddrMan& EnsureAnyAddrman(const std::any& context) |
133 | 0 | { |
134 | 0 | return EnsureAddrman(EnsureAnyNodeContext(context)); |
135 | 0 | } |
136 | | |
137 | | void NextEmptyBlockIndex(CBlockIndex& tip, const Consensus::Params& consensusParams, CBlockIndex& next_index) |
138 | 0 | { |
139 | 0 | CBlockHeader next_header{}; |
140 | 0 | next_header.hashPrevBlock = tip.GetBlockHash(); |
141 | 0 | UpdateTime(&next_header, consensusParams, &tip); |
142 | 0 | next_header.nBits = GetNextWorkRequired(&tip, &next_header, consensusParams); |
143 | 0 | next_header.nNonce = 0; |
144 | |
|
145 | 0 | next_index.pprev = &tip; |
146 | 0 | next_index.nTime = next_header.nTime; |
147 | 0 | next_index.nBits = next_header.nBits; |
148 | 0 | next_index.nNonce = next_header.nNonce; |
149 | 0 | next_index.nHeight = tip.nHeight + 1; |
150 | 0 | } |