Coverage Report

Created: 2025-02-21 14:37

/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
}