45#include <validation.h>
49#if defined(HAVE_CONFIG_H)
58#include <boost/signals2/signal.hpp>
70class NodeImpl :
public Node
75 explicit NodeImpl(
NodeContext& context) { setContext(&context); }
80 bool baseInitialize()
override
89 void appShutdown()
override
94 void startShutdown()
override
104 void mapPort(
bool use_upnp,
bool use_natpmp)
override {
StartMapPort(use_upnp, use_natpmp); }
110 bool getNodesStats(NodesStats& stats)
override
115 std::vector<CNodeStats> stats_temp;
118 stats.reserve(stats_temp.size());
119 for (
auto& node_stats_temp : stats_temp) {
120 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
127 for (
auto& node_stats : stats) {
128 std::get<1>(node_stats) =
129 m_context->
peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
137 bool getBanned(
banmap_t& banmap)
override
145 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
161 bool disconnectByAddress(
const CNetAddr& net_addr)
override
168 bool disconnectById(
NodeId id)
override
175 std::vector<ExternalSigner> externalSigners()
override
177#ifdef ENABLE_EXTERNAL_SIGNER
178 std::vector<ExternalSigner> signers = {};
179 const std::string command =
gArgs.
GetArg(
"-signer",
"");
180 if (command ==
"")
return signers;
197 bool getHeaderTip(
int& height, int64_t& block_time)
override
207 int getNumBlocks()
override
210 return chainman().ActiveChain().Height();
212 uint256 getBestBlockHash()
override
217 int64_t getLastBlockTime()
override
220 if (chainman().ActiveChain().Tip()) {
221 return chainman().ActiveChain().Tip()->GetBlockTime();
225 double getVerificationProgress()
override
230 tip = chainman().ActiveChain().Tip();
234 bool isInitialBlockDownload()
override {
235 return chainman().ActiveChainstate().IsInitialBlockDownload();
239 void setNetworkActive(
bool active)
override
247 UniValue executeRpc(
const std::string& command,
const UniValue& params,
const std::string& uri)
override
259 bool getUnspentOutput(
const COutPoint& output,
Coin& coin)
override
262 return chainman().ActiveChainstate().CoinsTip().GetCoin(output, coin);
268 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
272 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
276 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
280 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
284 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
288 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
292 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
296 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
300 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
303 fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()},
307 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
311 fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()},
325 if (!index)
return false;
344 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
346 virtual ~NotificationsProxy() =
default;
353 m_notifications->transactionRemovedFromMempool(tx, reason, mempool_sequence);
371class NotificationsHandlerImpl :
public Handler
374 explicit NotificationsHandlerImpl(std::shared_ptr<Chain::Notifications> notifications)
375 :
m_proxy(std::make_shared<NotificationsProxy>(std::move(notifications)))
379 ~NotificationsHandlerImpl()
override {
disconnect(); }
390class RpcHandlerImpl :
public Handler
429class ChainImpl :
public Chain
439 int height = active.
Height();
469 return CheckFinalTx(chainman().ActiveChain().Tip(), tx);
476 return fork->nHeight;
484 return FillBlock(
m_node.
chainman->m_blockman.LookupBlockIndex(hash), block, lock, active);
497 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
498 return FillBlock(ancestor, ancestor_out, lock, active);
501 return FillBlock(
nullptr, ancestor_out, lock, active);
509 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
510 return FillBlock(ancestor, ancestor_out, lock, active);
521 return FillBlock(ancestor, ancestor_out, lock, active) & FillBlock(block1, block1_out, lock, active) & FillBlock(block2, block2_out, lock, active);
529 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
539 if (
CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
540 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
543 if (block->
nHeight <= min_height || !block->
pprev)
return true;
565 return it && (*it)->GetCountWithDescendants() > 1;
570 std::string& err_string)
override
580 ancestors = descendants = 0;
582 m_node.
mempool->GetTransactionAncestry(txid, ancestors, descendants, ancestorsize, ancestorfees);
584 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
599 std::string unused_error_string;
602 entry, ancestors, limit_ancestor_count, limit_ancestor_size,
603 limit_descendant_count, limit_descendant_size, unused_error_string);
630 return chainman().ActiveChainstate().IsInitialBlockDownload();
637 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
639 ::uiInterface.ShowProgress(title, progress, resume_possible);
641 std::unique_ptr<Handler>
handleNotifications(std::shared_ptr<Notifications> notifications)
override
643 return std::make_unique<NotificationsHandlerImpl>(std::move(notifications));
656 return std::make_unique<RpcHandlerImpl>(command);
659 void rpcRunLater(
const std::string&
name, std::function<
void()> fn, int64_t seconds)
override
686 settings.rw_settings.erase(name);
688 settings.rw_settings[name] = value;
698 notifications.transactionAddedToMempool(entry.
GetSharedTx(), 0 );
int64_t CAmount
Amount in satoshis (Can be negative)
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
bool fHavePruned
Pruning-related variables and constants.
bool ReadBlockFromDisk(CBlock &block, const FlatFilePos &pos, const Consensus::Params &consensusParams)
Functions for disk access for blocks.
std::atomic_bool fReindex
std::atomic_bool fImporting
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.
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr) const
Write settings file.
void LockSettings(Fn &&fn)
Access settings with lock held.
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
std::vector< util::SettingsValue > GetSettingsList(const std::string &arg) const
Get list of setting values.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
util::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
bool GetBoolArg(const std::string &strArg, bool fDefault) const
Return boolean argument or default value.
uint32_t GetCategoryMask() const
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.
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
uint32_t nStatus
Verification status of this block.
An in-memory indexed chain of blocks.
CBlockIndex * Tip() const
Returns the index entry for the tip of this chain, or nullptr if none.
CBlockLocator GetLocator(const CBlockIndex *pindex=nullptr) const
Return a CBlockLocator that refers to a block in this chain (by default the tip).
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...
int Height() const
Return the maximal height in the chain.
const CBlock & GenesisBlock() const
Fee rate in satoshis per kilobyte: CAmount / kB.
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...
CTransactionRef GetSharedTx() const
std::set< txiter, CompareIteratorByHash > setEntries
Implement this to subscribe to events generated in validation.
virtual void TransactionAddedToMempool(const CTransactionRef &tx, uint64_t mempool_sequence)
Notifies listeners of a transaction having been added to mempool.
virtual void ChainStateFlushed(const CBlockLocator &locator)
Notifies listeners of the new active block chain on-disk.
virtual void TransactionRemovedFromMempool(const CTransactionRef &tx, MemPoolRemovalReason reason, uint64_t mempool_sequence)
Notifies listeners of a transaction leaving mempool.
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
Notifies listeners when the block chain tip advances.
virtual void BlockConnected(const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being connected.
virtual void BlockDisconnected(const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being disconnected.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
static bool Enumerate(const std::string &command, std::vector< ExternalSigner > &signers, const std::string chain)
Obtain a list of signers.
static GenTxid Txid(const uint256 &hash)
Wrapper around std::unique_lock style lock for Mutex.
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
virtual void rpcRunLater(const std::string &name, std::function< void()> fn, int64_t seconds)=0
Run function after given number of seconds. Cancel any previous calls with same name.
virtual std::unique_ptr< Handler > handleRpc(const CRPCCommand &command)=0
Register handler for RPC.
virtual CBlockLocator getTipLocator()=0
Get locator for the current chain tip.
virtual bool isInitialBlockDownload()=0
Check if in IBD.
virtual bool hasDescendantsInMempool(const uint256 &txid)=0
Check if transaction has descendants in mempool.
virtual std::optional< int > getHeight()=0
Get current chain height, not including genesis block (returns 0 if chain only contains genesis block...
virtual bool rpcEnableDeprecated(const std::string &method)=0
Check if deprecated RPC is enabled.
virtual int rpcSerializationFlags()=0
Current RPC serialization flags.
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 std::unique_ptr< Handler > handleNotifications(std::shared_ptr< Notifications > notifications)=0
Register handler for notifications.
virtual RBFTransactionState isRBFOptIn(const CTransaction &tx)=0
Check if transaction is RBF opt in.
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 bool updateRwSetting(const std::string &name, const util::SettingsValue &value, bool write=true)=0
Write a setting to <datadir>/settings.json.
virtual uint256 getBlockHash(int height)=0
Get block hash. Height must be valid or this function will abort.
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,...
virtual util::SettingsValue getRwSetting(const std::string &name)=0
Return <datadir>/settings.json setting value.
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.
virtual void showProgress(const std::string &title, int progress, bool resume_possible)=0
Send progress indicator.
virtual bool havePruned()=0
Check if any block has been pruned.
virtual void findCoins(std::map< COutPoint, Coin > &coins)=0
Look up unspent output information.
virtual bool shutdownRequested()=0
Check if shutdown requested.
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 bool isReadyToBroadcast()=0
Check if the node is ready to broadcast transactions.
virtual int64_t getAdjustedTime()=0
Get adjusted time.
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 util::SettingsValue getSetting(const std::string &arg)=0
Get settings value.
virtual bool findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
virtual bool isTaprootActive()=0
Check if Taproot has activated.
virtual double guessVerificationProgress(const uint256 &block_hash)=0
Estimate fraction of total transactions verified if blocks up to the specified block hash are verifie...
virtual void waitForNotificationsIfTipChanged(const uint256 &old_tip)=0
Wait for pending notifications to be processed unless block hash points to the current chain tip.
virtual CFeeRate mempoolMinFee()=0
Mempool minimum fee.
virtual void initMessage(const std::string &message)=0
Send init message.
virtual bool isInMempool(const uint256 &txid)=0
Check if transaction is in mempool.
virtual unsigned int estimateMaxBlocks()=0
Fee estimator max target.
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...
virtual void getPackageLimits(unsigned int &limit_ancestor_count, unsigned int &limit_descendant_count)=0
Get the node's package limits.
virtual bool checkChainLimits(const CTransactionRef &tx)=0
Check if transaction will pass the mempool's chain limits.
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...
virtual bool haveBlockOnDisk(int height)=0
Check that the block is available on disk (i.e.
virtual CFeeRate relayDustFee()=0
Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend.
virtual void requestMempoolTransactions(Notifications ¬ifications)=0
Synchronously send transactionAddedToMempool notifications about all current mempool transactions to ...
virtual void initError(const bilingual_str &message)=0
Send init error.
virtual bool checkFinalTx(const CTransaction &tx)=0
Check if transaction will be final given chain height current time.
virtual std::vector< util::SettingsValue > getSettingsList(const std::string &arg)=0
Get list of settings values.
virtual void initWarning(const bilingual_str &message)=0
Send init warning.
virtual CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation *calc=nullptr)=0
Estimate smart fee.
virtual CFeeRate relayMinFee()=0
Relay current minimum fee (from -minrelaytxfee and -incrementalrelayfee settings).
virtual CFeeRate relayIncrementalFee()=0
Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay.
Helper for findBlock to selectively return pieces of block data.
const FoundBlock * m_next_block
Generic interface for managing an event handler or callback function registered with another interfac...
virtual void disconnect()=0
Disconnect the handler.
Top-level interface for a bitcoin node (bitcoind process).
Wallet chain client that in addition to having chain client methods for starting up,...
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
static CService ip(uint32_t i)
bool DeploymentActiveAfter(const CBlockIndex *pindexPrev, const Consensus::Params ¶ms, Consensus::BuriedDeployment dep)
Determine if a deployment is active for the next block.
void Interrupt(NodeContext &node)
Interrupt threads.
void InitLogging(const ArgsManager &args)
Initialize global loggers.
bool AppInitLockDataDirectory()
Lock bitcoin core data directory.
void Shutdown(NodeContext &node)
bool AppInitBasicSetup(const ArgsManager &args)
Initialize bitcoin core: Basic context setup.
bool AppInitSanityChecks()
Initialization sanity checks: ecc init, sanity checks, dir lock.
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.
BCLog::Logger & LogInstance()
void StartMapPort(bool use_upnp, bool use_natpmp)
std::unique_ptr< Chain > MakeChain(NodeContext &node)
Return implementation of Chain interface.
std::unique_ptr< Handler > MakeHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
std::unique_ptr< Node > MakeNode(NodeContext &context)
Return implementation of Node interface.
auto FindKey(Map &&map, Key &&key) -> decltype(&map.at(key))
Map lookup helper.
std::map< CSubNet, CBanEntry > banmap_t
bool GetProxy(enum Network net, proxyType &proxyInfoOut)
std::shared_ptr< Chain::Notifications > m_notifications
const CRPCCommand * m_wrapped_command
std::shared_ptr< NotificationsProxy > m_proxy
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.
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.
CFeeRate incrementalRelayFee
static const unsigned int DEFAULT_MAX_MEMPOOL_SIZE
Default for -maxmempool, maximum megabytes of mempool memory usage.
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.
int RPCSerializationFlags()
bool ShutdownRequested()
Returns true if a shutdown is requested, false otherwise.
void StartShutdown()
Request shutdown of the application.
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
NodeContext struct containing references to chain state and connection state.
std::unique_ptr< PeerManager > peerman
std::unique_ptr< ChainstateManager > chainman
std::unique_ptr< CBlockPolicyEstimator > fee_estimator
std::unique_ptr< CTxMemPool > mempool
std::unique_ptr< BanMan > banman
interfaces::WalletClient * wallet_client
Reference to chain client that should used to load or create wallets opened by the gui.
std::unique_ptr< CConnman > connman
Block and header tip information.
Block tip (could be a header or not, depends on the subscribed signal).
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
#define WAIT_LOCK(cs, name)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define TRY_LOCK(cs, name)
int64_t GetAdjustedTime()
MemPoolRemovalReason
Reason why a transaction was removed from the mempool, this is passed to the notification signal.
CClientUIInterface uiInterface
void InitWarning(const bilingual_str &str)
Show warning message.
bool InitError(const bilingual_str &str)
Show error message.
double GuessVerificationProgress(const ChainTxData &data, const CBlockIndex *pindex)
Guess how far we are in the verification process at the given block index require cs_main if pindex h...
CFeeRate minRelayTxFee
A fee rate smaller than this is considered zero fee (for relaying, mining and transaction creation)
bool CheckFinalTx(const CBlockIndex *active_chain_tip, const CTransaction &tx, int flags)
Transaction validation functions.
CBlockIndex * pindexBestHeader
Best header we've seen so far (used for getheaders queries' starting points).
static const unsigned int DEFAULT_DESCENDANT_LIMIT
Default for -limitdescendantcount, max number of in-mempool descendants.
static const unsigned int DEFAULT_DESCENDANT_SIZE_LIMIT
Default for -limitdescendantsize, maximum kilobytes of in-mempool descendants.
SynchronizationState
Current sync state passed to tip changed callbacks.
static const unsigned int DEFAULT_ANCESTOR_SIZE_LIMIT
Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors.
static const unsigned int DEFAULT_ANCESTOR_LIMIT
Default for -limitancestorcount, max number of in-mempool ancestors.
void UnregisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Unregister subscriber.
void SyncWithValidationInterfaceQueue()
This is a synonym for the following, which asserts certain locks are not held: std::promise<void> pro...
void RegisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Register subscriber.
bilingual_str GetWarnings(bool verbose)
Format a string that describes several potential problems detected by the core.