Branch data 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 : : 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
|