7#include <blockfilter.h>
9#include <chainparams.h>
65#include <bitcoin-build-config.h>
72#include <boost/signals2/signal.hpp>
91#ifdef ENABLE_EXTERNAL_SIGNER
101class NodeImpl :
public Node
104 explicit NodeImpl(NodeContext& context) { setContext(&context); }
108 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
110 bool baseInitialize()
override
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>();
129 m_context->exit_status.store(EXIT_FAILURE);
132 void appShutdown()
override
137 void startShutdown()
override
140 if (!(
Assert(ctx.shutdown_request))()) {
141 LogError(
"Failed to send shutdown signal\n");
145 if (
args().GetBoolArg(
"-server",
false)) {
151 bool isSettingIgnored(
const std::string&
name)
override
153 bool ignored =
false;
156 ignored = !options->empty();
166 settings.rw_settings.erase(name);
168 settings.rw_settings[name] = value;
177 settings.forced_settings.erase(name);
179 settings.forced_settings[name] = value;
183 void resetSettings()
override
191 void mapPort(
bool enable)
override {
StartMapPort(enable); }
197 bool getNodesStats(NodesStats& stats)
override
202 std::vector<CNodeStats> stats_temp;
203 m_context->connman->GetNodeStats(stats_temp);
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());
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));
224 bool getBanned(
banmap_t& banmap)
override
232 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
235 m_context->banman->Ban(net_addr, ban_time_offset);
248 bool disconnectByAddress(
const CNetAddr& net_addr)
override
251 return m_context->connman->DisconnectNode(net_addr);
255 bool disconnectById(
NodeId id)
override
258 return m_context->connman->DisconnectNode(
id);
262 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
264#ifdef ENABLE_EXTERNAL_SIGNER
265 std::vector<ExternalSigner> signers = {};
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)));
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
293 auto best_header = chainman().m_best_header;
295 height = best_header->nHeight;
296 block_time = best_header->GetBlockTime();
301 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
304 return m_context->connman->getNetLocalAddresses();
308 int getNumBlocks()
override
311 return chainman().ActiveChain().Height();
313 uint256 getBestBlockHash()
override
316 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
318 int64_t getLastBlockTime()
override
321 if (chainman().ActiveChain().Tip()) {
322 return chainman().ActiveChain().Tip()->GetBlockTime();
324 return chainman().GetParams().GenesisBlock().GetBlockTime();
326 double getVerificationProgress()
override
328 return chainman().GuessVerificationProgress(
WITH_LOCK(chainman().GetMutex(),
return chainman().ActiveChain().Tip()));
330 bool isInitialBlockDownload()
override
332 return chainman().IsInitialBlockDownload();
334 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
335 void setNetworkActive(
bool active)
override
338 m_context->connman->SetNetworkActive(active);
341 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
345 return m_context->mempool->m_opts.dust_relay_feerate;
359 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
362 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
372 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
376 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
380 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
384 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
388 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
392 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
396 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
400 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
404 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
408 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
412 chainman().GuessVerificationProgress(block));
415 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
422 NodeContext* context()
override {
return m_context; }
423 void setContext(NodeContext* context)
override
435 if (!index)
return false;
455 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
457 virtual ~NotificationsProxy() =
default;
470 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
484class NotificationsHandlerImpl :
public Handler
487 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
488 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
492 ~NotificationsHandlerImpl()
override { disconnect(); }
493 void disconnect()
override
504class RpcHandlerImpl :
public Handler
529 void disconnect() final
537 ~RpcHandlerImpl()
override { disconnect(); }
543class ChainImpl :
public Chain
547 std::optional<int> getHeight()
override
550 return height >= 0 ? std::optional{height} : std::nullopt;
552 uint256 getBlockHash(
int height)
override
555 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
557 bool haveBlockOnDisk(
int height)
override
560 const CBlockIndex* block{chainman().ActiveChain()[height]};
566 return chainman().ActiveChain().GetLocator();
571 const CBlockIndex* index = chainman().m_blockman.LookupBlockIndex(block_hash);
574 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
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);
601 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
604 const CChain& active = chainman().ActiveChain();
605 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
607 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
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);
618 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
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)};
640 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
641 double guessVerificationProgress(
const uint256& block_hash)
override
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;
671 bool isInMempool(
const uint256& txid)
override
673 if (!
m_node.mempool)
return false;
677 bool hasDescendantsInMempool(
const uint256& txid)
override
679 if (!
m_node.mempool)
return false;
682 if (entry ==
nullptr)
return false;
683 return entry->GetCountWithDescendants() > 1;
688 std::string& err_string)
override
696 void getTransactionAncestry(
const uint256& txid,
size_t& ancestors,
size_t& descendants,
size_t* ancestorsize,
CAmount* ancestorfees)
override
698 ancestors = descendants = 0;
699 if (!
m_node.mempool)
return;
700 m_node.mempool->GetTransactionAncestry(txid, ancestors, descendants, ancestorsize, ancestorfees);
703 std::map<COutPoint, CAmount> calculateIndividualBumpFees(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
706 std::map<COutPoint, CAmount> bump_fees;
707 for (
const auto& outpoint : outpoints) {
708 bump_fees.emplace(outpoint, 0);
712 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
715 std::optional<CAmount> calculateCombinedBumpFee(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
720 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
722 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
728 limit_ancestor_count = limits.ancestor_count;
729 limit_descendant_count = limits.descendant_count;
733 if (!
m_node.mempool)
return {};
737 return m_node.mempool->CheckPackageLimits({tx}, entry.GetTxSize());
741 if (!
m_node.fee_estimator)
return {};
742 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
744 unsigned int estimateMaxBlocks()
override
746 if (!
m_node.fee_estimator)
return 0;
751 if (!
m_node.mempool)
return {};
752 return m_node.mempool->GetMinFee();
757 return m_node.mempool->m_opts.min_relay_feerate;
759 CFeeRate relayIncrementalFee()
override
762 return m_node.mempool->m_opts.incremental_relay_feerate;
767 return m_node.mempool->m_opts.dust_relay_feerate;
769 bool havePruned()
override
772 return chainman().m_blockman.m_have_pruned;
774 std::optional<int> getPruneHeight()
override
776 LOCK(chainman().GetMutex());
777 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
779 bool isReadyToBroadcast()
override {
return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
780 bool isInitialBlockDownload()
override
782 return chainman().IsInitialBlockDownload();
785 void initMessage(
const std::string& message)
override {
::uiInterface.InitMessage(message); }
788 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
790 ::uiInterface.ShowProgress(title, progress, resume_possible);
792 std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications)
override
794 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
796 void waitForNotificationsIfTipChanged(
const uint256& old_tip)
override
798 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
799 validation_signals().SyncWithValidationInterfaceQueue();
803 return std::make_unique<RpcHandlerImpl>(
command);
806 void rpcRunLater(
const std::string&
name, std::function<
void()> fn, int64_t seconds)
override
814 std::vector<common::SettingsValue> getSettingsList(
const std::string&
name)
override
828 bool updateRwSetting(
const std::string&
name,
831 std::optional<interfaces::SettingsAction> action;
834 action = update_settings_func(*value);
835 if (value->isNull()) settings.rw_settings.erase(name);
838 action = update_settings_func(new_value);
839 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
842 if (!action)
return false;
849 settings = std::move(value);
855 return overwriteRwSetting(
name, {}, action);
857 void requestMempoolTransactions(Notifications& notifications)
override
859 if (!
m_node.mempool)
return;
862 notifications.transactionAddedToMempool(entry.GetSharedTx());
865 bool hasAssumedValidChain()
override
867 return chainman().IsSnapshotActive();
870 NodeContext* context()
override {
return &
m_node; }
880 explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template, NodeContext&
node) :
m_block_template(std::move(block_template)),
m_node(
node)
890 CBlock getBlock()
override
895 std::vector<CAmount> getTxFees()
override
900 std::vector<int64_t> getTxSigops()
override
910 std::vector<unsigned char> getCoinbaseCommitment()
override
915 int getWitnessCommitmentIndex()
override
920 std::vector<uint256> getCoinbaseMerklePath()
override
925 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
929 if (block.vtx.size() == 0) {
930 block.vtx.push_back(coinbase);
932 block.vtx[0] = coinbase;
936 block.
nTime = timestamp;
941 auto block_ptr = std::make_shared<const CBlock>(block);
942 return chainman().ProcessNewBlock(block_ptr,
true,
true,
nullptr);
951class MinerImpl :
public Mining
956 bool isTestChain()
override
958 return chainman().GetParams().IsTestChain();
961 bool isInitialBlockDownload()
override
963 return chainman().IsInitialBlockDownload();
966 std::optional<BlockRef>
getTip()
override
976 if (timeout > std::chrono::years{100}) timeout = std::chrono::years{100};
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) {
982 return (notifications().
TipBlock() && notifications().
TipBlock() != current_tip) || chainman().m_interrupt;
987 return BlockRef{chainman().ActiveChain().Tip()->GetBlockHash(), chainman().ActiveChain().Tip()->nHeight};
990 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options)
override
992 BlockAssembler::Options assemble_options{options};
997 NodeContext* context()
override {
return &
m_node; }
999 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
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.
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
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...
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.
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)