7#include <blockfilter.h>
9#include <chainparams.h>
65#include <bitcoin-build-config.h>
72#include <boost/signals2/signal.hpp>
92#ifdef ENABLE_EXTERNAL_SIGNER
102class NodeImpl :
public Node
105 explicit NodeImpl(NodeContext& context) { setContext(&context); }
109 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
111 bool baseInitialize()
override
116 m_context->warnings = std::make_unique<node::Warnings>();
117 m_context->kernel = std::make_unique<kernel::Context>();
118 m_context->ecc_context = std::make_unique<ECC_Context>();
130 m_context->exit_status.store(EXIT_FAILURE);
133 void appShutdown()
override
138 void startShutdown()
override
141 if (!(
Assert(ctx.shutdown_request))()) {
142 LogError(
"Failed to send shutdown signal\n");
146 if (
args().GetBoolArg(
"-server",
false)) {
152 bool isSettingIgnored(
const std::string&
name)
override
154 bool ignored =
false;
157 ignored = !options->empty();
167 settings.rw_settings.erase(name);
169 settings.rw_settings[name] = value;
178 settings.forced_settings.erase(name);
180 settings.forced_settings[name] = value;
184 void resetSettings()
override
192 void mapPort(
bool enable)
override {
StartMapPort(enable); }
198 bool getNodesStats(NodesStats& stats)
override
203 std::vector<CNodeStats> stats_temp;
204 m_context->connman->GetNodeStats(stats_temp);
206 stats.reserve(stats_temp.size());
207 for (
auto& node_stats_temp : stats_temp) {
208 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
215 for (
auto& node_stats : stats) {
216 std::get<1>(node_stats) =
217 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
225 bool getBanned(
banmap_t& banmap)
override
233 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
236 m_context->banman->Ban(net_addr, ban_time_offset);
249 bool disconnectByAddress(
const CNetAddr& net_addr)
override
252 return m_context->connman->DisconnectNode(net_addr);
256 bool disconnectById(
NodeId id)
override
259 return m_context->connman->DisconnectNode(
id);
263 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
265#ifdef ENABLE_EXTERNAL_SIGNER
266 std::vector<ExternalSigner> signers = {};
270 std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
271 result.reserve(signers.size());
272 for (
auto&
signer : signers) {
273 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
286 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
287 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
288 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
289 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
290 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
291 bool getHeaderTip(
int& height, int64_t& block_time)
override
294 auto best_header = chainman().m_best_header;
296 height = best_header->nHeight;
297 block_time = best_header->GetBlockTime();
302 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
305 return m_context->connman->getNetLocalAddresses();
309 int getNumBlocks()
override
312 return chainman().ActiveChain().Height();
314 uint256 getBestBlockHash()
override
317 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
319 int64_t getLastBlockTime()
override
322 if (chainman().ActiveChain().Tip()) {
323 return chainman().ActiveChain().Tip()->GetBlockTime();
325 return chainman().GetParams().GenesisBlock().GetBlockTime();
327 double getVerificationProgress()
override
329 return chainman().GuessVerificationProgress(
WITH_LOCK(chainman().GetMutex(),
return chainman().ActiveChain().Tip()));
331 bool isInitialBlockDownload()
override
333 return chainman().IsInitialBlockDownload();
335 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
336 void setNetworkActive(
bool active)
override
339 m_context->connman->SetNetworkActive(active);
342 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
346 return m_context->mempool->m_opts.dust_relay_feerate;
360 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
363 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
373 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
377 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
381 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
385 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
389 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
393 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
397 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
401 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
405 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
409 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
413 chainman().GuessVerificationProgress(block));
416 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
423 NodeContext* context()
override {
return m_context; }
424 void setContext(NodeContext* context)
override
436 if (!index)
return false;
456 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
458 virtual ~NotificationsProxy() =
default;
471 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
485class NotificationsHandlerImpl :
public Handler
488 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
489 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
493 ~NotificationsHandlerImpl()
override { disconnect(); }
494 void disconnect()
override
505class RpcHandlerImpl :
public Handler
530 void disconnect() final
538 ~RpcHandlerImpl()
override { disconnect(); }
544class ChainImpl :
public Chain
548 std::optional<int> getHeight()
override
551 return height >= 0 ? std::optional{height} : std::nullopt;
553 uint256 getBlockHash(
int height)
override
556 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
558 bool haveBlockOnDisk(
int height)
override
561 const CBlockIndex* block{chainman().ActiveChain()[height]};
567 return chainman().ActiveChain().GetLocator();
572 const CBlockIndex* index = chainman().m_blockman.LookupBlockIndex(block_hash);
575 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
578 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
579 return fork->nHeight;
590 if (!block_filter_index)
return std::nullopt;
594 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
600 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
602 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
605 const CChain& active = chainman().ActiveChain();
606 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
608 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
611 const CChain& active = chainman().ActiveChain();
612 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
613 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
614 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
617 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
619 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
622 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
623 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
624 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
625 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
630 const CChain& active = chainman().ActiveChain();
631 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
632 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
637 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
638 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
639 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
641 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
642 double guessVerificationProgress(
const uint256& block_hash)
override
644 LOCK(chainman().GetMutex());
645 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
647 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
657 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
658 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
661 if (block->
nHeight <= min_height || !block->
pprev)
return true;
672 bool isInMempool(
const uint256& txid)
override
674 if (!
m_node.mempool)
return false;
678 bool hasDescendantsInMempool(
const uint256& txid)
override
680 if (!
m_node.mempool)
return false;
683 if (entry ==
nullptr)
return false;
684 return entry->GetCountWithDescendants() > 1;
689 std::string& err_string)
override
697 void getTransactionAncestry(
const uint256& txid,
size_t& ancestors,
size_t& descendants,
size_t* ancestorsize,
CAmount* ancestorfees)
override
699 ancestors = descendants = 0;
700 if (!
m_node.mempool)
return;
701 m_node.mempool->GetTransactionAncestry(txid, ancestors, descendants, ancestorsize, ancestorfees);
704 std::map<COutPoint, CAmount> calculateIndividualBumpFees(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
707 std::map<COutPoint, CAmount> bump_fees;
708 for (
const auto& outpoint : outpoints) {
709 bump_fees.emplace(outpoint, 0);
713 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
716 std::optional<CAmount> calculateCombinedBumpFee(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
721 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
723 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
729 limit_ancestor_count = limits.ancestor_count;
730 limit_descendant_count = limits.descendant_count;
734 if (!
m_node.mempool)
return {};
738 return m_node.mempool->CheckPackageLimits({tx}, entry.GetTxSize());
742 if (!
m_node.fee_estimator)
return {};
743 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
745 unsigned int estimateMaxBlocks()
override
747 if (!
m_node.fee_estimator)
return 0;
752 if (!
m_node.mempool)
return {};
753 return m_node.mempool->GetMinFee();
758 return m_node.mempool->m_opts.min_relay_feerate;
760 CFeeRate relayIncrementalFee()
override
763 return m_node.mempool->m_opts.incremental_relay_feerate;
768 return m_node.mempool->m_opts.dust_relay_feerate;
770 bool havePruned()
override
773 return chainman().m_blockman.m_have_pruned;
775 std::optional<int> getPruneHeight()
override
777 LOCK(chainman().GetMutex());
778 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
780 bool isReadyToBroadcast()
override {
return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
781 bool isInitialBlockDownload()
override
783 return chainman().IsInitialBlockDownload();
786 void initMessage(
const std::string& message)
override {
::uiInterface.InitMessage(message); }
789 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
791 ::uiInterface.ShowProgress(title, progress, resume_possible);
793 std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications)
override
795 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
797 void waitForNotificationsIfTipChanged(
const uint256& old_tip)
override
799 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
800 validation_signals().SyncWithValidationInterfaceQueue();
804 return std::make_unique<RpcHandlerImpl>(
command);
807 void rpcRunLater(
const std::string&
name, std::function<
void()> fn, int64_t seconds)
override
815 std::vector<common::SettingsValue> getSettingsList(
const std::string&
name)
override
829 bool updateRwSetting(
const std::string&
name,
832 std::optional<interfaces::SettingsAction> action;
835 action = update_settings_func(*value);
836 if (value->isNull()) settings.rw_settings.erase(name);
839 action = update_settings_func(new_value);
840 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
843 if (!action)
return false;
850 settings = std::move(value);
856 return overwriteRwSetting(
name, {}, action);
858 void requestMempoolTransactions(Notifications& notifications)
override
860 if (!
m_node.mempool)
return;
863 notifications.transactionAddedToMempool(entry.GetSharedTx());
866 bool hasAssumedValidChain()
override
868 return chainman().IsSnapshotActive();
871 NodeContext* context()
override {
return &
m_node; }
881 explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
882 std::unique_ptr<CBlockTemplate> block_template,
895 CBlock getBlock()
override
900 std::vector<CAmount> getTxFees()
override
905 std::vector<int64_t> getTxSigops()
override
915 std::vector<unsigned char> getCoinbaseCommitment()
override
920 int getWitnessCommitmentIndex()
override
925 std::vector<uint256> getCoinbaseMerklePath()
override
930 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
934 if (block.vtx.size() == 0) {
935 block.vtx.push_back(coinbase);
937 block.vtx[0] = coinbase;
941 block.
nTime = timestamp;
946 auto block_ptr = std::make_shared<const CBlock>(block);
947 return chainman().ProcessNewBlock(block_ptr,
true,
true,
nullptr);
959 const auto deadline = now + options.
timeout;
961 const bool allow_min_difficulty{chainman().GetParams().GetConsensus().fPowAllowMinDifficultyBlocks};
964 bool tip_changed{
false};
966 WAIT_LOCK(notifications().m_tip_block_mutex, lock);
968 notifications().m_tip_block_cv.wait_until(lock, std::min(now + tick, deadline), [&]()
EXCLUSIVE_LOCKS_REQUIRED(notifications().m_tip_block_mutex) {
970 const auto tip_block{notifications().TipBlock()};
975 return tip_changed || chainman().m_interrupt;
979 if (chainman().m_interrupt)
return nullptr;
987 if (!tip_changed && allow_min_difficulty) {
988 const NodeClock::time_point tip_time{std::chrono::seconds{chainman().ActiveChain().Tip()->GetBlockTime()}};
989 if (now > tip_time + 20min) {
1005 chainman().ActiveChainstate(),
1006 context()->mempool.get(),
1012 if (tip_changed)
return tmpl;
1015 if (current_fees == -1) {
1019 if (
fee < 0)
continue;
1020 current_fees +=
fee;
1025 for (
CAmount fee : tmpl->m_block_template->vTxFees) {
1027 if (
fee < 0)
continue;
1030 if (new_fees >= current_fees + options.
fee_threshold)
return tmpl;
1035 }
while (now < deadline);
1044 NodeContext* context() {
return &
m_node; }
1046 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
1050class MinerImpl :
public Mining
1055 bool isTestChain()
override
1057 return chainman().GetParams().IsTestChain();
1060 bool isInitialBlockDownload()
override
1062 return chainman().IsInitialBlockDownload();
1065 std::optional<BlockRef>
getTip()
override
1069 if (!tip)
return {};
1075 if (timeout > std::chrono::years{100}) timeout = std::chrono::years{100};
1077 WAIT_LOCK(notifications().m_tip_block_mutex, lock);
1078 notifications().m_tip_block_cv.wait_for(lock, timeout, [&]()
EXCLUSIVE_LOCKS_REQUIRED(notifications().m_tip_block_mutex) {
1081 return (notifications().
TipBlock() && notifications().
TipBlock() != current_tip) || chainman().m_interrupt;
1086 return BlockRef{chainman().ActiveChain().Tip()->GetBlockHash(), chainman().ActiveChain().Tip()->nHeight};
1089 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options)
override
1091 BlockAssembler::Options assemble_options{options};
1093 return std::make_unique<BlockTemplateImpl>(assemble_options,
BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.
CreateNewBlock(),
m_node);
1096 NodeContext* context()
override {
return &
m_node; }
1098 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
static constexpr CAmount MAX_MONEY
No amount larger than this (in satoshi) is valid.
int64_t CAmount
Amount in satoshis (Can be negative)
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.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
CBlockLocator GetLocator(const CBlockIndex *index)
Get a locator for a block index entry.
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the last common ancestor two blocks have.
@ BLOCK_HAVE_DATA
full block available in blk*.dat
const CChainParams & Params()
Return the currently selected parameters.
#define Assert(val)
Identity function.
#define Assume(val)
Assume is the identity function.
common::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
void LockSettings(Fn &&fn)
Access settings with lock held.
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const
Write settings file or backup settings file.
std::vector< common::SettingsValue > GetSettingsList(const std::string &arg) const
Get list of setting values.
common::SettingsValue GetPersistentSetting(const std::string &name) const
Get current setting from config file or read/write settings file, ignoring nonpersistent command line...
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
CategoryMask GetCategoryMask() const
Complete block filter struct as defined in BIP 157.
const GCSFilter & GetFilter() const LIFETIMEBOUND
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
The block chain is a tree shaped structure starting with the genesis block at the root,...
CBlockIndex * pprev
pointer to the index of the predecessor of this block
uint256 GetBlockHash() const
int64_t GetBlockTime() const
int64_t GetMedianTimePast() const
int64_t GetBlockTimeMax() const
unsigned int nTx
Number of transactions in this block.
int32_t nVersion
block header
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
int nHeight
height of the entry in the chain. The genesis block has height 0
An in-memory indexed chain of blocks.
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...
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
An outpoint - a combination of a transaction hash and an index n into its vout.
bool removeCommand(const std::string &name, const CRPCCommand *pcmd)
std::vector< std::string > listCommands() const
Returns a list of registered commands.
UniValue execute(const JSONRPCRequest &request) const
Execute a method.
void appendCommand(const std::string &name, const CRPCCommand *pcmd)
Appends a CRPCCommand to the dispatch table.
The basic transaction that is broadcasted on the network and contained in blocks.
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
Implement this to subscribe to events generated in validation and mempool.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
Enables interaction with an external signing device or service, such as a hardware wallet.
std::string m_name
Name of signer.
static bool Enumerate(const std::string &command, std::vector< ExternalSigner > &signers, const std::string chain)
Obtain a list of signers.
std::unordered_set< Element, ByteVectorHash > ElementSet
bool MatchAny(const ElementSet &elements) const
Checks if any of the given elements may be in the set.
static GenTxid Txid(const uint256 &hash)
Wrapper around std::unique_lock style lock for MutexType.
void RegisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Register subscriber.
void UnregisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Unregister subscriber.
constexpr bool IsNull() const
Block template interface.
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
External signer interface used by the GUI.
Helper for findBlock to selectively return pieces of block data.
const FoundBlock * m_next_block
CBlockLocator * m_locator
Generic interface for managing an event handler or callback function registered with another interfac...
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
Top-level interface for a bitcoin node (bitcoind process).
Wallet chain client that in addition to having chain client methods for starting up,...
Generate a new block, without valid proof-of-work.
std::unique_ptr< CBlockTemplate > CreateNewBlock()
Construct a new block template.
static transaction_identifier FromUint256(const uint256 &id)
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block's coinbase transaction the witness commitment occurs,...
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
static CService ip(uint32_t i)
void InitLogging(const ArgsManager &args)
Initialize global loggers.
bool AppInitBasicSetup(const ArgsManager &args, std::atomic< int > &exit_status)
Initialize bitcoin core: Basic context setup.
bool ShutdownRequested(node::NodeContext &node)
Return whether node shutdown was requested.
bool AppInitParameterInteraction(const ArgsManager &args)
Initialization: parameter interaction.
bool AppInitInterfaces(NodeContext &node)
Initialize node and wallet interface pointers.
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
bool AppInitMain(NodeContext &node, interfaces::BlockAndHeaderTipInfo *tip_info)
Bitcoin core main initialization.
bool AppInitLockDirectories()
Lock bitcoin core critical directories.
bool AppInitSanityChecks(const kernel::Context &kernel)
Initialization sanity checks.
CClientUIInterface uiInterface
void InitWarning(const bilingual_str &str)
Show warning message.
bool InitError(const bilingual_str &str)
Show error message.
ChainstateRole
This enum describes the various roles a specific Chainstate instance can take.
BCLog::Logger & LogInstance()
void StartMapPort(bool enable)
MemPoolRemovalReason
Reason why a transaction was removed from the mempool, this is passed to the notification signal.
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
auto FindKey(Map &&map, Key &&key) -> decltype(&map.at(key))
Map lookup helper.
std::unique_ptr< Node > MakeNode(node::NodeContext &context)
Return implementation of Node interface.
std::unique_ptr< Mining > MakeMining(node::NodeContext &node)
Return implementation of Mining interface.
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
SettingsAction
The action to be taken after updating a settings value.
std::unique_ptr< Chain > MakeChain(node::NodeContext &node)
Return implementation of Chain interface.
std::function< std::optional< interfaces::SettingsAction >(common::SettingsValue &)> SettingsUpdate
interfaces::BlockInfo MakeBlockInfo(const CBlockIndex *index, const CBlock *data)
Return data from block index.
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
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.
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
std::map< CSubNet, CBanEntry > banmap_t
bool GetProxy(enum Network net, Proxy &proxyInfoOut)
ValidationSignals & m_signals
::ExternalSigner m_signer
const BlockAssembler::Options m_assemble_options
std::shared_ptr< Chain::Notifications > m_notifications
const CRPCCommand * m_wrapped_command
const std::unique_ptr< CBlockTemplate > m_block_template
std::shared_ptr< NotificationsProxy > m_proxy
is a home for public enum and struct type definitions that are used internally by node code,...
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
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...
RBFTransactionState
The rbf state of unconfirmed transactions.
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE
Default for -minrelaytxfee, minimum relay fee for transactions.
std::shared_ptr< const CTransaction > CTransactionRef
@ RPC_WALLET_NOT_FOUND
Invalid wallet specified.
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
Set the factory function for timer, but only, if unset.
bool IsDeprecatedRPCEnabled(const std::string &method)
void RPCUnsetTimerInterface(RPCTimerInterface *iface)
Unset factory function for timers.
void RPCRunLater(const std::string &name, std::function< void()> func, int64_t nSeconds)
Run func nSeconds from now.
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
static time_point now() noexcept
Return current system time or mocked time, if set.
std::chrono::time_point< NodeClock > time_point
const CTransactionRef m_tx
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
std::map< std::string, std::vector< SettingsValue > > command_line_options
Map of setting name to list of command line values.
Block and header tip information.
Hash/height pair to help track and identify blocks.
Block tip (could be a header or not, depends on the subscribed signal).
Options struct containing limit options for a CTxMemPool.
MillisecondsDouble timeout
How long to wait before returning nullptr instead of a new template.
CAmount fee_threshold
The wait method will not return a new template unless it has fees at least fee_threshold sats higher ...
NodeContext struct containing references to chain state and connection state.
#define WAIT_LOCK(cs, name)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define TRY_LOCK(cs, name)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
SynchronizationState
Current sync state passed to tip changed callbacks.
TipBlock getTip(const CChainParams ¶ms, const node::NodeContext &context)