/Users/eugenesiegel/btc/bitcoin/src/interfaces/chain.h
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2018-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 |  | #ifndef BITCOIN_INTERFACES_CHAIN_H | 
| 6 |  | #define BITCOIN_INTERFACES_CHAIN_H | 
| 7 |  |  | 
| 8 |  | #include <blockfilter.h> | 
| 9 |  | #include <common/settings.h> | 
| 10 |  | #include <primitives/transaction.h> | 
| 11 |  | #include <util/result.h> | 
| 12 |  |  | 
| 13 |  | #include <cstddef> | 
| 14 |  | #include <cstdint> | 
| 15 |  | #include <functional> | 
| 16 |  | #include <map> | 
| 17 |  | #include <memory> | 
| 18 |  | #include <optional> | 
| 19 |  | #include <string> | 
| 20 |  | #include <vector> | 
| 21 |  |  | 
| 22 |  | class ArgsManager; | 
| 23 |  | class CBlock; | 
| 24 |  | class CBlockUndo; | 
| 25 |  | class CFeeRate; | 
| 26 |  | class CRPCCommand; | 
| 27 |  | class CScheduler; | 
| 28 |  | class Coin; | 
| 29 |  | class uint256; | 
| 30 |  | enum class MemPoolRemovalReason; | 
| 31 |  | enum class RBFTransactionState; | 
| 32 |  | enum class ChainstateRole; | 
| 33 |  | struct bilingual_str; | 
| 34 |  | struct CBlockLocator; | 
| 35 |  | struct FeeCalculation; | 
| 36 |  | namespace node { | 
| 37 |  | struct NodeContext; | 
| 38 |  | } // namespace node | 
| 39 |  |  | 
| 40 |  | namespace interfaces { | 
| 41 |  |  | 
| 42 |  | class Handler; | 
| 43 |  | class Wallet; | 
| 44 |  |  | 
| 45 |  | //! Helper for findBlock to selectively return pieces of block data. If block is | 
| 46 |  | //! found, data will be returned by setting specified output variables. If block | 
| 47 |  | //! is not found, output variables will keep their previous values. | 
| 48 |  | class FoundBlock | 
| 49 |  | { | 
| 50 |  | public: | 
| 51 | 0 |     FoundBlock& hash(uint256& hash) { m_hash = &hash; return *this; } | 
| 52 | 0 |     FoundBlock& height(int& height) { m_height = &height; return *this; } | 
| 53 | 0 |     FoundBlock& time(int64_t& time) { m_time = &time; return *this; } | 
| 54 | 0 |     FoundBlock& maxTime(int64_t& max_time) { m_max_time = &max_time; return *this; } | 
| 55 | 0 |     FoundBlock& mtpTime(int64_t& mtp_time) { m_mtp_time = &mtp_time; return *this; } | 
| 56 |  |     //! Return whether block is in the active (most-work) chain. | 
| 57 | 0 |     FoundBlock& inActiveChain(bool& in_active_chain) { m_in_active_chain = &in_active_chain; return *this; } | 
| 58 |  |     //! Return locator if block is in the active chain. | 
| 59 | 0 |     FoundBlock& locator(CBlockLocator& locator) { m_locator = &locator; return *this; } | 
| 60 |  |     //! Return next block in the active chain if current block is in the active chain. | 
| 61 | 0 |     FoundBlock& nextBlock(const FoundBlock& next_block) { m_next_block = &next_block; return *this; } | 
| 62 |  |     //! Read block data from disk. If the block exists but doesn't have data | 
| 63 |  |     //! (for example due to pruning), the CBlock variable will be set to null. | 
| 64 | 0 |     FoundBlock& data(CBlock& data) { m_data = &data; return *this; } | 
| 65 |  |  | 
| 66 |  |     uint256* m_hash = nullptr; | 
| 67 |  |     int* m_height = nullptr; | 
| 68 |  |     int64_t* m_time = nullptr; | 
| 69 |  |     int64_t* m_max_time = nullptr; | 
| 70 |  |     int64_t* m_mtp_time = nullptr; | 
| 71 |  |     bool* m_in_active_chain = nullptr; | 
| 72 |  |     CBlockLocator* m_locator = nullptr; | 
| 73 |  |     const FoundBlock* m_next_block = nullptr; | 
| 74 |  |     CBlock* m_data = nullptr; | 
| 75 |  |     mutable bool found = false; | 
| 76 |  | }; | 
| 77 |  |  | 
| 78 |  | //! Block data sent with blockConnected, blockDisconnected notifications. | 
| 79 |  | struct BlockInfo { | 
| 80 |  |     const uint256& hash; | 
| 81 |  |     const uint256* prev_hash = nullptr; | 
| 82 |  |     int height = -1; | 
| 83 |  |     int file_number = -1; | 
| 84 |  |     unsigned data_pos = 0; | 
| 85 |  |     const CBlock* data = nullptr; | 
| 86 |  |     const CBlockUndo* undo_data = nullptr; | 
| 87 |  |     // The maximum time in the chain up to and including this block. | 
| 88 |  |     // A timestamp that can only move forward. | 
| 89 |  |     unsigned int chain_time_max{0}; | 
| 90 |  |  | 
| 91 | 0 |     BlockInfo(const uint256& hash LIFETIMEBOUND) : hash(hash) {} | 
| 92 |  | }; | 
| 93 |  |  | 
| 94 |  | //! The action to be taken after updating a settings value. | 
| 95 |  | //! WRITE indicates that the updated value must be written to disk, | 
| 96 |  | //! while SKIP_WRITE indicates that the change will be kept in memory-only | 
| 97 |  | //! without persisting it. | 
| 98 |  | enum class SettingsAction { | 
| 99 |  |     WRITE, | 
| 100 |  |     SKIP_WRITE | 
| 101 |  | }; | 
| 102 |  |  | 
| 103 |  | using SettingsUpdate = std::function<std::optional<interfaces::SettingsAction>(common::SettingsValue&)>; | 
| 104 |  |  | 
| 105 |  | //! Interface giving clients (wallet processes, maybe other analysis tools in | 
| 106 |  | //! the future) ability to access to the chain state, receive notifications, | 
| 107 |  | //! estimate fees, and submit transactions. | 
| 108 |  | //! | 
| 109 |  | //! TODO: Current chain methods are too low level, exposing too much of the | 
| 110 |  | //! internal workings of the bitcoin node, and not being very convenient to use. | 
| 111 |  | //! Chain methods should be cleaned up and simplified over time. Examples: | 
| 112 |  | //! | 
| 113 |  | //! * The initMessages() and showProgress() methods which the wallet uses to send | 
| 114 |  | //!   notifications to the GUI should go away when GUI and wallet can directly | 
| 115 |  | //!   communicate with each other without going through the node | 
| 116 |  | //!   (https://github.com/bitcoin/bitcoin/pull/15288#discussion_r253321096). | 
| 117 |  | //! | 
| 118 |  | //! * The handleRpc, registerRpcs, rpcEnableDeprecated methods and other RPC | 
| 119 |  | //!   methods can go away if wallets listen for HTTP requests on their own | 
| 120 |  | //!   ports instead of registering to handle requests on the node HTTP port. | 
| 121 |  | //! | 
| 122 |  | //! * Move fee estimation queries to an asynchronous interface and let the | 
| 123 |  | //!   wallet cache it, fee estimation being driven by node mempool, wallet | 
| 124 |  | //!   should be the consumer. | 
| 125 |  | //! | 
| 126 |  | //! * `guessVerificationProgress` and similar methods can go away if rescan | 
| 127 |  | //!   logic moves out of the wallet, and the wallet just requests scans from the | 
| 128 |  | //!   node (https://github.com/bitcoin/bitcoin/issues/11756) | 
| 129 |  | class Chain | 
| 130 |  | { | 
| 131 |  | public: | 
| 132 | 51.2k |     virtual ~Chain() = default; | 
| 133 |  |  | 
| 134 |  |     //! Get current chain height, not including genesis block (returns 0 if | 
| 135 |  |     //! chain only contains genesis block, nullopt if chain does not contain | 
| 136 |  |     //! any blocks) | 
| 137 |  |     virtual std::optional<int> getHeight() = 0; | 
| 138 |  |  | 
| 139 |  |     //! Get block hash. Height must be valid or this function will abort. | 
| 140 |  |     virtual uint256 getBlockHash(int height) = 0; | 
| 141 |  |  | 
| 142 |  |     //! Check that the block is available on disk (i.e. has not been | 
| 143 |  |     //! pruned), and contains transactions. | 
| 144 |  |     virtual bool haveBlockOnDisk(int height) = 0; | 
| 145 |  |  | 
| 146 |  |     //! Return height of the highest block on chain in common with the locator, | 
| 147 |  |     //! which will either be the original block used to create the locator, | 
| 148 |  |     //! or one of its ancestors. | 
| 149 |  |     virtual std::optional<int> findLocatorFork(const CBlockLocator& locator) = 0; | 
| 150 |  |  | 
| 151 |  |     //! Returns whether a block filter index is available. | 
| 152 |  |     virtual bool hasBlockFilterIndex(BlockFilterType filter_type) = 0; | 
| 153 |  |  | 
| 154 |  |     //! Returns whether any of the elements match the block via a BIP 157 block filter | 
| 155 |  |     //! or std::nullopt if the block filter for this block couldn't be found. | 
| 156 |  |     virtual std::optional<bool> blockFilterMatchesAny(BlockFilterType filter_type, const uint256& block_hash, const GCSFilter::ElementSet& filter_set) = 0; | 
| 157 |  |  | 
| 158 |  |     //! Return whether node has the block and optionally return block metadata | 
| 159 |  |     //! or contents. | 
| 160 |  |     virtual bool findBlock(const uint256& hash, const FoundBlock& block={}) = 0; | 
| 161 |  |  | 
| 162 |  |     //! Find first block in the chain with timestamp >= the given time | 
| 163 |  |     //! and height >= than the given height, return false if there is no block | 
| 164 |  |     //! with a high enough timestamp and height. Optionally return block | 
| 165 |  |     //! information. | 
| 166 |  |     virtual bool findFirstBlockWithTimeAndHeight(int64_t min_time, int min_height, const FoundBlock& block={}) = 0; | 
| 167 |  |  | 
| 168 |  |     //! Find ancestor of block at specified height and optionally return | 
| 169 |  |     //! ancestor information. | 
| 170 |  |     virtual bool findAncestorByHeight(const uint256& block_hash, int ancestor_height, const FoundBlock& ancestor_out={}) = 0; | 
| 171 |  |  | 
| 172 |  |     //! Return whether block descends from a specified ancestor, and | 
| 173 |  |     //! optionally return ancestor information. | 
| 174 |  |     virtual bool findAncestorByHash(const uint256& block_hash, | 
| 175 |  |         const uint256& ancestor_hash, | 
| 176 |  |         const FoundBlock& ancestor_out={}) = 0; | 
| 177 |  |  | 
| 178 |  |     //! Find most recent common ancestor between two blocks and optionally | 
| 179 |  |     //! return block information. | 
| 180 |  |     virtual bool findCommonAncestor(const uint256& block_hash1, | 
| 181 |  |         const uint256& block_hash2, | 
| 182 |  |         const FoundBlock& ancestor_out={}, | 
| 183 |  |         const FoundBlock& block1_out={}, | 
| 184 |  |         const FoundBlock& block2_out={}) = 0; | 
| 185 |  |  | 
| 186 |  |     //! Look up unspent output information. Returns coins in the mempool and in | 
| 187 |  |     //! the current chain UTXO set. Iterates through all the keys in the map and | 
| 188 |  |     //! populates the values. | 
| 189 |  |     virtual void findCoins(std::map<COutPoint, Coin>& coins) = 0; | 
| 190 |  |  | 
| 191 |  |     //! Estimate fraction of total transactions verified if blocks up to | 
| 192 |  |     //! the specified block hash are verified. | 
| 193 |  |     virtual double guessVerificationProgress(const uint256& block_hash) = 0; | 
| 194 |  |  | 
| 195 |  |     //! Return true if data is available for all blocks in the specified range | 
| 196 |  |     //! of blocks. This checks all blocks that are ancestors of block_hash in | 
| 197 |  |     //! the height range from min_height to max_height, inclusive. | 
| 198 |  |     virtual bool hasBlocks(const uint256& block_hash, int min_height = 0, std::optional<int> max_height = {}) = 0; | 
| 199 |  |  | 
| 200 |  |     //! Check if transaction is RBF opt in. | 
| 201 |  |     virtual RBFTransactionState isRBFOptIn(const CTransaction& tx) = 0; | 
| 202 |  |  | 
| 203 |  |     //! Check if transaction is in mempool. | 
| 204 |  |     virtual bool isInMempool(const Txid& txid) = 0; | 
| 205 |  |  | 
| 206 |  |     //! Check if transaction has descendants in mempool. | 
| 207 |  |     virtual bool hasDescendantsInMempool(const Txid& txid) = 0; | 
| 208 |  |  | 
| 209 |  |     //! Transaction is added to memory pool, if the transaction fee is below the | 
| 210 |  |     //! amount specified by max_tx_fee, and broadcast to all peers if relay is set to true. | 
| 211 |  |     //! Return false if the transaction could not be added due to the fee or for another reason. | 
| 212 |  |     virtual bool broadcastTransaction(const CTransactionRef& tx, | 
| 213 |  |         const CAmount& max_tx_fee, | 
| 214 |  |         bool relay, | 
| 215 |  |         std::string& err_string) = 0; | 
| 216 |  |  | 
| 217 |  |     //! Calculate mempool ancestor and descendant counts for the given transaction. | 
| 218 |  |     virtual void getTransactionAncestry(const Txid& txid, size_t& ancestors, size_t& descendants, size_t* ancestorsize = nullptr, CAmount* ancestorfees = nullptr) = 0; | 
| 219 |  |  | 
| 220 |  |     //! For each outpoint, calculate the fee-bumping cost to spend this outpoint at the specified | 
| 221 |  |     //  feerate, including bumping its ancestors. For example, if the target feerate is 10sat/vbyte | 
| 222 |  |     //  and this outpoint refers to a mempool transaction at 3sat/vbyte, the bump fee includes the | 
| 223 |  |     //  cost to bump the mempool transaction to 10sat/vbyte (i.e. 7 * mempooltx.vsize). If that | 
| 224 |  |     //  transaction also has, say, an unconfirmed parent with a feerate of 1sat/vbyte, the bump fee | 
| 225 |  |     //  includes the cost to bump the parent (i.e. 9 * parentmempooltx.vsize). | 
| 226 |  |     // | 
| 227 |  |     //  If the outpoint comes from an unconfirmed transaction that is already above the target | 
| 228 |  |     //  feerate or bumped by its descendant(s) already, it does not need to be bumped. Its bump fee | 
| 229 |  |     //  is 0. Likewise, if any of the transaction's ancestors are already bumped by a transaction | 
| 230 |  |     //  in our mempool, they are not included in the transaction's bump fee. | 
| 231 |  |     // | 
| 232 |  |     //  Also supported is bump-fee calculation in the case of replacements. If an outpoint | 
| 233 |  |     //  conflicts with another transaction in the mempool, it is assumed that the goal is to replace | 
| 234 |  |     //  that transaction. As such, the calculation will exclude the to-be-replaced transaction, but | 
| 235 |  |     //  will include the fee-bumping cost. If bump fees of descendants of the to-be-replaced | 
| 236 |  |     //  transaction are requested, the value will be 0. Fee-related RBF rules are not included as | 
| 237 |  |     //  they are logically distinct. | 
| 238 |  |     // | 
| 239 |  |     //  Any outpoints that are otherwise unavailable from the mempool (e.g. UTXOs from confirmed | 
| 240 |  |     //  transactions or transactions not yet broadcast by the wallet) are given a bump fee of 0. | 
| 241 |  |     // | 
| 242 |  |     //  If multiple outpoints come from the same transaction (which would be very rare because | 
| 243 |  |     //  it means that one transaction has multiple change outputs or paid the same wallet using multiple | 
| 244 |  |     //  outputs in the same transaction) or have shared ancestry, the bump fees are calculated | 
| 245 |  |     //  independently, i.e. as if only one of them is spent. This may result in double-fee-bumping. This | 
| 246 |  |     //  caveat can be rectified per use of the sister-function CalculateCombinedBumpFee(…). | 
| 247 |  |     virtual std::map<COutPoint, CAmount> calculateIndividualBumpFees(const std::vector<COutPoint>& outpoints, const CFeeRate& target_feerate) = 0; | 
| 248 |  |  | 
| 249 |  |     //! Calculate the combined bump fee for an input set per the same strategy | 
| 250 |  |     //  as in CalculateIndividualBumpFees(…). | 
| 251 |  |     //  Unlike CalculateIndividualBumpFees(…), this does not return individual | 
| 252 |  |     //  bump fees per outpoint, but a single bump fee for the shared ancestry. | 
| 253 |  |     //  The combined bump fee may be used to correct overestimation due to | 
| 254 |  |     //  shared ancestry by multiple UTXOs after coin selection. | 
| 255 |  |     virtual std::optional<CAmount> calculateCombinedBumpFee(const std::vector<COutPoint>& outpoints, const CFeeRate& target_feerate) = 0; | 
| 256 |  |  | 
| 257 |  |     //! Get the node's package limits. | 
| 258 |  |     //! Currently only returns the ancestor and descendant count limits, but could be enhanced to | 
| 259 |  |     //! return more policy settings. | 
| 260 |  |     virtual void getPackageLimits(unsigned int& limit_ancestor_count, unsigned int& limit_descendant_count) = 0; | 
| 261 |  |  | 
| 262 |  |     //! Check if transaction will pass the mempool's chain limits. | 
| 263 |  |     virtual util::Result<void> checkChainLimits(const CTransactionRef& tx) = 0; | 
| 264 |  |  | 
| 265 |  |     //! Estimate smart fee. | 
| 266 |  |     virtual CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation* calc = nullptr) = 0; | 
| 267 |  |  | 
| 268 |  |     //! Fee estimator max target. | 
| 269 |  |     virtual unsigned int estimateMaxBlocks() = 0; | 
| 270 |  |  | 
| 271 |  |     //! Mempool minimum fee. | 
| 272 |  |     virtual CFeeRate mempoolMinFee() = 0; | 
| 273 |  |  | 
| 274 |  |     //! Relay current minimum fee (from -minrelaytxfee and -incrementalrelayfee settings). | 
| 275 |  |     virtual CFeeRate relayMinFee() = 0; | 
| 276 |  |  | 
| 277 |  |     //! Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay. | 
| 278 |  |     virtual CFeeRate relayIncrementalFee() = 0; | 
| 279 |  |  | 
| 280 |  |     //! Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend. | 
| 281 |  |     virtual CFeeRate relayDustFee() = 0; | 
| 282 |  |  | 
| 283 |  |     //! Check if any block has been pruned. | 
| 284 |  |     virtual bool havePruned() = 0; | 
| 285 |  |  | 
| 286 |  |     //! Get the current prune height. | 
| 287 |  |     virtual std::optional<int> getPruneHeight() = 0; | 
| 288 |  |  | 
| 289 |  |     //! Check if the node is ready to broadcast transactions. | 
| 290 |  |     virtual bool isReadyToBroadcast() = 0; | 
| 291 |  |  | 
| 292 |  |     //! Check if in IBD. | 
| 293 |  |     virtual bool isInitialBlockDownload() = 0; | 
| 294 |  |  | 
| 295 |  |     //! Check if shutdown requested. | 
| 296 |  |     virtual bool shutdownRequested() = 0; | 
| 297 |  |  | 
| 298 |  |     //! Send init message. | 
| 299 |  |     virtual void initMessage(const std::string& message) = 0; | 
| 300 |  |  | 
| 301 |  |     //! Send init warning. | 
| 302 |  |     virtual void initWarning(const bilingual_str& message) = 0; | 
| 303 |  |  | 
| 304 |  |     //! Send init error. | 
| 305 |  |     virtual void initError(const bilingual_str& message) = 0; | 
| 306 |  |  | 
| 307 |  |     //! Send progress indicator. | 
| 308 |  |     virtual void showProgress(const std::string& title, int progress, bool resume_possible) = 0; | 
| 309 |  |  | 
| 310 |  |     //! Chain notifications. | 
| 311 |  |     class Notifications | 
| 312 |  |     { | 
| 313 |  |     public: | 
| 314 | 0 |         virtual ~Notifications() = default; | 
| 315 | 0 |         virtual void transactionAddedToMempool(const CTransactionRef& tx) {} | 
| 316 | 0 |         virtual void transactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason) {} | 
| 317 | 0 |         virtual void blockConnected(ChainstateRole role, const BlockInfo& block) {} | 
| 318 | 0 |         virtual void blockDisconnected(const BlockInfo& block) {} | 
| 319 | 0 |         virtual void updatedBlockTip() {} | 
| 320 | 0 |         virtual void chainStateFlushed(ChainstateRole role, const CBlockLocator& locator) {} | 
| 321 |  |     }; | 
| 322 |  |  | 
| 323 |  |     //! Options specifying which chain notifications are required. | 
| 324 |  |     struct NotifyOptions | 
| 325 |  |     { | 
| 326 |  |         //! Include undo data with block connected notifications. | 
| 327 |  |         bool connect_undo_data = false; | 
| 328 |  |         //! Include block data with block disconnected notifications. | 
| 329 |  |         bool disconnect_data = false; | 
| 330 |  |         //! Include undo data with block disconnected notifications. | 
| 331 |  |         bool disconnect_undo_data = false; | 
| 332 |  |     }; | 
| 333 |  |  | 
| 334 |  |     //! Register handler for notifications. | 
| 335 |  |     virtual std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications) = 0; | 
| 336 |  |  | 
| 337 |  |     //! Wait for pending notifications to be processed unless block hash points to the current | 
| 338 |  |     //! chain tip. | 
| 339 |  |     virtual void waitForNotificationsIfTipChanged(const uint256& old_tip) = 0; | 
| 340 |  |  | 
| 341 |  |     //! Register handler for RPC. Command is not copied, so reference | 
| 342 |  |     //! needs to remain valid until Handler is disconnected. | 
| 343 |  |     virtual std::unique_ptr<Handler> handleRpc(const CRPCCommand& command) = 0; | 
| 344 |  |  | 
| 345 |  |     //! Check if deprecated RPC is enabled. | 
| 346 |  |     virtual bool rpcEnableDeprecated(const std::string& method) = 0; | 
| 347 |  |  | 
| 348 |  |     //! Get settings value. | 
| 349 |  |     virtual common::SettingsValue getSetting(const std::string& arg) = 0; | 
| 350 |  |  | 
| 351 |  |     //! Get list of settings values. | 
| 352 |  |     virtual std::vector<common::SettingsValue> getSettingsList(const std::string& arg) = 0; | 
| 353 |  |  | 
| 354 |  |     //! Return <datadir>/settings.json setting value. | 
| 355 |  |     virtual common::SettingsValue getRwSetting(const std::string& name) = 0; | 
| 356 |  |  | 
| 357 |  |     //! Updates a setting in <datadir>/settings.json. | 
| 358 |  |     //! Null can be passed to erase the setting. There is intentionally no | 
| 359 |  |     //! support for writing null values to settings.json. | 
| 360 |  |     //! Depending on the action returned by the update function, this will either | 
| 361 |  |     //! update the setting in memory or write the updated settings to disk. | 
| 362 |  |     virtual bool updateRwSetting(const std::string& name, const SettingsUpdate& update_function) = 0; | 
| 363 |  |  | 
| 364 |  |     //! Replace a setting in <datadir>/settings.json with a new value. | 
| 365 |  |     //! Null can be passed to erase the setting. | 
| 366 |  |     //! This method provides a simpler alternative to updateRwSetting when | 
| 367 |  |     //! atomically reading and updating the setting is not required. | 
| 368 |  |     virtual bool overwriteRwSetting(const std::string& name, common::SettingsValue value, SettingsAction action = SettingsAction::WRITE) = 0; | 
| 369 |  |  | 
| 370 |  |     //! Delete a given setting in <datadir>/settings.json. | 
| 371 |  |     //! This method provides a simpler alternative to overwriteRwSetting when | 
| 372 |  |     //! erasing a setting, for ease of use and readability. | 
| 373 |  |     virtual bool deleteRwSettings(const std::string& name, SettingsAction action = SettingsAction::WRITE) = 0; | 
| 374 |  |  | 
| 375 |  |     //! Synchronously send transactionAddedToMempool notifications about all | 
| 376 |  |     //! current mempool transactions to the specified handler and return after | 
| 377 |  |     //! the last one is sent. These notifications aren't coordinated with async | 
| 378 |  |     //! notifications sent by handleNotifications, so out of date async | 
| 379 |  |     //! notifications from handleNotifications can arrive during and after | 
| 380 |  |     //! synchronous notifications from requestMempoolTransactions. Clients need | 
| 381 |  |     //! to be prepared to handle this by ignoring notifications about unknown | 
| 382 |  |     //! removed transactions and already added new transactions. | 
| 383 |  |     virtual void requestMempoolTransactions(Notifications& notifications) = 0; | 
| 384 |  |  | 
| 385 |  |     //! Return true if an assumed-valid chain is in use. | 
| 386 |  |     virtual bool hasAssumedValidChain() = 0; | 
| 387 |  |  | 
| 388 |  |     //! Get internal node context. Useful for testing, but not | 
| 389 |  |     //! accessible across processes. | 
| 390 | 0 |     virtual node::NodeContext* context() { return nullptr; } | 
| 391 |  | }; | 
| 392 |  |  | 
| 393 |  | //! Interface to let node manage chain clients (wallets, or maybe tools for | 
| 394 |  | //! monitoring and analysis in the future). | 
| 395 |  | class ChainClient | 
| 396 |  | { | 
| 397 |  | public: | 
| 398 | 0 |     virtual ~ChainClient() = default; | 
| 399 |  |  | 
| 400 |  |     //! Register rpcs. | 
| 401 |  |     virtual void registerRpcs() = 0; | 
| 402 |  |  | 
| 403 |  |     //! Check for errors before loading. | 
| 404 |  |     virtual bool verify() = 0; | 
| 405 |  |  | 
| 406 |  |     //! Load saved state. | 
| 407 |  |     virtual bool load() = 0; | 
| 408 |  |  | 
| 409 |  |     //! Start client execution and provide a scheduler. | 
| 410 |  |     virtual void start(CScheduler& scheduler) = 0; | 
| 411 |  |  | 
| 412 |  |     //! Shut down client. | 
| 413 |  |     virtual void stop() = 0; | 
| 414 |  |  | 
| 415 |  |     //! Set mock time. | 
| 416 |  |     virtual void setMockTime(int64_t time) = 0; | 
| 417 |  |  | 
| 418 |  |     //! Mock the scheduler to fast forward in time. | 
| 419 |  |     virtual void schedulerMockForward(std::chrono::seconds delta_seconds) = 0; | 
| 420 |  | }; | 
| 421 |  |  | 
| 422 |  | //! Return implementation of Chain interface. | 
| 423 |  | std::unique_ptr<Chain> MakeChain(node::NodeContext& node); | 
| 424 |  |  | 
| 425 |  | } // namespace interfaces | 
| 426 |  |  | 
| 427 |  | #endif // BITCOIN_INTERFACES_CHAIN_H |