5#include <bitcoin-build-config.h>
8#include <blockfilter.h>
10#include <chainparams.h>
76#include <condition_variable>
109#ifdef ENABLE_EXTERNAL_SIGNER
119class NodeImpl :
public Node
126 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
128 bool baseInitialize()
override
133 m_context->warnings = std::make_unique<node::Warnings>();
134 m_context->kernel = std::make_unique<kernel::Context>();
135 m_context->ecc_context = std::make_unique<ECC_Context>();
147 m_context->exit_status.store(EXIT_FAILURE);
150 void appShutdown()
override
154 void startShutdown()
override
157 if (!(
Assert(ctx.shutdown_request))()) {
158 LogError(
"Failed to send shutdown signal\n");
163 bool isSettingIgnored(
const std::string&
name)
override
165 bool ignored =
false;
168 ignored = !options->empty();
178 settings.rw_settings.erase(name);
180 settings.rw_settings[name] = value;
189 settings.forced_settings.erase(name);
191 settings.forced_settings[name] = value;
195 void resetSettings()
override
203 void mapPort(
bool enable)
override {
StartMapPort(enable); }
204 std::optional<Proxy> getProxy(
Network net)
override {
return GetProxy(net); }
209 bool getNodesStats(NodesStats& stats)
override
214 std::vector<CNodeStats> stats_temp;
215 m_context->connman->GetNodeStats(stats_temp);
217 stats.reserve(stats_temp.size());
218 for (
auto& node_stats_temp : stats_temp) {
219 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
226 for (
auto& node_stats : stats) {
227 std::get<1>(node_stats) =
228 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
236 bool getBanned(
banmap_t& banmap)
override
244 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
247 m_context->banman->Ban(net_addr, ban_time_offset);
260 bool disconnectByAddress(
const CNetAddr& net_addr)
override
263 return m_context->connman->DisconnectNode(net_addr);
267 bool disconnectById(
NodeId id)
override
270 return m_context->connman->DisconnectNode(
id);
274 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
276#ifdef ENABLE_EXTERNAL_SIGNER
277 std::vector<ExternalSigner> signers = {};
281 std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
282 result.reserve(signers.size());
283 for (
auto&
signer : signers) {
284 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
297 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
298 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
299 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
300 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
301 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
302 bool getHeaderTip(
int& height, int64_t& block_time)
override
305 auto best_header = chainman().m_best_header;
307 height = best_header->nHeight;
308 block_time = best_header->GetBlockTime();
313 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
316 return m_context->connman->getNetLocalAddresses();
320 int getNumBlocks()
override
323 return chainman().ActiveChain().Height();
325 uint256 getBestBlockHash()
override
328 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
330 int64_t getLastBlockTime()
override
333 if (chainman().ActiveChain().Tip()) {
334 return chainman().ActiveChain().Tip()->GetBlockTime();
336 return chainman().GetParams().GenesisBlock().GetBlockTime();
338 double getVerificationProgress()
override
340 LOCK(chainman().GetMutex());
341 return chainman().GuessVerificationProgress(chainman().ActiveTip());
343 bool isInitialBlockDownload()
override
345 return chainman().IsInitialBlockDownload();
347 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
348 void setNetworkActive(
bool active)
override
351 m_context->connman->SetNetworkActive(active);
354 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
358 return m_context->mempool->m_opts.dust_relay_feerate;
370 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
373 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
383 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
387 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
391 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
395 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
399 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
403 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
407 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
411 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
415 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
419 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
422 fn(sync_state, BlockTip{block.nHeight, block.GetBlockTime(), block.GetBlockHash()}, verification_progress);
425 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
429 fn(sync_state, BlockTip{(int)height, timestamp, uint256{}}, presync);
433 void setContext(NodeContext*
context)
override
445 if (!index)
return false;
446 if (block.m_hash) *block.m_hash = index->GetBlockHash();
447 if (block.m_height) *block.m_height = index->nHeight;
448 if (block.m_time) *block.m_time = index->GetBlockTime();
449 if (block.m_max_time) *block.m_max_time = index->GetBlockTimeMax();
450 if (block.m_mtp_time) *block.m_mtp_time = index->GetMedianTimePast();
451 if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
452 if (block.m_locator) { *block.m_locator =
GetLocator(index); }
453 if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] :
nullptr, *block.m_next_block, lock, active, blockman);
456 if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
465 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
467 virtual ~NotificationsProxy() =
default;
495class NotificationsHandlerImpl :
public Handler
498 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
499 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
503 ~NotificationsHandlerImpl()
override {
disconnect(); }
515class RpcHandlerImpl :
public Handler
554class ChainImpl :
public Chain
561 return height >= 0 ? std::optional{height} : std::nullopt;
566 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
571 const CBlockIndex* block{chainman().ActiveChain()[height]};
577 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
578 return fork->nHeight;
589 if (!block_filter_index)
return std::nullopt;
593 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
599 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
604 const CChain& active = chainman().ActiveChain();
605 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
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);
616 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
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);
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);
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)};
643 LOCK(chainman().GetMutex());
644 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
646 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
656 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
657 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
660 if (block->
nHeight <= min_height || !block->
pprev)
return true;
673 if (!
m_node.mempool)
return false;
674 return m_node.mempool->exists(txid);
678 if (!
m_node.mempool)
return false;
679 return m_node.mempool->HasDescendants(txid);
685 std::string& err_string)
override
691 return TransactionError::OK == err;
695 ancestors = cluster_count = 0;
696 if (!
m_node.mempool)
return;
697 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, ancestorsize, ancestorfees);
703 std::map<COutPoint, CAmount> bump_fees;
704 for (
const auto& outpoint : outpoints) {
705 bump_fees.emplace(outpoint, 0);
709 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
717 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
719 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
725 limit_ancestor_count = limits.ancestor_count;
726 limit_descendant_count = limits.descendant_count;
730 if (!
m_node.mempool)
return {};
731 if (!
m_node.mempool->CheckPolicyLimits(tx)) {
739 return m_node.fee_estimator_man->GetFeeRateEstimate(num_blocks, conservative);
743 if (!
m_node.fee_estimator_man)
return 0;
744 return m_node.fee_estimator_man->MaximumTarget();
748 if (!
m_node.mempool)
return {};
749 return m_node.mempool->GetMinFee();
754 return m_node.mempool->m_opts.min_relay_feerate;
759 return m_node.mempool->m_opts.incremental_relay_feerate;
764 return m_node.mempool->m_opts.dust_relay_feerate;
769 return chainman().m_blockman.m_have_pruned;
773 LOCK(chainman().GetMutex());
774 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
779 return chainman().IsInitialBlockDownload();
785 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
789 std::unique_ptr<Handler>
handleNotifications(std::shared_ptr<Notifications> notifications)
override
791 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
795 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
796 validation_signals().SyncWithValidationInterfaceQueue();
800 validation_signals().SyncWithValidationInterfaceQueue();
804 return std::make_unique<RpcHandlerImpl>(
command);
828 std::optional<interfaces::SettingsAction> action;
831 action = update_settings_func(*value);
832 if (value->isNull()) settings.rw_settings.erase(name);
835 action = update_settings_func(new_value);
836 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
839 if (!action)
return false;
846 settings = std::move(value);
856 if (!
m_node.mempool)
return;
859 notifications.transactionAddedToMempool(entry.GetSharedTx());
865 return bool{chainman().CurrentChainstate().m_from_snapshot_blockhash};
879 std::unique_ptr<CBlockTemplate> block_template,
897 std::vector<CAmount>
getTxFees()
override
919 if (!coinbase)
return false;
921 return block_template_manager().SubmitBlock(std::make_shared<const CBlock>(
m_block_template->block), reason, debug);
926 auto new_template = block_template_manager().WaitAndCreateNewBlock(
928 if (new_template)
return std::make_unique<BlockTemplateImpl>(
m_create_options, std::move(new_template),
m_node);
943 const NodeContext&
m_node;
946class MinerImpl :
public Mining
953 return chainman().GetParams().IsTestChain();
958 return chainman().IsInitialBlockDownload();
961 std::optional<BlockRef>
getTip()
override
963 return block_template_manager().GetTip();
968 return block_template_manager().WaitTipChanged(current_tip, timeout,
m_interrupt_mining);
976 if (!maybe_tip)
return {};
984 while (chainman().IsInitialBlockDownload()) {
990 if (!block_template_manager().CooldownIfHeadersAhead(*maybe_tip,
m_interrupt_mining))
return {};
992 auto new_template = block_template_manager().CreateNewTemplate(options);
993 return std::make_unique<BlockTemplateImpl>(options, std::move(new_template),
m_node);
1003 LOCK(chainman().GetMutex());
1006 debug = state.GetDebugMessage();
1007 return state.IsValid();
1010 bool submitBlock(
const CBlock& block_in, std::string& reason, std::string& debug)
override
1012 return block_template_manager().SubmitBlock(std::make_shared<const CBlock>(block_in), reason, debug);
1017 if (!
m_node.mempool)
return {};
1019 std::vector<CTransactionRef> results;
1020 results.reserve(txids.size());
1022 for (
const auto& txid : txids) {
1023 results.emplace_back(
m_node.mempool->get(txid));
1030 if (!
m_node.mempool)
return {};
1032 std::vector<CTransactionRef> results;
1033 results.reserve(wtxids.size());
1035 for (
const auto& wtxid : wtxids) {
1036 results.emplace_back(
m_node.mempool->get(wtxid));
1043 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
1047 const NodeContext&
m_node;
1050class RpcImpl :
public Rpc
1059 req.
URI = std::move(uri);
1080 return kernel_notifications.m_state.chainstate_loaded || interrupt;
1082 if (interrupt)
return nullptr;
1084 return std::make_unique<node::MinerImpl>(
context);
int64_t CAmount
Amount in satoshis (Can be negative)
static bool ThreadSafeMessageBox(BitcoinGUI *gui, const bilingual_str &message, unsigned int style)
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.
std::vector< common::SettingsValue > GetSettingsList(const std::string &arg) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get list of setting values.
common::SettingsValue GetSetting(const std::string &arg) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get setting value.
bool GetSettingsPath(fs::path *filepath=nullptr, bool temp=false, bool backup=false) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Get settings file path, or return false if read-write settings were disabled with -nosettings.
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Write settings file or backup settings file.
void LockSettings(Fn &&fn) EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
Access settings with lock held.
common::SettingsValue GetPersistentSetting(const std::string &name) const EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
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 EXCLUSIVE_LOCKS_REQUIRED(!cs_args)
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
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
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...
btcsignals::signal< void(const std::string &message)> InitMessage
Progress message during initialization.
btcsignals::signal< void(const std::string &title, int nProgress, bool resume_possible)> ShowProgress
Show progress e.g.
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac.
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.
virtual void ChainStateFlushed(const kernel::ChainstateRole &role, 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 TransactionAddedToMempool(const NewMempoolTransactionInfo &tx, uint64_t mempool_sequence)
Notifies listeners of a transaction having been added to mempool.
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.
virtual void BlockConnected(const kernel::ChainstateRole &role, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being connected.
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Enables interaction with an external signing device or service, such as a hardware wallet.
static bool Enumerate(const std::string &command, std::vector< ExternalSigner > &signers, const std::string &chain)
Obtain a list of signers.
std::string m_name
Name of signer.
std::unordered_set< Element, ByteVectorHash > ElementSet
bool MatchAny(const ElementSet &elements) const
Checks if any of the given elements may be in the set.
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.
std::string GetRejectReason() const
constexpr bool IsNull() const
Block template interface.
virtual std::vector< int64_t > getTxSigops()=0
virtual bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t nonce, CTransactionRef coinbase, std::string &reason, std::string &debug)=0
Construct and broadcast the block.
virtual std::vector< CAmount > getTxFees()=0
virtual node::CoinbaseTx getCoinbaseTx()=0
Return fields needed to construct a coinbase transaction.
virtual std::vector< uint256 > getCoinbaseMerklePath()=0
Compute merkle path to the coinbase transaction.
virtual std::unique_ptr< BlockTemplate > waitNext(node::BlockWaitOptions options={})=0
Waits for fees in the next block to rise, a new tip or the timeout.
virtual void interruptWait()=0
Interrupts the current wait for the next block template.
virtual CBlock getBlock()=0
virtual CBlockHeader getBlockHeader()=0
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
virtual std::unique_ptr< Handler > handleRpc(const CRPCCommand &command)=0
Register handler for RPC.
virtual bool isInitialBlockDownload()=0
Check if in IBD.
virtual std::optional< int > getHeight()=0
Get current chain height, not including genesis block (returns 0 if chain only contains genesis block...
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...
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.
virtual util::Expected< FeeRateEstimation, FeeRateEstimationError > getFeeRateEstimate(int num_blocks, bool conservative) const =0
Estimate a fee rate.
virtual bool broadcastTransaction(const CTransactionRef &tx, const CAmount &max_tx_fee, const CFeeRate &max_tx_fee_rate, node::TxBroadcast broadcast_method, std::string &err_string)=0
Process a local transaction, optionally adding it to the mempool and optionally broadcasting it to th...
virtual bool rpcEnableDeprecated(const std::string &method)=0
Check if deprecated RPC is enabled.
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 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 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 node::NodeContext * context()
Get internal node context.
virtual bool deleteRwSettings(const std::string &name, SettingsAction action=SettingsAction::WRITE)=0
Delete a given setting in <datadir>/settings.json.
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 bool updateRwSetting(const std::string &name, const SettingsUpdate &update_function)=0
Updates a setting in <datadir>/settings.json.
virtual void findCoins(std::map< COutPoint, Coin > &coins)=0
Look up unspent output information.
virtual bool shutdownRequested()=0
Check if shutdown requested.
virtual bool hasBlockFilterIndex(BlockFilterType filter_type)=0
Returns whether a block filter index is available.
virtual common::SettingsValue getRwSetting(const std::string &name)=0
Return <datadir>/settings.json setting value.
virtual bool hasDescendantsInMempool(const Txid &txid)=0
Check if transaction has descendants in mempool.
virtual void waitForNotifications()=0
Wait for all pending notifications up to this point to be processed.
virtual common::SettingsValue getSetting(const std::string &arg)=0
Get settings value.
virtual bool isReadyToBroadcast()=0
Check if the node is ready to broadcast transactions.
virtual bool hasAssumedValidChain()=0
Return true if an assumed-valid snapshot is in use.
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.
virtual bool isInMempool(const Txid &txid)=0
Check if transaction is in mempool.
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 findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
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 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 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 void getPackageLimits(unsigned int &limit_ancestor_count, unsigned int &limit_descendant_count)=0
Get the node's package 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 unsigned int maximumFeeEstimationTargetBlocks() const =0
Fee estimator max target.
virtual util::Result< void > checkChainLimits(const CTransactionRef &tx)=0
Check if transaction will pass the mempool's chain limits.
virtual void getTransactionAncestry(const Txid &txid, size_t &ancestors, size_t &cluster_count, size_t *ancestorsize=nullptr, CAmount *ancestorfees=nullptr)=0
Calculate mempool ancestor and cluster counts for the given transaction.
virtual std::vector< common::SettingsValue > getSettingsList(const std::string &arg)=0
Get list of settings values.
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 void initWarning(const bilingual_str &message)=0
Send init warning.
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.
virtual std::optional< int > getPruneHeight()=0
Get the current prune height.
External signer interface used by the GUI.
Helper for findBlock to selectively return pieces of block data.
Generic interface for managing an event handler or callback function registered with another interfac...
virtual void disconnect()=0
Disconnect the handler.
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
virtual bool submitBlock(const CBlock &block, std::string &reason, std::string &debug)=0
Process a fully assembled block.
virtual bool checkBlock(const CBlock &block, const node::BlockCheckOptions &options, std::string &reason, std::string &debug)=0
Checks if a given block is valid.
virtual std::optional< BlockRef > waitTipChanged(uint256 current_tip, MillisecondsDouble timeout=MillisecondsDouble::max())=0
Waits for the connected tip to change.
virtual bool isInitialBlockDownload()=0
Returns whether IBD is still in progress.
virtual const node::NodeContext * context()
Get internal node context.
virtual std::vector< CTransactionRef > getTransactionsByTxID(const std::vector< Txid > &txids)=0
Fetch raw transactions from the mempool by txid.
virtual void interrupt()=0
Interrupts createNewBlock and waitTipChanged.
virtual std::optional< BlockRef > getTip()=0
Returns the hash and height for the tip of this chain.
virtual bool isTestChain()=0
If this chain is exclusively used for testing.
virtual std::vector< CTransactionRef > getTransactionsByWitnessID(const std::vector< Wtxid > &wtxids)=0
Fetch raw transactions from the mempool by wtxid.
virtual std::unique_ptr< BlockTemplate > createNewBlock(const node::BlockCreateOptions &options={}, bool cooldown=true)=0
Construct a new block template.
Top-level interface for a bitcoin node (bitcoind process).
Interface giving clients ability to emulate HTTP RPC calls.
virtual UniValue executeRpc(UniValue request, std::string url, std::string user)=0
Wallet chain client that in addition to having chain client methods for starting up,...
Creates block templates, submits solved blocks, and provides tip-waiting helpers for mining code.
static const uint256 ZERO
The util::Expected class provides a standard way for low-level functions to return either error value...
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
static CService ip(uint32_t i)
UniValue ExecuteHTTPRPC(const UniValue &valRequest, JSONRPCRequest &jreq, HTTPStatusCode &status)
Execute a single HTTP request containing one or more JSONRPC requests.
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.
BCLog::Logger & LogInstance()
void StartMapPort(bool enable)
MemPoolRemovalReason
Reason why a transaction was removed from the mempool, this is passed to the notification signal.
is used externally by mining IPC clients, so it should only declare simple data definitions.
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< Rpc > MakeRpc(node::NodeContext &node)
Return implementation of Rpc interface.
std::unique_ptr< Mining > MakeMining(const node::NodeContext &node, bool wait_loaded=true)
Return implementation of Mining interface.
std::unique_ptr< Handler > MakeSignalHandler(btcsignals::connection connection)
Return handler wrapping a btcsignals 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, const CFeeRate &max_tx_fee_rate, TxBroadcast broadcast_method, bool wait_callback)
Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
TxBroadcast
How to broadcast a local transaction.
@ MEMPOOL_AND_BROADCAST_TO_ALL
Add the transaction to the mempool and broadcast to all peers for which tx relay is enabled.
void AddMerkleRootAndCoinbase(CBlock &block, CTransactionRef coinbase, uint32_t version, uint32_t timestamp, uint32_t nonce)
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
std::map< CSubNet, CBanEntry > banmap_t
std::optional< Proxy > GetProxy(enum Network net)
ValidationSignals & m_signals
::ExternalSigner m_signer
std::shared_ptr< Chain::Notifications > m_notifications
const BlockCreateOptions m_create_options
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.
constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE
Default for -minrelaytxfee, minimum relay fee for transactions.
std::shared_ptr< const CTransaction > CTransactionRef
HTTPStatusCode
HTTP status codes.
@ RPC_WALLET_NOT_FOUND
Invalid wallet specified.
bool IsDeprecatedRPCEnabled(const std::string &method)
static void ShowProgress(SplashScreen *splash, const std::string &title, int nProgress, bool resume_possible)
static void InitMessage(SplashScreen *splash, const std::string &message)
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
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).
Information about chainstate that notifications are sent from.
Options struct containing limit options for a CTxMemPool.
bool check_pow
Set false to omit the proof-of-work check.
bool check_merkle_root
Set false to omit the merkle root check.
Block template creation options.
Template containing all coinbase transaction fields that are set by our miner code.
NodeContext struct containing references to chain state and connection state.
std::unique_ptr< ChainstateManager > chainman
#define WAIT_LOCK(cs, name)
#define REVERSE_LOCK(g, cs)
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
#define TRY_LOCK(cs, name)
#define EXCLUSIVE_LOCKS_REQUIRED(...)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
util::Unexpected< FeeRateEstimationError > EstimationError(FeeRateEstimatorType estimator, int returned_target, std::string error)
Build a fee rate estimation error result: a zero-value estimation identifying the estimator and targe...
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
BlockValidationState TestBlockValidity(Chainstate &chainstate, const CBlock &block, const bool check_pow, const bool check_merkle_root)
Verify a block, including transactions.
SynchronizationState
Current sync state passed to tip changed callbacks.