Line data Source code
1 : // Copyright (c) 2018-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 : #ifndef BITCOIN_INTERFACES_NODE_H
6 : #define BITCOIN_INTERFACES_NODE_H
7 :
8 : #include <common/settings.h>
9 : #include <consensus/amount.h> // For CAmount
10 : #include <logging.h> // For BCLog::CategoryMask
11 : #include <net.h> // For NodeId
12 : #include <net_types.h> // For banmap_t
13 : #include <netaddress.h> // For Network
14 : #include <netbase.h> // For ConnectionDirection
15 : #include <support/allocators/secure.h> // For SecureString
16 : #include <util/translation.h>
17 :
18 : #include <functional>
19 : #include <memory>
20 : #include <stddef.h>
21 : #include <stdint.h>
22 : #include <string>
23 : #include <tuple>
24 : #include <vector>
25 :
26 : class BanMan;
27 : class CFeeRate;
28 : class CNodeStats;
29 : class Coin;
30 : class RPCTimerInterface;
31 : class UniValue;
32 : class Proxy;
33 : enum class SynchronizationState;
34 : struct CNodeStateStats;
35 : struct bilingual_str;
36 : namespace node {
37 : enum class TransactionError;
38 : struct NodeContext;
39 : } // namespace node
40 : namespace wallet {
41 : class CCoinControl;
42 : } // namespace wallet
43 :
44 : namespace interfaces {
45 : class Handler;
46 : class WalletLoader;
47 : struct BlockTip;
48 :
49 : //! Block and header tip information
50 : struct BlockAndHeaderTipInfo
51 : {
52 : int block_height;
53 : int64_t block_time;
54 : int header_height;
55 : int64_t header_time;
56 : double verification_progress;
57 : };
58 :
59 : //! External signer interface used by the GUI.
60 0 : class ExternalSigner
61 : {
62 : public:
63 : virtual ~ExternalSigner() = default;
64 :
65 : //! Get signer display name
66 : virtual std::string getName() = 0;
67 : };
68 :
69 : //! Top-level interface for a bitcoin node (bitcoind process).
70 0 : class Node
71 : {
72 : public:
73 : virtual ~Node() = default;
74 :
75 : //! Init logging.
76 : virtual void initLogging() = 0;
77 :
78 : //! Init parameter interaction.
79 : virtual void initParameterInteraction() = 0;
80 :
81 : //! Get warnings.
82 : virtual bilingual_str getWarnings() = 0;
83 :
84 : //! Get exit status.
85 : virtual int getExitStatus() = 0;
86 :
87 : // Get log flags.
88 : virtual BCLog::CategoryMask getLogCategories() = 0;
89 :
90 : //! Initialize app dependencies.
91 : virtual bool baseInitialize() = 0;
92 :
93 : //! Start node.
94 : virtual bool appInitMain(interfaces::BlockAndHeaderTipInfo* tip_info = nullptr) = 0;
95 :
96 : //! Stop node.
97 : virtual void appShutdown() = 0;
98 :
99 : //! Start shutdown.
100 : virtual void startShutdown() = 0;
101 :
102 : //! Return whether shutdown was requested.
103 : virtual bool shutdownRequested() = 0;
104 :
105 : //! Return whether a particular setting in <datadir>/settings.json is or
106 : //! would be ignored because it is also specified in the command line.
107 : virtual bool isSettingIgnored(const std::string& name) = 0;
108 :
109 : //! Return setting value from <datadir>/settings.json or bitcoin.conf.
110 : virtual common::SettingsValue getPersistentSetting(const std::string& name) = 0;
111 :
112 : //! Update a setting in <datadir>/settings.json.
113 : virtual void updateRwSetting(const std::string& name, const common::SettingsValue& value) = 0;
114 :
115 : //! Force a setting value to be applied, overriding any other configuration
116 : //! source, but not being persisted.
117 : virtual void forceSetting(const std::string& name, const common::SettingsValue& value) = 0;
118 :
119 : //! Clear all settings in <datadir>/settings.json and store a backup of
120 : //! previous settings in <datadir>/settings.json.bak.
121 : virtual void resetSettings() = 0;
122 :
123 : //! Map port.
124 : virtual void mapPort(bool use_pcp) = 0;
125 :
126 : //! Get proxy.
127 : virtual bool getProxy(Network net, Proxy& proxy_info) = 0;
128 :
129 : //! Get number of connections.
130 : virtual size_t getNodeCount(ConnectionDirection flags) = 0;
131 :
132 : //! Get stats for connected nodes.
133 : using NodesStats = std::vector<std::tuple<CNodeStats, bool, CNodeStateStats>>;
134 : virtual bool getNodesStats(NodesStats& stats) = 0;
135 :
136 : //! Get ban map entries.
137 : virtual bool getBanned(banmap_t& banmap) = 0;
138 :
139 : //! Ban node.
140 : virtual bool ban(const CNetAddr& net_addr, int64_t ban_time_offset) = 0;
141 :
142 : //! Unban node.
143 : virtual bool unban(const CSubNet& ip) = 0;
144 :
145 : //! Disconnect node by address.
146 : virtual bool disconnectByAddress(const CNetAddr& net_addr) = 0;
147 :
148 : //! Disconnect node by id.
149 : virtual bool disconnectById(NodeId id) = 0;
150 :
151 : //! Return list of external signers (attached devices which can sign transactions).
152 : virtual std::vector<std::unique_ptr<ExternalSigner>> listExternalSigners() = 0;
153 :
154 : //! Get total bytes recv.
155 : virtual int64_t getTotalBytesRecv() = 0;
156 :
157 : //! Get total bytes sent.
158 : virtual int64_t getTotalBytesSent() = 0;
159 :
160 : //! Get mempool size.
161 : virtual size_t getMempoolSize() = 0;
162 :
163 : //! Get mempool dynamic usage.
164 : virtual size_t getMempoolDynamicUsage() = 0;
165 :
166 : //! Get mempool maximum memory usage.
167 : virtual size_t getMempoolMaxUsage() = 0;
168 :
169 : //! Get header tip height and time.
170 : virtual bool getHeaderTip(int& height, int64_t& block_time) = 0;
171 :
172 : //! Get num blocks.
173 : virtual int getNumBlocks() = 0;
174 :
175 : //! Get network local addresses.
176 : virtual std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() = 0;
177 :
178 : //! Get best block hash.
179 : virtual uint256 getBestBlockHash() = 0;
180 :
181 : //! Get last block time.
182 : virtual int64_t getLastBlockTime() = 0;
183 :
184 : //! Get verification progress.
185 : virtual double getVerificationProgress() = 0;
186 :
187 : //! Is initial block download.
188 : virtual bool isInitialBlockDownload() = 0;
189 :
190 : //! Is loading blocks.
191 : virtual bool isLoadingBlocks() = 0;
192 :
193 : //! Set network active.
194 : virtual void setNetworkActive(bool active) = 0;
195 :
196 : //! Get network active.
197 : virtual bool getNetworkActive() = 0;
198 :
199 : //! Get dust relay fee.
200 : virtual CFeeRate getDustRelayFee() = 0;
201 :
202 : //! Execute rpc command.
203 : virtual UniValue executeRpc(const std::string& command, const UniValue& params, const std::string& uri) = 0;
204 :
205 : //! List rpc commands.
206 : virtual std::vector<std::string> listRpcCommands() = 0;
207 :
208 : //! Set RPC timer interface if unset.
209 : virtual void rpcSetTimerInterfaceIfUnset(RPCTimerInterface* iface) = 0;
210 :
211 : //! Unset RPC timer interface.
212 : virtual void rpcUnsetTimerInterface(RPCTimerInterface* iface) = 0;
213 :
214 : //! Get unspent output associated with a transaction.
215 : virtual std::optional<Coin> getUnspentOutput(const COutPoint& output) = 0;
216 :
217 : //! Broadcast transaction.
218 : virtual node::TransactionError broadcastTransaction(CTransactionRef tx, CAmount max_tx_fee, std::string& err_string) = 0;
219 :
220 : //! Get wallet loader.
221 : virtual WalletLoader& walletLoader() = 0;
222 :
223 : //! Register handler for init messages.
224 : using InitMessageFn = std::function<void(const std::string& message)>;
225 : virtual std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) = 0;
226 :
227 : //! Register handler for message box messages.
228 : using MessageBoxFn =
229 : std::function<bool(const bilingual_str& message, const std::string& caption, unsigned int style)>;
230 : virtual std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn) = 0;
231 :
232 : //! Register handler for question messages.
233 : using QuestionFn = std::function<bool(const bilingual_str& message,
234 : const std::string& non_interactive_message,
235 : const std::string& caption,
236 : unsigned int style)>;
237 : virtual std::unique_ptr<Handler> handleQuestion(QuestionFn fn) = 0;
238 :
239 : //! Register handler for progress messages.
240 : using ShowProgressFn = std::function<void(const std::string& title, int progress, bool resume_possible)>;
241 : virtual std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) = 0;
242 :
243 : //! Register handler for wallet loader constructed messages.
244 : using InitWalletFn = std::function<void()>;
245 : virtual std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn) = 0;
246 :
247 : //! Register handler for number of connections changed messages.
248 : using NotifyNumConnectionsChangedFn = std::function<void(int new_num_connections)>;
249 : virtual std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) = 0;
250 :
251 : //! Register handler for network active messages.
252 : using NotifyNetworkActiveChangedFn = std::function<void(bool network_active)>;
253 : virtual std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn) = 0;
254 :
255 : //! Register handler for notify alert messages.
256 : using NotifyAlertChangedFn = std::function<void()>;
257 : virtual std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn) = 0;
258 :
259 : //! Register handler for ban list messages.
260 : using BannedListChangedFn = std::function<void()>;
261 : virtual std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn) = 0;
262 :
263 : //! Register handler for block tip messages.
264 : using NotifyBlockTipFn =
265 : std::function<void(SynchronizationState, interfaces::BlockTip tip, double verification_progress)>;
266 : virtual std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) = 0;
267 :
268 : //! Register handler for header tip messages.
269 : using NotifyHeaderTipFn =
270 : std::function<void(SynchronizationState, interfaces::BlockTip tip, bool presync)>;
271 : virtual std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) = 0;
272 :
273 : //! Get and set internal node context. Useful for testing, but not
274 : //! accessible across processes.
275 0 : virtual node::NodeContext* context() { return nullptr; }
276 0 : virtual void setContext(node::NodeContext* context) { }
277 : };
278 :
279 : //! Return implementation of Node interface.
280 : std::unique_ptr<Node> MakeNode(node::NodeContext& context);
281 :
282 : //! Block tip (could be a header or not, depends on the subscribed signal).
283 : struct BlockTip {
284 : int block_height;
285 : int64_t block_time;
286 : uint256 block_hash;
287 : };
288 :
289 : } // namespace interfaces
290 :
291 : #endif // BITCOIN_INTERFACES_NODE_H
|