/Users/eugenesiegel/btc/bitcoin/src/node/context.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2019-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_NODE_CONTEXT_H |
6 | | #define BITCOIN_NODE_CONTEXT_H |
7 | | |
8 | | #include <atomic> |
9 | | #include <cstdlib> |
10 | | #include <functional> |
11 | | #include <memory> |
12 | | #include <thread> |
13 | | #include <vector> |
14 | | |
15 | | class ArgsManager; |
16 | | class AddrMan; |
17 | | class BanMan; |
18 | | class BaseIndex; |
19 | | class CBlockPolicyEstimator; |
20 | | class CConnman; |
21 | | class ValidationSignals; |
22 | | class CScheduler; |
23 | | class CTxMemPool; |
24 | | class ChainstateManager; |
25 | | class ECC_Context; |
26 | | class NetGroupManager; |
27 | | class PeerManager; |
28 | | namespace interfaces { |
29 | | class Chain; |
30 | | class ChainClient; |
31 | | class Mining; |
32 | | class Init; |
33 | | class WalletLoader; |
34 | | } // namespace interfaces |
35 | | namespace kernel { |
36 | | struct Context; |
37 | | } |
38 | | namespace util { |
39 | | class SignalInterrupt; |
40 | | } |
41 | | |
42 | | namespace node { |
43 | | class KernelNotifications; |
44 | | class Warnings; |
45 | | |
46 | | //! NodeContext struct containing references to chain state and connection |
47 | | //! state. |
48 | | //! |
49 | | //! This is used by init, rpc, and test code to pass object references around |
50 | | //! without needing to declare the same variables and parameters repeatedly, or |
51 | | //! to use globals. More variables could be added to this struct (particularly |
52 | | //! references to validation objects) to eliminate use of globals |
53 | | //! and make code more modular and testable. The struct isn't intended to have |
54 | | //! any member functions. It should just be a collection of references that can |
55 | | //! be used without pulling in unwanted dependencies or functionality. |
56 | | struct NodeContext { |
57 | | //! libbitcoin_kernel context |
58 | | std::unique_ptr<kernel::Context> kernel; |
59 | | std::unique_ptr<ECC_Context> ecc_context; |
60 | | //! Init interface for initializing current process and connecting to other processes. |
61 | | interfaces::Init* init{nullptr}; |
62 | | //! Function to request a shutdown. |
63 | | std::function<bool()> shutdown_request; |
64 | | //! Interrupt object used to track whether node shutdown was requested. |
65 | | util::SignalInterrupt* shutdown_signal{nullptr}; |
66 | | std::unique_ptr<AddrMan> addrman; |
67 | | std::unique_ptr<CConnman> connman; |
68 | | std::unique_ptr<CTxMemPool> mempool; |
69 | | std::unique_ptr<const NetGroupManager> netgroupman; |
70 | | std::unique_ptr<CBlockPolicyEstimator> fee_estimator; |
71 | | std::unique_ptr<PeerManager> peerman; |
72 | | std::unique_ptr<ChainstateManager> chainman; |
73 | | std::unique_ptr<BanMan> banman; |
74 | | ArgsManager* args{nullptr}; // Currently a raw pointer because the memory is not managed by this struct |
75 | | std::vector<BaseIndex*> indexes; // raw pointers because memory is not managed by this struct |
76 | | std::unique_ptr<interfaces::Chain> chain; |
77 | | //! List of all chain clients (wallet processes or other client) connected to node. |
78 | | std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients; |
79 | | //! Reference to chain client that should used to load or create wallets |
80 | | //! opened by the gui. |
81 | | std::unique_ptr<interfaces::Mining> mining; |
82 | | interfaces::WalletLoader* wallet_loader{nullptr}; |
83 | | std::unique_ptr<CScheduler> scheduler; |
84 | 0 | std::function<void()> rpc_interruption_point = [] {}; |
85 | | //! Issues blocking calls about sync status, errors and warnings |
86 | | std::unique_ptr<KernelNotifications> notifications; |
87 | | //! Issues calls about blocks and transactions |
88 | | std::unique_ptr<ValidationSignals> validation_signals; |
89 | | std::atomic<int> exit_status{EXIT_SUCCESS}; |
90 | | //! Manages all the node warnings |
91 | | std::unique_ptr<node::Warnings> warnings; |
92 | | std::thread background_init_thread; |
93 | | |
94 | | //! Declare default constructor and destructor that are not inline, so code |
95 | | //! instantiating the NodeContext struct doesn't need to #include class |
96 | | //! definitions for all the unique_ptr members. |
97 | | NodeContext(); |
98 | | ~NodeContext(); |
99 | | }; |
100 | | } // namespace node |
101 | | |
102 | | #endif // BITCOIN_NODE_CONTEXT_H |