Bitcoin
chain.h
Go to the documentation of this file.
1 // Copyright (c) 2018-2019 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 <optional.h> // For Optional and nullopt
9 #include <primitives/transaction.h> // For CTransactionRef
10 
11 #include <memory>
12 #include <stddef.h>
13 #include <stdint.h>
14 #include <string>
15 #include <vector>
16 
17 class CBlock;
18 class CFeeRate;
19 class CRPCCommand;
20 class CScheduler;
21 class CValidationState;
22 class Coin;
23 class uint256;
24 enum class RBFTransactionState;
25 struct CBlockLocator;
26 struct FeeCalculation;
27 
28 namespace interfaces {
29 
30 class Handler;
31 class Wallet;
32 
58 class Chain
59 {
60 public:
61  virtual ~Chain() {}
62 
68  class Lock
69  {
70  public:
71  virtual ~Lock() {}
72 
76  virtual Optional<int> getHeight() = 0;
77 
81  virtual Optional<int> getBlockHeight(const uint256& hash) = 0;
82 
85  virtual int getBlockDepth(const uint256& hash) = 0;
86 
88  virtual uint256 getBlockHash(int height) = 0;
89 
91  virtual int64_t getBlockTime(int height) = 0;
92 
95  virtual int64_t getBlockMedianTimePast(int height) = 0;
96 
99  virtual bool haveBlockOnDisk(int height) = 0;
100 
106  virtual Optional<int> findFirstBlockWithTimeAndHeight(int64_t time, int height, uint256* hash) = 0;
107 
110  virtual Optional<int> findPruned(int start_height = 0, Optional<int> stop_height = nullopt) = 0;
111 
118  virtual Optional<int> findFork(const uint256& hash, Optional<int>* height) = 0;
119 
121  virtual CBlockLocator getTipLocator() = 0;
122 
126  virtual Optional<int> findLocatorFork(const CBlockLocator& locator) = 0;
127 
129  virtual bool checkFinalTx(const CTransaction& tx) = 0;
130 
134  virtual bool submitToMemoryPool(const CTransactionRef& tx, CAmount absurd_fee, CValidationState& state) = 0;
135  };
136 
139  virtual std::unique_ptr<Lock> lock(bool try_lock = false) = 0;
140 
147  virtual bool findBlock(const uint256& hash,
148  CBlock* block = nullptr,
149  int64_t* time = nullptr,
150  int64_t* max_time = nullptr) = 0;
151 
155  virtual void findCoins(std::map<COutPoint, Coin>& coins) = 0;
156 
159  virtual double guessVerificationProgress(const uint256& block_hash) = 0;
160 
162  virtual RBFTransactionState isRBFOptIn(const CTransaction& tx) = 0;
163 
165  virtual bool hasDescendantsInMempool(const uint256& txid) = 0;
166 
168  virtual void relayTransaction(const uint256& txid) = 0;
169 
171  virtual void getTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants) = 0;
172 
174  virtual bool checkChainLimits(const CTransactionRef& tx) = 0;
175 
177  virtual CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation* calc = nullptr) = 0;
178 
180  virtual unsigned int estimateMaxBlocks() = 0;
181 
183  virtual CFeeRate mempoolMinFee() = 0;
184 
186  virtual CFeeRate relayMinFee() = 0;
187 
189  virtual CFeeRate relayIncrementalFee() = 0;
190 
192  virtual CFeeRate relayDustFee() = 0;
193 
195  virtual bool havePruned() = 0;
196 
198  virtual bool p2pEnabled() = 0;
199 
201  virtual bool isReadyToBroadcast() = 0;
202 
204  virtual bool isInitialBlockDownload() = 0;
205 
207  virtual bool shutdownRequested() = 0;
208 
210  virtual int64_t getAdjustedTime() = 0;
211 
213  virtual void initMessage(const std::string& message) = 0;
214 
216  virtual void initWarning(const std::string& message) = 0;
217 
219  virtual void initError(const std::string& message) = 0;
220 
222  virtual void loadWallet(std::unique_ptr<Wallet> wallet) = 0;
223 
225  virtual void showProgress(const std::string& title, int progress, bool resume_possible) = 0;
226 
229  {
230  public:
231  virtual ~Notifications() {}
232  virtual void TransactionAddedToMempool(const CTransactionRef& tx) {}
233  virtual void TransactionRemovedFromMempool(const CTransactionRef& ptx) {}
234  virtual void BlockConnected(const CBlock& block, const std::vector<CTransactionRef>& tx_conflicted) {}
235  virtual void BlockDisconnected(const CBlock& block) {}
236  virtual void UpdatedBlockTip() {}
237  virtual void ChainStateFlushed(const CBlockLocator& locator) {}
238  };
239 
241  virtual std::unique_ptr<Handler> handleNotifications(Notifications& notifications) = 0;
242 
246  virtual void waitForNotificationsIfNewBlocksConnected(const uint256& old_tip) = 0;
247 
250  virtual std::unique_ptr<Handler> handleRpc(const CRPCCommand& command) = 0;
251 
253  virtual bool rpcEnableDeprecated(const std::string& method) = 0;
254 
256  virtual void rpcRunLater(const std::string& name, std::function<void()> fn, int64_t seconds) = 0;
257 
259  virtual int rpcSerializationFlags() = 0;
260 
269  virtual void requestMempoolTransactions(Notifications& notifications) = 0;
270 };
271 
275 {
276 public:
277  virtual ~ChainClient() {}
278 
280  virtual void registerRpcs() = 0;
281 
283  virtual bool verify() = 0;
284 
286  virtual bool load() = 0;
287 
289  virtual void start(CScheduler& scheduler) = 0;
290 
292  virtual void flush() = 0;
293 
295  virtual void stop() = 0;
296 };
297 
299 std::unique_ptr<Chain> MakeChain();
300 
309 std::unique_ptr<ChainClient> MakeWalletClient(Chain& chain, std::vector<std::string> wallet_filenames);
310 
311 } // namespace interfaces
312 
313 #endif // BITCOIN_INTERFACES_CHAIN_H
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:408
virtual bool shutdownRequested()=0
Check if shutdown requested.
virtual CFeeRate relayIncrementalFee()=0
Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay.
virtual int64_t getBlockTime(int height)=0
Get block time. Height must be valid or this function will abort.
virtual void initWarning(const std::string &message)=0
Send init warning.
virtual int getBlockDepth(const uint256 &hash)=0
virtual void getTransactionAncestry(const uint256 &txid, size_t &ancestors, size_t &descendants)=0
Calculate mempool ancestor and descendant counts for the given transaction.
virtual bool verify()=0
Check for errors before loading.
virtual unsigned int estimateMaxBlocks()=0
Fee estimator max target.
Definition: block.h:126
virtual bool load()=0
Load saved state.
virtual void TransactionRemovedFromMempool(const CTransactionRef &ptx)
Definition: chain.h:233
Definition: chain.h:58
virtual CFeeRate relayDustFee()=0
Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend.
Definition: scheduler.h:37
virtual bool submitToMemoryPool(const CTransactionRef &tx, CAmount absurd_fee, CValidationState &state)=0
virtual ~ChainClient()
Definition: chain.h:277
virtual ~Notifications()
Definition: chain.h:231
virtual void waitForNotificationsIfNewBlocksConnected(const uint256 &old_tip)=0
virtual void TransactionAddedToMempool(const CTransactionRef &tx)
Definition: chain.h:232
std::unique_ptr< ChainClient > MakeWalletClient(Chain &chain, std::vector< std::string > wallet_filenames)
Definition: wallet.cpp:530
virtual void registerRpcs()=0
Register rpcs.
Chain notifications.
Definition: chain.h:228
static auto & nullopt
Substitute for C++17 std::nullopt.
Definition: optional.h:24
virtual int64_t getAdjustedTime()=0
Get adjusted time.
virtual CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation *calc=nullptr)=0
Estimate smart fee.
virtual bool findBlock(const uint256 &hash, CBlock *block=nullptr, int64_t *time=nullptr, int64_t *max_time=nullptr)=0
virtual void BlockConnected(const CBlock &block, const std::vector< CTransactionRef > &tx_conflicted)
Definition: chain.h:234
Definition: validation.h:98
virtual void relayTransaction(const uint256 &txid)=0
Relay transaction.
static CScheduler scheduler
Definition: init.cpp:178
virtual void requestMempoolTransactions(Notifications &notifications)=0
Definition: fees.h:75
virtual double guessVerificationProgress(const uint256 &block_hash)=0
virtual Optional< int > getHeight()=0
RBFTransactionState
Definition: rbf.h:10
virtual int rpcSerializationFlags()=0
Current RPC serialization flags.
int64_t CAmount
Definition: amount.h:12
Definition: feerate.h:19
Definition: chain.h:68
virtual void initMessage(const std::string &message)=0
Send init message.
virtual void stop()=0
Shut down client.
virtual bool checkChainLimits(const CTransactionRef &tx)=0
Check if transaction will pass the mempool's chain limits.
virtual RBFTransactionState isRBFOptIn(const CTransaction &tx)=0
Check if transaction is RBF opt in.
virtual void UpdatedBlockTip()
Definition: chain.h:236
virtual uint256 getBlockHash(int height)=0
Get block hash. Height must be valid or this function will abort.
Definition: dummywallet.cpp:11
virtual void findCoins(std::map< COutPoint, Coin > &coins)=0
Definition: transaction.h:270
virtual bool isInitialBlockDownload()=0
Check if in IBD.
const char * name
Definition: rest.cpp:39
Definition: coins.h:29
virtual std::unique_ptr< Handler > handleNotifications(Notifications &notifications)=0
Register handler for notifications.
virtual void ChainStateFlushed(const CBlockLocator &locator)
Definition: chain.h:237
virtual bool rpcEnableDeprecated(const std::string &method)=0
Check if deprecated RPC is enabled.
virtual void start(CScheduler &scheduler)=0
Start client execution and provide a scheduler.
virtual ~Chain()
Definition: chain.h:61
virtual bool checkFinalTx(const CTransaction &tx)=0
Check if transaction will be final given chain height current time.
virtual int64_t getBlockMedianTimePast(int height)=0
virtual void rpcRunLater(const std::string &name, std::function< void()> fn, int64_t seconds)=0
Run function after given number of seconds. Cancel any previous calls with same name.
virtual void loadWallet(std::unique_ptr< Wallet > wallet)=0
Send wallet load notification to the GUI.
virtual CFeeRate mempoolMinFee()=0
Mempool minimum fee.
virtual CFeeRate relayMinFee()=0
Relay current minimum fee (from -minrelaytxfee and -incrementalrelayfee settings).
virtual void BlockDisconnected(const CBlock &block)
Definition: chain.h:235
std::unique_ptr< Chain > MakeChain()
Return implementation of Chain interface.
Definition: chain.cpp:383
Definition: uint256.h:121
virtual Optional< int > findPruned(int start_height=0, Optional< int > stop_height=nullopt)=0
virtual ~Lock()
Definition: chain.h:71
virtual std::unique_ptr< Handler > handleRpc(const CRPCCommand &command)=0
virtual Optional< int > findFork(const uint256 &hash, Optional< int > *height)=0
virtual Optional< int > getBlockHeight(const uint256 &hash)=0
Definition: chain.h:274
virtual bool hasDescendantsInMempool(const uint256 &txid)=0
Check if transaction has descendants in mempool.
virtual std::unique_ptr< Lock > lock(bool try_lock=false)=0
signed long long int64_t
Definition: stdint.h:18
virtual bool havePruned()=0
Check if any block has been pruned.
Definition: server.h:88
virtual bool isReadyToBroadcast()=0
Check if the node is ready to broadcast transactions.
virtual bool p2pEnabled()=0
Check if p2p enabled.
virtual void initError(const std::string &message)=0
Send init error.
virtual void flush()=0
Save state to disk.
boost::optional< T > Optional
Substitute for C++17 std::optional.
Definition: optional.h:14
Definition: block.h:72
virtual Optional< int > findLocatorFork(const CBlockLocator &locator)=0
virtual CBlockLocator getTipLocator()=0
Get locator for the current chain tip.
virtual void showProgress(const std::string &title, int progress, bool resume_possible)=0
Send progress indicator.
virtual bool haveBlockOnDisk(int height)=0
virtual Optional< int > findFirstBlockWithTimeAndHeight(int64_t time, int height, uint256 *hash)=0