Bitcoin Core  29.1.0
P2P Digital Currency
interfaces.cpp
Go to the documentation of this file.
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 #include <addrdb.h>
6 #include <banman.h>
7 #include <blockfilter.h>
8 #include <chain.h>
9 #include <chainparams.h>
10 #include <common/args.h>
11 #include <consensus/merkle.h>
12 #include <consensus/validation.h>
13 #include <deploymentstatus.h>
14 #include <external_signer.h>
15 #include <index/blockfilterindex.h>
16 #include <init.h>
17 #include <interfaces/chain.h>
18 #include <interfaces/handler.h>
19 #include <interfaces/mining.h>
20 #include <interfaces/node.h>
21 #include <interfaces/types.h>
22 #include <interfaces/wallet.h>
23 #include <kernel/chain.h>
24 #include <kernel/context.h>
25 #include <kernel/mempool_entry.h>
26 #include <logging.h>
27 #include <mapport.h>
28 #include <net.h>
29 #include <net_processing.h>
30 #include <netaddress.h>
31 #include <netbase.h>
32 #include <node/blockstorage.h>
33 #include <node/coin.h>
34 #include <node/context.h>
35 #include <node/interface_ui.h>
36 #include <node/mini_miner.h>
37 #include <node/miner.h>
39 #include <node/transaction.h>
40 #include <node/types.h>
41 #include <node/warnings.h>
42 #include <policy/feerate.h>
43 #include <policy/fees.h>
44 #include <policy/policy.h>
45 #include <policy/rbf.h>
46 #include <policy/settings.h>
47 #include <primitives/block.h>
48 #include <primitives/transaction.h>
49 #include <rpc/blockchain.h>
50 #include <rpc/protocol.h>
51 #include <rpc/server.h>
53 #include <sync.h>
54 #include <txmempool.h>
55 #include <uint256.h>
56 #include <univalue.h>
57 #include <util/check.h>
58 #include <util/result.h>
59 #include <util/signalinterrupt.h>
60 #include <util/string.h>
61 #include <util/translation.h>
62 #include <validation.h>
63 #include <validationinterface.h>
64 
65 #include <bitcoin-build-config.h> // IWYU pragma: keep
66 
67 #include <any>
68 #include <memory>
69 #include <optional>
70 #include <utility>
71 
72 #include <boost/signals2/signal.hpp>
73 
77 using interfaces::Chain;
81 using interfaces::Mining;
82 using interfaces::Node;
85 using util::Join;
86 
87 namespace node {
88 // All members of the classes in this namespace are intentionally public, as the
89 // classes themselves are private.
90 namespace {
91 #ifdef ENABLE_EXTERNAL_SIGNER
92 class ExternalSignerImpl : public interfaces::ExternalSigner
93 {
94 public:
95  ExternalSignerImpl(::ExternalSigner signer) : m_signer(std::move(signer)) {}
96  std::string getName() override { return m_signer.m_name; }
98 };
99 #endif
100 
101 class NodeImpl : public Node
102 {
103 public:
104  explicit NodeImpl(NodeContext& context) { setContext(&context); }
105  void initLogging() override { InitLogging(args()); }
106  void initParameterInteraction() override { InitParameterInteraction(args()); }
107  bilingual_str getWarnings() override { return Join(Assert(m_context->warnings)->GetMessages(), Untranslated("<hr />")); }
108  int getExitStatus() override { return Assert(m_context)->exit_status.load(); }
109  BCLog::CategoryMask getLogCategories() override { return LogInstance().GetCategoryMask(); }
110  bool baseInitialize() override
111  {
112  if (!AppInitBasicSetup(args(), Assert(context())->exit_status)) return false;
113  if (!AppInitParameterInteraction(args())) return false;
114 
115  m_context->warnings = std::make_unique<node::Warnings>();
116  m_context->kernel = std::make_unique<kernel::Context>();
117  m_context->ecc_context = std::make_unique<ECC_Context>();
118  if (!AppInitSanityChecks(*m_context->kernel)) return false;
119 
120  if (!AppInitLockDirectories()) return false;
121  if (!AppInitInterfaces(*m_context)) return false;
122 
123  return true;
124  }
125  bool appInitMain(interfaces::BlockAndHeaderTipInfo* tip_info) override
126  {
127  if (AppInitMain(*m_context, tip_info)) return true;
128  // Error during initialization, set exit status before continue
129  m_context->exit_status.store(EXIT_FAILURE);
130  return false;
131  }
132  void appShutdown() override
133  {
136  }
137  void startShutdown() override
138  {
139  NodeContext& ctx{*Assert(m_context)};
140  if (!(Assert(ctx.shutdown_request))()) {
141  LogError("Failed to send shutdown signal\n");
142  }
143 
144  // Stop RPC for clean shutdown if any of waitfor* commands is executed.
145  if (args().GetBoolArg("-server", false)) {
146  InterruptRPC();
147  StopRPC();
148  }
149  }
150  bool shutdownRequested() override { return ShutdownRequested(*Assert(m_context)); };
151  bool isSettingIgnored(const std::string& name) override
152  {
153  bool ignored = false;
154  args().LockSettings([&](common::Settings& settings) {
155  if (auto* options = common::FindKey(settings.command_line_options, name)) {
156  ignored = !options->empty();
157  }
158  });
159  return ignored;
160  }
161  common::SettingsValue getPersistentSetting(const std::string& name) override { return args().GetPersistentSetting(name); }
162  void updateRwSetting(const std::string& name, const common::SettingsValue& value) override
163  {
164  args().LockSettings([&](common::Settings& settings) {
165  if (value.isNull()) {
166  settings.rw_settings.erase(name);
167  } else {
168  settings.rw_settings[name] = value;
169  }
170  });
172  }
173  void forceSetting(const std::string& name, const common::SettingsValue& value) override
174  {
175  args().LockSettings([&](common::Settings& settings) {
176  if (value.isNull()) {
177  settings.forced_settings.erase(name);
178  } else {
179  settings.forced_settings[name] = value;
180  }
181  });
182  }
183  void resetSettings() override
184  {
185  args().WriteSettingsFile(/*errors=*/nullptr, /*backup=*/true);
186  args().LockSettings([&](common::Settings& settings) {
187  settings.rw_settings.clear();
188  });
190  }
191  void mapPort(bool enable) override { StartMapPort(enable); }
192  bool getProxy(Network net, Proxy& proxy_info) override { return GetProxy(net, proxy_info); }
193  size_t getNodeCount(ConnectionDirection flags) override
194  {
195  return m_context->connman ? m_context->connman->GetNodeCount(flags) : 0;
196  }
197  bool getNodesStats(NodesStats& stats) override
198  {
199  stats.clear();
200 
201  if (m_context->connman) {
202  std::vector<CNodeStats> stats_temp;
203  m_context->connman->GetNodeStats(stats_temp);
204 
205  stats.reserve(stats_temp.size());
206  for (auto& node_stats_temp : stats_temp) {
207  stats.emplace_back(std::move(node_stats_temp), false, CNodeStateStats());
208  }
209 
210  // Try to retrieve the CNodeStateStats for each node.
211  if (m_context->peerman) {
212  TRY_LOCK(::cs_main, lockMain);
213  if (lockMain) {
214  for (auto& node_stats : stats) {
215  std::get<1>(node_stats) =
216  m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
217  }
218  }
219  }
220  return true;
221  }
222  return false;
223  }
224  bool getBanned(banmap_t& banmap) override
225  {
226  if (m_context->banman) {
227  m_context->banman->GetBanned(banmap);
228  return true;
229  }
230  return false;
231  }
232  bool ban(const CNetAddr& net_addr, int64_t ban_time_offset) override
233  {
234  if (m_context->banman) {
235  m_context->banman->Ban(net_addr, ban_time_offset);
236  return true;
237  }
238  return false;
239  }
240  bool unban(const CSubNet& ip) override
241  {
242  if (m_context->banman) {
243  m_context->banman->Unban(ip);
244  return true;
245  }
246  return false;
247  }
248  bool disconnectByAddress(const CNetAddr& net_addr) override
249  {
250  if (m_context->connman) {
251  return m_context->connman->DisconnectNode(net_addr);
252  }
253  return false;
254  }
255  bool disconnectById(NodeId id) override
256  {
257  if (m_context->connman) {
258  return m_context->connman->DisconnectNode(id);
259  }
260  return false;
261  }
262  std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners() override
263  {
264 #ifdef ENABLE_EXTERNAL_SIGNER
265  std::vector<ExternalSigner> signers = {};
266  const std::string command = args().GetArg("-signer", "");
267  if (command == "") return {};
268  ExternalSigner::Enumerate(command, signers, Params().GetChainTypeString());
269  std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
270  result.reserve(signers.size());
271  for (auto& signer : signers) {
272  result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(signer)));
273  }
274  return result;
275 #else
276  // This result is indistinguishable from a successful call that returns
277  // no signers. For the current GUI this doesn't matter, because the wallet
278  // creation dialog disables the external signer checkbox in both
279  // cases. The return type could be changed to std::optional<std::vector>
280  // (or something that also includes error messages) if this distinction
281  // becomes important.
282  return {};
283 #endif // ENABLE_EXTERNAL_SIGNER
284  }
285  int64_t getTotalBytesRecv() override { return m_context->connman ? m_context->connman->GetTotalBytesRecv() : 0; }
286  int64_t getTotalBytesSent() override { return m_context->connman ? m_context->connman->GetTotalBytesSent() : 0; }
287  size_t getMempoolSize() override { return m_context->mempool ? m_context->mempool->size() : 0; }
288  size_t getMempoolDynamicUsage() override { return m_context->mempool ? m_context->mempool->DynamicMemoryUsage() : 0; }
289  size_t getMempoolMaxUsage() override { return m_context->mempool ? m_context->mempool->m_opts.max_size_bytes : 0; }
290  bool getHeaderTip(int& height, int64_t& block_time) override
291  {
292  LOCK(::cs_main);
293  auto best_header = chainman().m_best_header;
294  if (best_header) {
295  height = best_header->nHeight;
296  block_time = best_header->GetBlockTime();
297  return true;
298  }
299  return false;
300  }
301  std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses() override
302  {
303  if (m_context->connman)
304  return m_context->connman->getNetLocalAddresses();
305  else
306  return {};
307  }
308  int getNumBlocks() override
309  {
310  LOCK(::cs_main);
311  return chainman().ActiveChain().Height();
312  }
313  uint256 getBestBlockHash() override
314  {
315  const CBlockIndex* tip = WITH_LOCK(::cs_main, return chainman().ActiveChain().Tip());
316  return tip ? tip->GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
317  }
318  int64_t getLastBlockTime() override
319  {
320  LOCK(::cs_main);
321  if (chainman().ActiveChain().Tip()) {
322  return chainman().ActiveChain().Tip()->GetBlockTime();
323  }
324  return chainman().GetParams().GenesisBlock().GetBlockTime(); // Genesis block's time of current network
325  }
326  double getVerificationProgress() override
327  {
328  return chainman().GuessVerificationProgress(WITH_LOCK(chainman().GetMutex(), return chainman().ActiveChain().Tip()));
329  }
330  bool isInitialBlockDownload() override
331  {
332  return chainman().IsInitialBlockDownload();
333  }
334  bool isLoadingBlocks() override { return chainman().m_blockman.LoadingBlocks(); }
335  void setNetworkActive(bool active) override
336  {
337  if (m_context->connman) {
338  m_context->connman->SetNetworkActive(active);
339  }
340  }
341  bool getNetworkActive() override { return m_context->connman && m_context->connman->GetNetworkActive(); }
342  CFeeRate getDustRelayFee() override
343  {
344  if (!m_context->mempool) return CFeeRate{DUST_RELAY_TX_FEE};
345  return m_context->mempool->m_opts.dust_relay_feerate;
346  }
347  UniValue executeRpc(const std::string& command, const UniValue& params, const std::string& uri) override
348  {
349  JSONRPCRequest req;
350  req.context = m_context;
351  req.params = params;
352  req.strMethod = command;
353  req.URI = uri;
355  }
356  std::vector<std::string> listRpcCommands() override { return ::tableRPC.listCommands(); }
357  void rpcSetTimerInterfaceIfUnset(RPCTimerInterface* iface) override { RPCSetTimerInterfaceIfUnset(iface); }
358  void rpcUnsetTimerInterface(RPCTimerInterface* iface) override { RPCUnsetTimerInterface(iface); }
359  std::optional<Coin> getUnspentOutput(const COutPoint& output) override
360  {
361  LOCK(::cs_main);
362  return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
363  }
364  TransactionError broadcastTransaction(CTransactionRef tx, CAmount max_tx_fee, std::string& err_string) override
365  {
366  return BroadcastTransaction(*m_context, std::move(tx), err_string, max_tx_fee, /*relay=*/ true, /*wait_callback=*/ false);
367  }
368  WalletLoader& walletLoader() override
369  {
370  return *Assert(m_context->wallet_loader);
371  }
372  std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn) override
373  {
374  return MakeSignalHandler(::uiInterface.InitMessage_connect(fn));
375  }
376  std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn) override
377  {
378  return MakeSignalHandler(::uiInterface.ThreadSafeMessageBox_connect(fn));
379  }
380  std::unique_ptr<Handler> handleQuestion(QuestionFn fn) override
381  {
382  return MakeSignalHandler(::uiInterface.ThreadSafeQuestion_connect(fn));
383  }
384  std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn) override
385  {
386  return MakeSignalHandler(::uiInterface.ShowProgress_connect(fn));
387  }
388  std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn) override
389  {
390  return MakeSignalHandler(::uiInterface.InitWallet_connect(fn));
391  }
392  std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn) override
393  {
394  return MakeSignalHandler(::uiInterface.NotifyNumConnectionsChanged_connect(fn));
395  }
396  std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn) override
397  {
398  return MakeSignalHandler(::uiInterface.NotifyNetworkActiveChanged_connect(fn));
399  }
400  std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn) override
401  {
402  return MakeSignalHandler(::uiInterface.NotifyAlertChanged_connect(fn));
403  }
404  std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn) override
405  {
406  return MakeSignalHandler(::uiInterface.BannedListChanged_connect(fn));
407  }
408  std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn) override
409  {
410  return MakeSignalHandler(::uiInterface.NotifyBlockTip_connect([fn, this](SynchronizationState sync_state, const CBlockIndex* block) {
411  fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()},
412  chainman().GuessVerificationProgress(block));
413  }));
414  }
415  std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn) override
416  {
417  return MakeSignalHandler(
418  ::uiInterface.NotifyHeaderTip_connect([fn](SynchronizationState sync_state, int64_t height, int64_t timestamp, bool presync) {
419  fn(sync_state, BlockTip{(int)height, timestamp, uint256{}}, presync);
420  }));
421  }
422  NodeContext* context() override { return m_context; }
423  void setContext(NodeContext* context) override
424  {
425  m_context = context;
426  }
427  ArgsManager& args() { return *Assert(Assert(m_context)->args); }
428  ChainstateManager& chainman() { return *Assert(m_context->chainman); }
429  NodeContext* m_context{nullptr};
430 };
431 
432 // NOLINTNEXTLINE(misc-no-recursion)
433 bool FillBlock(const CBlockIndex* index, const FoundBlock& block, UniqueLock<RecursiveMutex>& lock, const CChain& active, const BlockManager& blockman)
434 {
435  if (!index) return false;
436  if (block.m_hash) *block.m_hash = index->GetBlockHash();
437  if (block.m_height) *block.m_height = index->nHeight;
438  if (block.m_time) *block.m_time = index->GetBlockTime();
439  if (block.m_max_time) *block.m_max_time = index->GetBlockTimeMax();
440  if (block.m_mtp_time) *block.m_mtp_time = index->GetMedianTimePast();
441  if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
442  if (block.m_locator) { *block.m_locator = GetLocator(index); }
443  if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] : nullptr, *block.m_next_block, lock, active, blockman);
444  if (block.m_data) {
445  REVERSE_LOCK(lock);
446  if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
447  }
448  block.found = true;
449  return true;
450 }
451 
452 class NotificationsProxy : public CValidationInterface
453 {
454 public:
455  explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
456  : m_notifications(std::move(notifications)) {}
457  virtual ~NotificationsProxy() = default;
458  void TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence) override
459  {
460  m_notifications->transactionAddedToMempool(tx.info.m_tx);
461  }
462  void TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) override
463  {
464  m_notifications->transactionRemovedFromMempool(tx, reason);
465  }
466  void BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
467  {
468  m_notifications->blockConnected(role, kernel::MakeBlockInfo(index, block.get()));
469  }
470  void BlockDisconnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* index) override
471  {
472  m_notifications->blockDisconnected(kernel::MakeBlockInfo(index, block.get()));
473  }
474  void UpdatedBlockTip(const CBlockIndex* index, const CBlockIndex* fork_index, bool is_ibd) override
475  {
476  m_notifications->updatedBlockTip();
477  }
478  void ChainStateFlushed(ChainstateRole role, const CBlockLocator& locator) override {
479  m_notifications->chainStateFlushed(role, locator);
480  }
481  std::shared_ptr<Chain::Notifications> m_notifications;
482 };
483 
484 class NotificationsHandlerImpl : public Handler
485 {
486 public:
487  explicit NotificationsHandlerImpl(ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
488  : m_signals{signals}, m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
489  {
491  }
492  ~NotificationsHandlerImpl() override { disconnect(); }
493  void disconnect() override
494  {
495  if (m_proxy) {
497  m_proxy.reset();
498  }
499  }
501  std::shared_ptr<NotificationsProxy> m_proxy;
502 };
503 
504 class RpcHandlerImpl : public Handler
505 {
506 public:
507  explicit RpcHandlerImpl(const CRPCCommand& command) : m_command(command), m_wrapped_command(&command)
508  {
509  m_command.actor = [this](const JSONRPCRequest& request, UniValue& result, bool last_handler) {
510  if (!m_wrapped_command) return false;
511  try {
512  return m_wrapped_command->actor(request, result, last_handler);
513  } catch (const UniValue& e) {
514  // If this is not the last handler and a wallet not found
515  // exception was thrown, return false so the next handler can
516  // try to handle the request. Otherwise, reraise the exception.
517  if (!last_handler) {
518  const UniValue& code = e["code"];
519  if (code.isNum() && code.getInt<int>() == RPC_WALLET_NOT_FOUND) {
520  return false;
521  }
522  }
523  throw;
524  }
525  };
527  }
528 
529  void disconnect() final
530  {
531  if (m_wrapped_command) {
532  m_wrapped_command = nullptr;
534  }
535  }
536 
537  ~RpcHandlerImpl() override { disconnect(); }
538 
541 };
542 
543 class ChainImpl : public Chain
544 {
545 public:
546  explicit ChainImpl(NodeContext& node) : m_node(node) {}
547  std::optional<int> getHeight() override
548  {
549  const int height{WITH_LOCK(::cs_main, return chainman().ActiveChain().Height())};
550  return height >= 0 ? std::optional{height} : std::nullopt;
551  }
552  uint256 getBlockHash(int height) override
553  {
554  LOCK(::cs_main);
555  return Assert(chainman().ActiveChain()[height])->GetBlockHash();
556  }
557  bool haveBlockOnDisk(int height) override
558  {
559  LOCK(::cs_main);
560  const CBlockIndex* block{chainman().ActiveChain()[height]};
561  return block && ((block->nStatus & BLOCK_HAVE_DATA) != 0) && block->nTx > 0;
562  }
563  CBlockLocator getTipLocator() override
564  {
565  LOCK(::cs_main);
566  return chainman().ActiveChain().GetLocator();
567  }
568  CBlockLocator getActiveChainLocator(const uint256& block_hash) override
569  {
570  LOCK(::cs_main);
571  const CBlockIndex* index = chainman().m_blockman.LookupBlockIndex(block_hash);
572  return GetLocator(index);
573  }
574  std::optional<int> findLocatorFork(const CBlockLocator& locator) override
575  {
576  LOCK(::cs_main);
577  if (const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
578  return fork->nHeight;
579  }
580  return std::nullopt;
581  }
582  bool hasBlockFilterIndex(BlockFilterType filter_type) override
583  {
584  return GetBlockFilterIndex(filter_type) != nullptr;
585  }
586  std::optional<bool> blockFilterMatchesAny(BlockFilterType filter_type, const uint256& block_hash, const GCSFilter::ElementSet& filter_set) override
587  {
588  const BlockFilterIndex* block_filter_index{GetBlockFilterIndex(filter_type)};
589  if (!block_filter_index) return std::nullopt;
590 
591  BlockFilter filter;
592  const CBlockIndex* index{WITH_LOCK(::cs_main, return chainman().m_blockman.LookupBlockIndex(block_hash))};
593  if (index == nullptr || !block_filter_index->LookupFilter(index, filter)) return std::nullopt;
594  return filter.GetFilter().MatchAny(filter_set);
595  }
596  bool findBlock(const uint256& hash, const FoundBlock& block) override
597  {
598  WAIT_LOCK(cs_main, lock);
599  return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
600  }
601  bool findFirstBlockWithTimeAndHeight(int64_t min_time, int min_height, const FoundBlock& block) override
602  {
603  WAIT_LOCK(cs_main, lock);
604  const CChain& active = chainman().ActiveChain();
605  return FillBlock(active.FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
606  }
607  bool findAncestorByHeight(const uint256& block_hash, int ancestor_height, const FoundBlock& ancestor_out) override
608  {
609  WAIT_LOCK(cs_main, lock);
610  const CChain& active = chainman().ActiveChain();
611  if (const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
612  if (const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
613  return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
614  }
615  }
616  return FillBlock(nullptr, ancestor_out, lock, active, chainman().m_blockman);
617  }
618  bool findAncestorByHash(const uint256& block_hash, const uint256& ancestor_hash, const FoundBlock& ancestor_out) override
619  {
620  WAIT_LOCK(cs_main, lock);
621  const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
622  const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
623  if (block && ancestor && block->GetAncestor(ancestor->nHeight) != ancestor) ancestor = nullptr;
624  return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
625  }
626  bool findCommonAncestor(const uint256& block_hash1, const uint256& block_hash2, const FoundBlock& ancestor_out, const FoundBlock& block1_out, const FoundBlock& block2_out) override
627  {
628  WAIT_LOCK(cs_main, lock);
629  const CChain& active = chainman().ActiveChain();
630  const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
631  const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
632  const CBlockIndex* ancestor = block1 && block2 ? LastCommonAncestor(block1, block2) : nullptr;
633  // Using & instead of && below to avoid short circuiting and leaving
634  // output uninitialized. Cast bool to int to avoid -Wbitwise-instead-of-logical
635  // compiler warnings.
636  return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
637  int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
638  int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
639  }
640  void findCoins(std::map<COutPoint, Coin>& coins) override { return FindCoins(m_node, coins); }
641  double guessVerificationProgress(const uint256& block_hash) override
642  {
643  LOCK(chainman().GetMutex());
644  return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
645  }
646  bool hasBlocks(const uint256& block_hash, int min_height, std::optional<int> max_height) override
647  {
648  // hasBlocks returns true if all ancestors of block_hash in specified
649  // range have block data (are not pruned), false if any ancestors in
650  // specified range are missing data.
651  //
652  // For simplicity and robustness, min_height and max_height are only
653  // used to limit the range, and passing min_height that's too low or
654  // max_height that's too high will not crash or change the result.
655  LOCK(::cs_main);
656  if (const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
657  if (max_height && block->nHeight >= *max_height) block = block->GetAncestor(*max_height);
658  for (; block->nStatus & BLOCK_HAVE_DATA; block = block->pprev) {
659  // Check pprev to not segfault if min_height is too low
660  if (block->nHeight <= min_height || !block->pprev) return true;
661  }
662  }
663  return false;
664  }
665  RBFTransactionState isRBFOptIn(const CTransaction& tx) override
666  {
667  if (!m_node.mempool) return IsRBFOptInEmptyMempool(tx);
668  LOCK(m_node.mempool->cs);
669  return IsRBFOptIn(tx, *m_node.mempool);
670  }
671  bool isInMempool(const uint256& txid) override
672  {
673  if (!m_node.mempool) return false;
674  LOCK(m_node.mempool->cs);
675  return m_node.mempool->exists(GenTxid::Txid(txid));
676  }
677  bool hasDescendantsInMempool(const uint256& txid) override
678  {
679  if (!m_node.mempool) return false;
680  LOCK(m_node.mempool->cs);
681  const auto entry{m_node.mempool->GetEntry(Txid::FromUint256(txid))};
682  if (entry == nullptr) return false;
683  return entry->GetCountWithDescendants() > 1;
684  }
685  bool broadcastTransaction(const CTransactionRef& tx,
686  const CAmount& max_tx_fee,
687  bool relay,
688  std::string& err_string) override
689  {
690  const TransactionError err = BroadcastTransaction(m_node, tx, err_string, max_tx_fee, relay, /*wait_callback=*/false);
691  // Chain clients only care about failures to accept the tx to the mempool. Disregard non-mempool related failures.
692  // Note: this will need to be updated if BroadcastTransactions() is updated to return other non-mempool failures
693  // that Chain clients do not need to know about.
694  return TransactionError::OK == err;
695  }
696  void getTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants, size_t* ancestorsize, CAmount* ancestorfees) override
697  {
698  ancestors = descendants = 0;
699  if (!m_node.mempool) return;
700  m_node.mempool->GetTransactionAncestry(txid, ancestors, descendants, ancestorsize, ancestorfees);
701  }
702 
703  std::map<COutPoint, CAmount> calculateIndividualBumpFees(const std::vector<COutPoint>& outpoints, const CFeeRate& target_feerate) override
704  {
705  if (!m_node.mempool) {
706  std::map<COutPoint, CAmount> bump_fees;
707  for (const auto& outpoint : outpoints) {
708  bump_fees.emplace(outpoint, 0);
709  }
710  return bump_fees;
711  }
712  return MiniMiner(*m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
713  }
714 
715  std::optional<CAmount> calculateCombinedBumpFee(const std::vector<COutPoint>& outpoints, const CFeeRate& target_feerate) override
716  {
717  if (!m_node.mempool) {
718  return 0;
719  }
720  return MiniMiner(*m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
721  }
722  void getPackageLimits(unsigned int& limit_ancestor_count, unsigned int& limit_descendant_count) override
723  {
724  const CTxMemPool::Limits default_limits{};
725 
726  const CTxMemPool::Limits& limits{m_node.mempool ? m_node.mempool->m_opts.limits : default_limits};
727 
728  limit_ancestor_count = limits.ancestor_count;
729  limit_descendant_count = limits.descendant_count;
730  }
732  {
733  if (!m_node.mempool) return {};
734  LockPoints lp;
735  CTxMemPoolEntry entry(tx, 0, 0, 0, 0, false, 0, lp);
736  LOCK(m_node.mempool->cs);
737  return m_node.mempool->CheckPackageLimits({tx}, entry.GetTxSize());
738  }
739  CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation* calc) override
740  {
741  if (!m_node.fee_estimator) return {};
742  return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
743  }
744  unsigned int estimateMaxBlocks() override
745  {
746  if (!m_node.fee_estimator) return 0;
747  return m_node.fee_estimator->HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE);
748  }
749  CFeeRate mempoolMinFee() override
750  {
751  if (!m_node.mempool) return {};
752  return m_node.mempool->GetMinFee();
753  }
754  CFeeRate relayMinFee() override
755  {
756  if (!m_node.mempool) return CFeeRate{DEFAULT_MIN_RELAY_TX_FEE};
757  return m_node.mempool->m_opts.min_relay_feerate;
758  }
759  CFeeRate relayIncrementalFee() override
760  {
761  if (!m_node.mempool) return CFeeRate{DEFAULT_INCREMENTAL_RELAY_FEE};
762  return m_node.mempool->m_opts.incremental_relay_feerate;
763  }
764  CFeeRate relayDustFee() override
765  {
766  if (!m_node.mempool) return CFeeRate{DUST_RELAY_TX_FEE};
767  return m_node.mempool->m_opts.dust_relay_feerate;
768  }
769  bool havePruned() override
770  {
771  LOCK(::cs_main);
772  return chainman().m_blockman.m_have_pruned;
773  }
774  std::optional<int> getPruneHeight() override
775  {
776  LOCK(chainman().GetMutex());
777  return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
778  }
779  bool isReadyToBroadcast() override { return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
780  bool isInitialBlockDownload() override
781  {
782  return chainman().IsInitialBlockDownload();
783  }
784  bool shutdownRequested() override { return ShutdownRequested(m_node); }
785  void initMessage(const std::string& message) override { ::uiInterface.InitMessage(message); }
786  void initWarning(const bilingual_str& message) override { InitWarning(message); }
787  void initError(const bilingual_str& message) override { InitError(message); }
788  void showProgress(const std::string& title, int progress, bool resume_possible) override
789  {
790  ::uiInterface.ShowProgress(title, progress, resume_possible);
791  }
792  std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications) override
793  {
794  return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
795  }
796  void waitForNotificationsIfTipChanged(const uint256& old_tip) override
797  {
798  if (!old_tip.IsNull() && old_tip == WITH_LOCK(::cs_main, return chainman().ActiveChain().Tip()->GetBlockHash())) return;
799  validation_signals().SyncWithValidationInterfaceQueue();
800  }
801  std::unique_ptr<Handler> handleRpc(const CRPCCommand& command) override
802  {
803  return std::make_unique<RpcHandlerImpl>(command);
804  }
805  bool rpcEnableDeprecated(const std::string& method) override { return IsDeprecatedRPCEnabled(method); }
806  void rpcRunLater(const std::string& name, std::function<void()> fn, int64_t seconds) override
807  {
808  RPCRunLater(name, std::move(fn), seconds);
809  }
810  common::SettingsValue getSetting(const std::string& name) override
811  {
812  return args().GetSetting(name);
813  }
814  std::vector<common::SettingsValue> getSettingsList(const std::string& name) override
815  {
816  return args().GetSettingsList(name);
817  }
818  common::SettingsValue getRwSetting(const std::string& name) override
819  {
821  args().LockSettings([&](const common::Settings& settings) {
822  if (const common::SettingsValue* value = common::FindKey(settings.rw_settings, name)) {
823  result = *value;
824  }
825  });
826  return result;
827  }
828  bool updateRwSetting(const std::string& name,
829  const interfaces::SettingsUpdate& update_settings_func) override
830  {
831  std::optional<interfaces::SettingsAction> action;
832  args().LockSettings([&](common::Settings& settings) {
833  if (auto* value = common::FindKey(settings.rw_settings, name)) {
834  action = update_settings_func(*value);
835  if (value->isNull()) settings.rw_settings.erase(name);
836  } else {
837  UniValue new_value;
838  action = update_settings_func(new_value);
839  if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
840  }
841  });
842  if (!action) return false;
843  // Now dump value to disk if requested
845  }
846  bool overwriteRwSetting(const std::string& name, common::SettingsValue value, interfaces::SettingsAction action) override
847  {
848  return updateRwSetting(name, [&](common::SettingsValue& settings) {
849  settings = std::move(value);
850  return action;
851  });
852  }
853  bool deleteRwSettings(const std::string& name, interfaces::SettingsAction action) override
854  {
855  return overwriteRwSetting(name, {}, action);
856  }
857  void requestMempoolTransactions(Notifications& notifications) override
858  {
859  if (!m_node.mempool) return;
860  LOCK2(::cs_main, m_node.mempool->cs);
861  for (const CTxMemPoolEntry& entry : m_node.mempool->entryAll()) {
862  notifications.transactionAddedToMempool(entry.GetSharedTx());
863  }
864  }
865  bool hasAssumedValidChain() override
866  {
867  return chainman().IsSnapshotActive();
868  }
869 
870  NodeContext* context() override { return &m_node; }
871  ArgsManager& args() { return *Assert(m_node.args); }
872  ChainstateManager& chainman() { return *Assert(m_node.chainman); }
873  ValidationSignals& validation_signals() { return *Assert(m_node.validation_signals); }
874  NodeContext& m_node;
875 };
876 
877 class BlockTemplateImpl : public BlockTemplate
878 {
879 public:
880  explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template, NodeContext& node) : m_block_template(std::move(block_template)), m_node(node)
881  {
883  }
884 
885  CBlockHeader getBlockHeader() override
886  {
887  return m_block_template->block;
888  }
889 
890  CBlock getBlock() override
891  {
892  return m_block_template->block;
893  }
894 
895  std::vector<CAmount> getTxFees() override
896  {
897  return m_block_template->vTxFees;
898  }
899 
900  std::vector<int64_t> getTxSigops() override
901  {
902  return m_block_template->vTxSigOpsCost;
903  }
904 
905  CTransactionRef getCoinbaseTx() override
906  {
907  return m_block_template->block.vtx[0];
908  }
909 
910  std::vector<unsigned char> getCoinbaseCommitment() override
911  {
912  return m_block_template->vchCoinbaseCommitment;
913  }
914 
915  int getWitnessCommitmentIndex() override
916  {
918  }
919 
920  std::vector<uint256> getCoinbaseMerklePath() override
921  {
922  return TransactionMerklePath(m_block_template->block, 0);
923  }
924 
925  bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t nonce, CTransactionRef coinbase) override
926  {
927  CBlock block{m_block_template->block};
928 
929  if (block.vtx.size() == 0) {
930  block.vtx.push_back(coinbase);
931  } else {
932  block.vtx[0] = coinbase;
933  }
934 
935  block.nVersion = version;
936  block.nTime = timestamp;
937  block.nNonce = nonce;
938 
939  block.hashMerkleRoot = BlockMerkleRoot(block);
940 
941  auto block_ptr = std::make_shared<const CBlock>(block);
942  return chainman().ProcessNewBlock(block_ptr, /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/nullptr);
943  }
944 
945  const std::unique_ptr<CBlockTemplate> m_block_template;
946 
947  ChainstateManager& chainman() { return *Assert(m_node.chainman); }
948  NodeContext& m_node;
949 };
950 
951 class MinerImpl : public Mining
952 {
953 public:
954  explicit MinerImpl(NodeContext& node) : m_node(node) {}
955 
956  bool isTestChain() override
957  {
958  return chainman().GetParams().IsTestChain();
959  }
960 
961  bool isInitialBlockDownload() override
962  {
963  return chainman().IsInitialBlockDownload();
964  }
965 
966  std::optional<BlockRef> getTip() override
967  {
968  LOCK(::cs_main);
969  CBlockIndex* tip{chainman().ActiveChain().Tip()};
970  if (!tip) return {};
971  return BlockRef{tip->GetBlockHash(), tip->nHeight};
972  }
973 
974  BlockRef waitTipChanged(uint256 current_tip, MillisecondsDouble timeout) override
975  {
976  if (timeout > std::chrono::years{100}) timeout = std::chrono::years{100}; // Upper bound to avoid UB in std::chrono
977  {
978  WAIT_LOCK(notifications().m_tip_block_mutex, lock);
979  notifications().m_tip_block_cv.wait_for(lock, timeout, [&]() EXCLUSIVE_LOCKS_REQUIRED(notifications().m_tip_block_mutex) {
980  // We need to wait for m_tip_block to be set AND for the value
981  // to differ from the current_tip value.
982  return (notifications().TipBlock() && notifications().TipBlock() != current_tip) || chainman().m_interrupt;
983  });
984  }
985  // Must release m_tip_block_mutex before locking cs_main, to avoid deadlocks.
986  LOCK(::cs_main);
987  return BlockRef{chainman().ActiveChain().Tip()->GetBlockHash(), chainman().ActiveChain().Tip()->nHeight};
988  }
989 
990  std::unique_ptr<BlockTemplate> createNewBlock(const BlockCreateOptions& options) override
991  {
992  BlockAssembler::Options assemble_options{options};
993  ApplyArgsManOptions(*Assert(m_node.args), assemble_options);
994  return std::make_unique<BlockTemplateImpl>(BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.CreateNewBlock(), m_node);
995  }
996 
997  NodeContext* context() override { return &m_node; }
998  ChainstateManager& chainman() { return *Assert(m_node.chainman); }
999  KernelNotifications& notifications() { return *Assert(m_node.notifications); }
1000  NodeContext& m_node;
1001 };
1002 } // namespace
1003 } // namespace node
1004 
1005 namespace interfaces {
1006 std::unique_ptr<Node> MakeNode(node::NodeContext& context) { return std::make_unique<node::NodeImpl>(context); }
1007 std::unique_ptr<Chain> MakeChain(node::NodeContext& context) { return std::make_unique<node::ChainImpl>(context); }
1008 std::unique_ptr<Mining> MakeMining(node::NodeContext& context) { return std::make_unique<node::MinerImpl>(context); }
1009 } // namespace interfaces
std::shared_ptr< const CTransaction > CTransactionRef
Definition: transaction.h:423
virtual int getWitnessCommitmentIndex()=0
TransactionError
Definition: types.h:21
virtual bool haveBlockOnDisk(int height)=0
Check that the block is available on disk (i.e.
Helper for findBlock to selectively return pieces of block data.
Definition: chain.h:47
const GCSFilter & GetFilter() const LIFETIMEBOUND
Definition: blockfilter.h:136
virtual bool deleteRwSettings(const std::string &name, SettingsAction action=SettingsAction::WRITE)=0
Delete a given setting in <datadir>/settings.json.
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
virtual bool findCommonAncestor(const uint256 &block_hash1, const uint256 &block_hash2, const FoundBlock &ancestor_out={}, const FoundBlock &block1_out={}, const FoundBlock &block2_out={})=0
Find most recent common ancestor between two blocks and optionally return block information.
virtual void findCoins(std::map< COutPoint, Coin > &coins)=0
Look up unspent output information.
virtual void getTransactionAncestry(const uint256 &txid, size_t &ancestors, size_t &descendants, size_t *ancestorsize=nullptr, CAmount *ancestorfees=nullptr)=0
Calculate mempool ancestor and descendant counts for the given transaction.
virtual void getPackageLimits(unsigned int &limit_ancestor_count, unsigned int &limit_descendant_count)=0
Get the node&#39;s package limits.
RPC timer "driver".
Definition: server.h:51
Block template interface.
Definition: mining.h:31
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
Definition: merkle.cpp:183
Block tip (could be a header or not, depends on the subscribed signal).
Definition: node.h:283
std::any context
Definition: request.h:45
Enables interaction with an external signing device or service, such as a hardware wallet...
virtual void TransactionRemovedFromMempool(const CTransactionRef &tx, MemPoolRemovalReason reason, uint64_t mempool_sequence)
Notifies listeners of a transaction leaving mempool.
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
Definition: policy.h:44
void InitLogging(const ArgsManager &args)
Initialize global loggers.
Definition: init.cpp:830
SynchronizationState
Current sync state passed to tip changed callbacks.
Definition: validation.h:85
BCLog::Logger & LogInstance()
Definition: logging.cpp:26
virtual std::optional< int > getHeight()=0
Get current chain height, not including genesis block (returns 0 if chain only contains genesis block...
virtual CBlockHeader getBlockHeader()=0
virtual bool findFirstBlockWithTimeAndHeight(int64_t min_time, int min_height, const FoundBlock &block={})=0
Find first block in the chain with timestamp >= the given time and height >= than the given height...
CClientUIInterface uiInterface
int64_t GetBlockTime() const
Definition: chain.h:266
assert(!tx.IsCoinBase())
Generate a new block, without valid proof-of-work.
Definition: miner.h:143
Describes a place in the block chain to another node such that if the other node doesn&#39;t have the sam...
Definition: block.h:123
NodeContext & m_node
Definition: interfaces.cpp:874
virtual std::unique_ptr< Handler > handleNotifications(std::shared_ptr< Notifications > notifications)=0
Register handler for notifications.
virtual void BlockDisconnected(const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being disconnected Provides the block that was disconnected.
CBlockIndex * pprev
pointer to the index of the predecessor of this block
Definition: chain.h:147
#define TRY_LOCK(cs, name)
Definition: sync.h:261
RBFTransactionState IsRBFOptIn(const CTransaction &tx, const CTxMemPool &pool)
Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This inv...
Definition: rbf.cpp:24
std::map< std::string, SettingsValue > forced_settings
Map of setting name to forced setting value.
Definition: settings.h:34
unsigned int nonce
Definition: miner_tests.cpp:75
Stored settings.
Definition: settings.h:32
common::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
Definition: args.cpp:825
Bilingual messages:
Definition: translation.h:24
Definition: block.h:68
Actor actor
Definition: server.h:109
virtual uint256 getBlockHash(int height)=0
Get block hash. Height must be valid or this function will abort.
virtual CFeeRate mempoolMinFee()=0
Mempool minimum fee.
virtual common::SettingsValue getSetting(const std::string &arg)=0
Get settings value.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Definition: validation.h:865
virtual CBlockLocator getActiveChainLocator(const uint256 &block_hash)=0
Return a locator that refers to a block in the active chain.
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.
Options struct containing limit options for a CTxMemPool.
int64_t * m_max_time
Definition: chain.h:68
An in-memory indexed chain of blocks.
Definition: chain.h:416
void appendCommand(const std::string &name, const CRPCCommand *pcmd)
Appends a CRPCCommand to the dispatch table.
Definition: server.cpp:260
virtual CFeeRate relayDustFee()=0
Relay dust fee setting (-dustrelayfee), reflecting lowest rate it&#39;s economical to spend...
virtual bool hasBlockFilterIndex(BlockFilterType filter_type)=0
Returns whether a block filter index is available.
virtual std::vector< common::SettingsValue > getSettingsList(const std::string &arg)=0
Get list of settings values.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
Definition: translation.h:82
MemPoolRemovalReason
Reason why a transaction was removed from the mempool, this is passed to the notification signal...
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the last common ancestor two blocks have.
Definition: chain.cpp:165
bool GetProxy(enum Network net, Proxy &proxyInfoOut)
Definition: netbase.cpp:689
virtual bool isInitialBlockDownload()=0
Check if in IBD.
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE
Default for -minrelaytxfee, minimum relay fee for transactions.
Definition: policy.h:66
Hash/height pair to help track and identify blocks.
Definition: types.h:13
virtual std::optional< int > getPruneHeight()=0
Get the current prune height.
Interrupt(node)
bool MatchAny(const ElementSet &elements) const
Checks if any of the given elements may be in the set.
bool removeCommand(const std::string &name, const CRPCCommand *pcmd)
Definition: server.cpp:267
::ExternalSigner m_signer
Definition: interfaces.cpp:97
void InterruptRPC()
Definition: server.cpp:286
common::SettingsValue GetPersistentSetting(const std::string &name) const
Get current setting from config file or read/write settings file, ignoring nonpersistent command line...
Definition: args.cpp:445
bool isNum() const
Definition: univalue.h:84
bool AppInitLockDirectories()
Lock bitcoin core critical directories.
Definition: init.cpp:1156
uint32_t nTime
Definition: chain.h:189
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
const CRPCCommand * m_wrapped_command
Definition: interfaces.cpp:540
std::unique_ptr< Node > MakeNode(node::NodeContext &context)
Return implementation of Node interface.
Int getInt() const
Definition: univalue.h:138
void InitWarning(const bilingual_str &str)
Show warning message.
#define REVERSE_LOCK(g)
Definition: sync.h:243
void RPCRunLater(const std::string &name, std::function< void()> func, int64_t nSeconds)
Run func nSeconds from now.
Definition: server.cpp:563
virtual CTransactionRef getCoinbaseTx()=0
virtual void TransactionAddedToMempool(const NewMempoolTransactionInfo &tx, uint64_t mempool_sequence)
Notifies listeners of a transaction having been added to mempool.
std::string m_name
Name of signer.
virtual double guessVerificationProgress(const uint256 &block_hash)=0
Estimate fraction of total transactions verified if blocks up to the specified block hash are verifie...
Implement this to subscribe to events generated in validation and mempool.
int64_t * m_mtp_time
Definition: chain.h:69
CBlockLocator * m_locator
Definition: chain.h:71
void RPCUnsetTimerInterface(RPCTimerInterface *iface)
Unset factory function for timers.
Definition: server.cpp:557
RBFTransactionState
The rbf state of unconfirmed transactions.
Definition: rbf.h:29
uint256 * m_hash
Definition: chain.h:65
std::unique_ptr< CTxMemPool > mempool
Definition: context.h:68
bool AppInitBasicSetup(const ArgsManager &args, std::atomic< int > &exit_status)
Initialize bitcoin core: Basic context setup.
Definition: init.cpp:859
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
Definition: mempool_entry.h:65
int64_t CAmount
Amount in satoshis (Can be negative)
Definition: amount.h:12
UniValue execute(const JSONRPCRequest &request) const
Execute a method.
Definition: server.cpp:484
virtual std::optional< int > findLocatorFork(const CBlockLocator &locator)=0
Return height of the highest block on chain in common with the locator, which will either be the orig...
CRPCCommand m_command
Definition: interfaces.cpp:539
std::string strMethod
Definition: request.h:39
uint256 GetBlockHash() const
Definition: chain.h:243
virtual bool hasDescendantsInMempool(const uint256 &txid)=0
Check if transaction has descendants in mempool.
CBlockIndex * FindEarliestAtLeast(int64_t nTime, int height) const
Find the earliest block with timestamp equal or greater than the given time and height equal or great...
Definition: chain.cpp:71
BlockFilterType
Definition: blockfilter.h:92
NodeContext struct containing references to chain state and connection state.
Definition: context.h:56
#define LOCK2(cs1, cs2)
Definition: sync.h:258
std::string name
Definition: server.h:108
CRPCTable tableRPC
Definition: server.cpp:573
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
Definition: mining.h:63
virtual bool hasAssumedValidChain()=0
Return true if an assumed-valid chain is in use.
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
Definition: rbf.cpp:53
virtual bool isInMempool(const uint256 &txid)=0
Check if transaction is in mempool.
ArgsManager & args
Definition: bitcoind.cpp:277
std::vector< common::SettingsValue > GetSettingsList(const std::string &arg) const
Get list of setting values.
Definition: args.cpp:833
std::function< std::optional< interfaces::SettingsAction >(common::SettingsValue &)> SettingsUpdate
Definition: chain.h:102
std::map< std::string, std::vector< SettingsValue > > command_line_options
Map of setting name to list of command line values.
Definition: settings.h:36
SettingsAction
The action to be taken after updating a settings value.
Definition: chain.h:97
uint32_t nNonce
Definition: chain.h:191
virtual bool findAncestorByHeight(const uint256 &block_hash, int ancestor_height, const FoundBlock &ancestor_out={})=0
Find ancestor of block at specified height and optionally return ancestor information.
virtual bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t nonce, CTransactionRef coinbase)=0
Construct and broadcast the block.
ChainstateRole
This enum describes the various roles a specific Chainstate instance can take.
Definition: chain.h:25
UniValue params
Definition: request.h:40
virtual CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation *calc=nullptr)=0
Estimate smart fee.
CBlock * m_data
Definition: chain.h:73
#define LOCK(cs)
Definition: sync.h:257
const char * name
Definition: rest.cpp:49
bool InitError(const bilingual_str &str)
Show error message.
void StartMapPort(bool enable)
Definition: mapport.cpp:137
virtual bool updateRwSetting(const std::string &name, const SettingsUpdate &update_function)=0
Updates a setting in <datadir>/settings.json.
Complete block filter struct as defined in BIP 157.
Definition: blockfilter.h:114
virtual bool overwriteRwSetting(const std::string &name, common::SettingsValue value, SettingsAction action=SettingsAction::WRITE)=0
Replace a setting in <datadir>/settings.json with a new value.
const FoundBlock * m_next_block
Definition: chain.h:72
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
Definition: time.h:87
virtual std::unique_ptr< Handler > handleRpc(const CRPCCommand &command)=0
Register handler for RPC.
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
Notifies listeners when the block chain tip advances.
virtual std::vector< CAmount > getTxFees()=0
bool AppInitMain(NodeContext &node, interfaces::BlockAndHeaderTipInfo *tip_info)
Bitcoin core main initialization.
Definition: init.cpp:1333
int64_t GetBlockTimeMax() const
Definition: chain.h:271
virtual bool findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
virtual void waitForNotificationsIfTipChanged(const uint256 &old_tip)=0
Wait for pending notifications to be processed unless block hash points to the current chain tip...
uint256 hashMerkleRoot
Definition: chain.h:188
TransactionError BroadcastTransaction(NodeContext &node, const CTransactionRef tx, std::string &err_string, const CAmount &max_tx_fee, bool relay, bool wait_callback)
Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
Definition: transaction.cpp:34
NodeContext * m_context
Definition: interfaces.cpp:429
virtual void requestMempoolTransactions(Notifications &notifications)=0
Synchronously send transactionAddedToMempool notifications about all current mempool transactions to ...
Network
A network type.
Definition: netaddress.h:32
std::optional< int > GetPruneHeight(const BlockManager &blockman, const CChain &chain)
Return height of highest block that has been pruned, or std::nullopt if no blocks have been pruned...
Definition: blockchain.cpp:814
static CService ip(uint32_t i)
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
Definition: merkle.cpp:66
Block and header tip information.
Definition: node.h:50
int64_t NodeId
Definition: net.h:97
virtual std::optional< CAmount > calculateCombinedBumpFee(const std::vector< COutPoint > &outpoints, const CFeeRate &target_feerate)=0
Calculate the combined bump fee for an input set per the same strategy.
#define WAIT_LOCK(cs, name)
Definition: sync.h:262
static bool Enumerate(const std::string &command, std::vector< ExternalSigner > &signers, const std::string chain)
Obtain a list of signers.
virtual std::vector< uint256 > getCoinbaseMerklePath()=0
Compute merkle path to the coinbase transaction.
std::shared_ptr< NotificationsProxy > m_proxy
Definition: interfaces.cpp:501
virtual std::vector< unsigned char > getCoinbaseCommitment()=0
Invalid wallet specified.
Definition: protocol.h:80
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:28
constexpr bool IsNull() const
Definition: uint256.h:48
virtual BlockRef waitTipChanged(uint256 current_tip, MillisecondsDouble timeout=MillisecondsDouble::max())=0
Waits for the connected tip to change.
Wallet chain client that in addition to having chain client methods for starting up, shutting down, and registering RPCs, also has additional methods (called by the GUI) to load and create wallets.
Definition: wallet.h:327
bool IsDeprecatedRPCEnabled(const std::string &method)
Definition: server.cpp:341
virtual bool isInitialBlockDownload()=0
Returns whether IBD is still in progress.
bool isNull() const
Definition: univalue.h:79
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
Definition: sync.h:301
int64_t GetMedianTimePast() const
Definition: chain.h:278
virtual std::unique_ptr< BlockTemplate > createNewBlock(const node::BlockCreateOptions &options={})=0
Construct a new block template.
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
Definition: coin.cpp:12
External signer interface used by the GUI.
Definition: node.h:60
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
Set the factory function for timer, but only, if unset.
Definition: server.cpp:546
std::unordered_set< Element, ByteVectorHash > ElementSet
Definition: blockfilter.h:32
virtual void initWarning(const bilingual_str &message)=0
Send init warning.
Definition: messages.h:20
Definition: netbase.h:58
Generic interface for managing an event handler or callback function registered with another interfac...
Definition: handler.h:22
int flags
Definition: bitcoin-tx.cpp:536
virtual node::NodeContext * context()
Get internal node context.
Definition: chain.h:388
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
Definition: policy.h:64
Network address.
Definition: netaddress.h:111
int32_t nVersion
block header
Definition: chain.h:187
256-bit opaque blob.
Definition: uint256.h:201
virtual bool isReadyToBroadcast()=0
Check if the node is ready to broadcast transactions.
virtual node::NodeContext * context()
Get internal node context.
Definition: mining.h:98
#define EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: threadsafety.h:49
std::unique_ptr< Chain > MakeChain(node::NodeContext &node)
Return implementation of Chain interface.
Shutdown(node)
void StopRPC()
Definition: server.cpp:297
CategoryMask GetCategoryMask() const
Definition: logging.h:296
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const
Write settings file or backup settings file.
Definition: args.cpp:425
const auto command
auto result
Definition: common-types.h:74
bool AppInitParameterInteraction(const ArgsManager &args)
Initialization: parameter interaction.
Definition: init.cpp:896
void RegisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Register subscriber.
virtual bool findAncestorByHash(const uint256 &block_hash, const uint256 &ancestor_hash, const FoundBlock &ancestor_out={})=0
Return whether block descends from a specified ancestor, and optionally return ancestor information...
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
Definition: chain.h:128
void SetNull()
Definition: block.h:95
The block chain is a tree shaped structure starting with the genesis block at the root...
Definition: chain.h:140
const CChainParams & Params()
Return the currently selected parameters.
static transaction_identifier FromUint256(const uint256 &id)
bool ShutdownRequested(node::NodeContext &node)
Return whether node shutdown was requested.
Definition: init.cpp:246
#define LogError(...)
Definition: logging.h:358
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
Definition: args.cpp:457
virtual std::optional< BlockRef > getTip()=0
Returns the hash and height for the tip of this chain.
virtual std::vector< int64_t > getTxSigops()=0
std::string URI
Definition: request.h:42
int64_t * m_time
Definition: chain.h:67
uint64_t CategoryMask
Definition: logging.h:63
virtual void initMessage(const std::string &message)=0
Send init message.
virtual std::map< COutPoint, CAmount > calculateIndividualBumpFees(const std::vector< COutPoint > &outpoints, const CFeeRate &target_feerate)=0
For each outpoint, calculate the fee-bumping cost to spend this outpoint at the specified.
virtual void ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator)
Notifies listeners of the new active block chain on-disk.
bool AppInitSanityChecks(const kernel::Context &kernel)
Initialization sanity checks.
Definition: init.cpp:1137
int exit_status
std::unique_ptr< Mining > MakeMining(node::NodeContext &node)
Return implementation of Mining interface.
const CTransactionRef m_tx
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
Definition: feerate.h:32
virtual RBFTransactionState isRBFOptIn(const CTransaction &tx)=0
Check if transaction is RBF opt in.
bool * m_in_active_chain
Definition: chain.h:70
virtual bool hasBlocks(const uint256 &block_hash, int min_height=0, std::optional< int > max_height={})=0
Return true if data is available for all blocks in the specified range of blocks. ...
virtual void showProgress(const std::string &title, int progress, bool resume_possible)=0
Send progress indicator.
virtual void BlockConnected(ChainstateRole role, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being connected.
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
Definition: interfaces.cpp:47
std::map< CSubNet, CBanEntry > banmap_t
Definition: net_types.h:41
Wrapper around std::unique_lock style lock for MutexType.
Definition: sync.h:151
virtual unsigned int estimateMaxBlocks()=0
Fee estimator max target.
CBlockLocator GetLocator(const CBlockIndex *index)
Get a locator for a block index entry.
Definition: chain.cpp:50
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
Definition: settings.h:38
virtual bool shutdownRequested()=0
Check if shutdown requested.
bool AppInitInterfaces(NodeContext &node)
Initialize node and wallet interface pointers.
Definition: init.cpp:1168
interfaces::BlockInfo MakeBlockInfo(const CBlockIndex *index, const CBlock *data)
Return data from block index.
Definition: chain.cpp:14
virtual void disconnect()=0
Disconnect the handler.
virtual bool broadcastTransaction(const CTransactionRef &tx, const CAmount &max_tx_fee, bool relay, std::string &err_string)=0
Transaction is added to memory pool, if the transaction fee is below the amount specified by max_tx_f...
The basic transaction that is broadcasted on the network and contained in blocks. ...
Definition: transaction.h:295
int nHeight
height of the entry in the chain. The genesis block has height 0
Definition: chain.h:153
virtual util::Result< void > checkChainLimits(const CTransactionRef &tx)=0
Check if transaction will pass the mempool&#39;s chain limits.
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
Definition: chain.cpp:120
virtual CBlockLocator getTipLocator()=0
Get locator for the current chain tip.
void LockSettings(Fn &&fn)
Access settings with lock held.
Definition: args.h:413
full block available in blk*.dat
Definition: chain.h:121
virtual CBlock getBlock()=0
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block&#39;s coinbase transaction the witness commitment occurs, or -1 if not found.
Definition: validation.h:148
is a home for public enum and struct type definitions that are used internally by node code...
virtual bool isTestChain()=0
If this chain is exclusively used for testing.
ValidationSignals & m_signals
Definition: interfaces.cpp:500
virtual bool rpcEnableDeprecated(const std::string &method)=0
Check if deprecated RPC is enabled.
std::vector< std::string > listCommands() const
Returns a list of registered commands.
Definition: server.cpp:521
virtual common::SettingsValue getRwSetting(const std::string &name)=0
Return <datadir>/settings.json setting value.
const std::unique_ptr< CBlockTemplate > m_block_template
Definition: interfaces.cpp:945
ConnectionDirection
Definition: netbase.h:33
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
Definition: string.h:192
Definition: musig.c:30
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
Definition: cs_main.cpp:8
virtual void initError(const bilingual_str &message)=0
Send init error.
Top-level interface for a bitcoin node (bitcoind process).
Definition: node.h:70
virtual CFeeRate relayIncrementalFee()=0
Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay.
LockPoints lp
virtual CFeeRate relayMinFee()=0
Relay current minimum fee (from -minrelaytxfee and -incrementalrelayfee settings).
void UnregisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Unregister subscriber.
unsigned int nTx
Number of transactions in this block.
Definition: chain.h:170
Nodes collect new transactions into a block, hash them into a hash tree, and scan through nonce value...
Definition: block.h:21
std::unique_ptr< ChainstateManager > chainman
Definition: context.h:72
static GenTxid Txid(const uint256 &hash)
Definition: transaction.h:434
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
Definition: init.cpp:715
virtual bool havePruned()=0
Check if any block has been pruned.
#define Assert(val)
Identity function.
Definition: check.h:85
std::shared_ptr< Chain::Notifications > m_notifications
Definition: interfaces.cpp:481
auto FindKey(Map &&map, Key &&key) -> decltype(&map.at(key))
Map lookup helper.
Definition: settings.h:107
virtual std::optional< bool > blockFilterMatchesAny(BlockFilterType filter_type, const uint256 &block_hash, const GCSFilter::ElementSet &filter_set)=0
Returns whether any of the elements match the block via a BIP 157 block filter or std::nullopt if the...