Bitcoin Core 31.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
server_util.cpp
Go to the documentation of this file.
1// Copyright (c) 2021-present 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>
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
24
25NodeContext& EnsureAnyNodeContext(const std::any& context)
26{
27 auto node_context = util::AnyPtr<NodeContext>(context);
28 if (!node_context) {
29 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node context not found");
30 }
31 return *node_context;
32}
33
35{
36 if (!node.mempool) {
37 throw JSONRPCError(RPC_CLIENT_MEMPOOL_DISABLED, "Mempool disabled or instance not found");
38 }
39 return *node.mempool;
40}
41
42CTxMemPool& EnsureAnyMemPool(const std::any& context)
43{
44 return EnsureMemPool(EnsureAnyNodeContext(context));
45}
46
47
49{
50 if (!node.banman) {
51 throw JSONRPCError(RPC_DATABASE_ERROR, "Error: Ban database not loaded");
52 }
53 return *node.banman;
54}
55
56BanMan& EnsureAnyBanman(const std::any& context)
57{
58 return EnsureBanman(EnsureAnyNodeContext(context));
59}
60
62{
63 if (!node.args) {
64 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node args not found");
65 }
66 return *node.args;
67}
68
69ArgsManager& EnsureAnyArgsman(const std::any& context)
70{
71 return EnsureArgsman(EnsureAnyNodeContext(context));
72}
73
75{
76 if (!node.chainman) {
77 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node chainman not found");
78 }
79 return *node.chainman;
80}
81
82ChainstateManager& EnsureAnyChainman(const std::any& context)
83{
84 return EnsureChainman(EnsureAnyNodeContext(context));
85}
86
88{
89 if (!node.fee_estimator) {
90 throw JSONRPCError(RPC_INTERNAL_ERROR, "Fee estimation disabled");
91 }
92 return *node.fee_estimator;
93}
94
96{
98}
99
101{
102 if (!node.connman) {
103 throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
104 }
105 return *node.connman;
106}
107
109{
110 if (!node.mining) {
111 throw JSONRPCError(RPC_INTERNAL_ERROR, "Node miner not found");
112 }
113 return *node.mining;
114}
115
117{
118 if (!node.peerman) {
119 throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Peer-to-peer functionality missing or disabled");
120 }
121 return *node.peerman;
122}
123
125{
126 if (!node.addrman) {
127 throw JSONRPCError(RPC_CLIENT_P2P_DISABLED, "Error: Address manager functionality missing or disabled");
128 }
129 return *node.addrman;
130}
131
132AddrMan& EnsureAnyAddrman(const std::any& context)
133{
134 return EnsureAddrman(EnsureAnyNodeContext(context));
135}
136
137void NextEmptyBlockIndex(CBlockIndex& tip, const Consensus::Params& consensusParams, CBlockIndex& next_index)
138{
139 CBlockHeader next_header{};
140 next_header.hashPrevBlock = tip.GetBlockHash();
141 UpdateTime(&next_header, consensusParams, &tip);
142 next_header.nBits = GetNextWorkRequired(&tip, &next_header, consensusParams);
143 next_header.nNonce = 0;
144
145 next_index.pprev = &tip;
146 next_index.nTime = next_header.nTime;
147 next_index.nBits = next_header.nBits;
148 next_index.nNonce = next_header.nNonce;
149 next_index.nHeight = tip.nHeight + 1;
150}
Stochastic address manager.
Definition addrman.h:89
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition block.h:27
uint32_t nNonce
Definition block.h:35
uint32_t nBits
Definition block.h:34
uint32_t nTime
Definition block.h:33
uint256 hashPrevBlock
Definition block.h:31
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition chain.h:94
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition chain.h:100
uint32_t nTime
Definition chain.h:142
uint32_t nNonce
Definition chain.h:144
uint256 GetBlockHash() const
Definition chain.h:198
uint32_t nBits
Definition chain.h:143
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition chain.h:106
The BlockPolicyEstimator is used for estimating the feerate needed for a transaction to be included i...
CTxMemPool stores valid-according-to-the-current-best-chain transactions that may be included in the ...
Definition txmempool.h:187
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Definition validation.h:940
int64_t UpdateTime(CBlockHeader *pblock, const Consensus::Params &consensusParams, const CBlockIndex *pindexPrev)
Definition miner.cpp:49
T * AnyPtr(const std::any &any) noexcept
Helper function to access the contained object of a std::any instance.
Definition any.h:18
unsigned int GetNextWorkRequired(const CBlockIndex *pindexLast, const CBlockHeader *pblock, const Consensus::Params &params)
Definition pow.cpp:14
UniValue JSONRPCError(int code, const std::string &message)
Definition request.cpp:70
@ RPC_CLIENT_MEMPOOL_DISABLED
Chain errors.
Definition protocol.h:68
@ RPC_INTERNAL_ERROR
Definition protocol.h:36
@ RPC_DATABASE_ERROR
Database error.
Definition protocol.h:45
@ RPC_CLIENT_P2P_DISABLED
No valid connection manager instance found.
Definition protocol.h:64
ChainstateManager & EnsureAnyChainman(const std::any &context)
BanMan & EnsureBanman(const NodeContext &node)
void NextEmptyBlockIndex(CBlockIndex &tip, const Consensus::Params &consensusParams, CBlockIndex &next_index)
Return an empty block index on top of the tip, with height, time and nBits set.
AddrMan & EnsureAnyAddrman(const std::any &context)
CBlockPolicyEstimator & EnsureFeeEstimator(const NodeContext &node)
int64_t UpdateTime(CBlockHeader *pblock, const Consensus::Params &consensusParams, const CBlockIndex *pindexPrev)
Definition miner.cpp:49
NodeContext & EnsureAnyNodeContext(const std::any &context)
CTxMemPool & EnsureMemPool(const NodeContext &node)
BanMan & EnsureAnyBanman(const std::any &context)
PeerManager & EnsurePeerman(const NodeContext &node)
ChainstateManager & EnsureChainman(const NodeContext &node)
CTxMemPool & EnsureAnyMemPool(const std::any &context)
CBlockPolicyEstimator & EnsureAnyFeeEstimator(const std::any &context)
ArgsManager & EnsureArgsman(const NodeContext &node)
interfaces::Mining & EnsureMining(const NodeContext &node)
AddrMan & EnsureAddrman(const NodeContext &node)
CConnman & EnsureConnman(const NodeContext &node)
ArgsManager & EnsureAnyArgsman(const std::any &context)
Parameters that influence chain consensus.
Definition params.h:84