5#include <bitcoin-build-config.h>
8#include <blockfilter.h>
11#include <chainparams.h>
74#include <condition_variable>
108#ifdef ENABLE_EXTERNAL_SIGNER
118class NodeImpl :
public Node
121 explicit NodeImpl(NodeContext& context) { setContext(&context); }
125 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
127 bool baseInitialize()
override
132 m_context->warnings = std::make_unique<node::Warnings>();
133 m_context->kernel = std::make_unique<kernel::Context>();
134 m_context->ecc_context = std::make_unique<ECC_Context>();
146 m_context->exit_status.store(EXIT_FAILURE);
149 void appShutdown()
override
153 void startShutdown()
override
156 if (!(
Assert(ctx.shutdown_request))()) {
157 LogError(
"Failed to send shutdown signal\n");
162 bool isSettingIgnored(
const std::string&
name)
override
164 bool ignored =
false;
167 ignored = !options->empty();
177 settings.rw_settings.erase(name);
179 settings.rw_settings[name] = value;
188 settings.forced_settings.erase(name);
190 settings.forced_settings[name] = value;
194 void resetSettings()
override
202 void mapPort(
bool enable)
override {
StartMapPort(enable); }
203 std::optional<Proxy> getProxy(
Network net)
override {
return GetProxy(net); }
208 bool getNodesStats(NodesStats& stats)
override
213 std::vector<CNodeStats> stats_temp;
214 m_context->connman->GetNodeStats(stats_temp);
216 stats.reserve(stats_temp.size());
217 for (
auto& node_stats_temp : stats_temp) {
218 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
225 for (
auto& node_stats : stats) {
226 std::get<1>(node_stats) =
227 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
235 bool getBanned(
banmap_t& banmap)
override
243 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
246 m_context->banman->Ban(net_addr, ban_time_offset);
259 bool disconnectByAddress(
const CNetAddr& net_addr)
override
262 return m_context->connman->DisconnectNode(net_addr);
266 bool disconnectById(
NodeId id)
override
269 return m_context->connman->DisconnectNode(
id);
273 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
275#ifdef ENABLE_EXTERNAL_SIGNER
276 std::vector<ExternalSigner> signers = {};
280 std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
281 result.reserve(signers.size());
282 for (
auto&
signer : signers) {
283 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
296 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
297 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
298 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
299 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
300 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
301 bool getHeaderTip(
int& height, int64_t& block_time)
override
304 auto best_header = chainman().m_best_header;
306 height = best_header->nHeight;
307 block_time = best_header->GetBlockTime();
312 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
315 return m_context->connman->getNetLocalAddresses();
319 int getNumBlocks()
override
322 return chainman().ActiveChain().Height();
324 uint256 getBestBlockHash()
override
327 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
329 int64_t getLastBlockTime()
override
332 if (chainman().ActiveChain().Tip()) {
333 return chainman().ActiveChain().Tip()->GetBlockTime();
335 return chainman().GetParams().GenesisBlock().GetBlockTime();
337 double getVerificationProgress()
override
339 LOCK(chainman().GetMutex());
340 return chainman().GuessVerificationProgress(chainman().ActiveTip());
342 bool isInitialBlockDownload()
override
344 return chainman().IsInitialBlockDownload();
346 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
347 void setNetworkActive(
bool active)
override
350 m_context->connman->SetNetworkActive(active);
353 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
357 return m_context->mempool->m_opts.dust_relay_feerate;
369 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
372 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
387 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
391 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
395 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
399 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
403 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
407 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
411 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
415 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
419 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
423 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
429 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
436 NodeContext* context()
override {
return m_context; }
437 void setContext(NodeContext* context)
override
449 if (!index)
return false;
450 if (block.m_hash) *block.m_hash = index->
GetBlockHash();
451 if (block.m_height) *block.m_height = index->
nHeight;
452 if (block.m_time) *block.m_time = index->
GetBlockTime();
455 if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
456 if (block.m_locator) { *block.m_locator =
GetLocator(index); }
457 if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] :
nullptr, *block.m_next_block, lock, active, blockman);
460 if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
469 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
471 virtual ~NotificationsProxy() =
default;
480 void BlockConnected(
const ChainstateRole& role,
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
484 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
499class NotificationsHandlerImpl :
public Handler
502 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
503 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
507 ~NotificationsHandlerImpl()
override { disconnect(); }
508 void disconnect()
override
519class RpcHandlerImpl :
public Handler
544 void disconnect() final
552 ~RpcHandlerImpl()
override { disconnect(); }
558class ChainImpl :
public Chain
562 std::optional<int> getHeight()
override
565 return height >= 0 ? std::optional{height} : std::nullopt;
567 uint256 getBlockHash(
int height)
override
570 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
572 bool haveBlockOnDisk(
int height)
override
575 const CBlockIndex* block{chainman().ActiveChain()[height]};
578 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
581 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
582 return fork->nHeight;
593 if (!block_filter_index)
return std::nullopt;
597 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
603 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
605 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
608 const CChain& active = chainman().ActiveChain();
609 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
611 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
614 const CChain& active = chainman().ActiveChain();
615 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
616 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
617 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
620 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
622 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
625 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
626 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
627 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
628 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
633 const CChain& active = chainman().ActiveChain();
634 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
635 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
640 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
641 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
642 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
644 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
645 double guessVerificationProgress(
const uint256& block_hash)
override
647 LOCK(chainman().GetMutex());
648 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
650 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
660 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
661 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
664 if (block->
nHeight <= min_height || !block->
pprev)
return true;
675 bool isInMempool(
const Txid& txid)
override
677 if (!
m_node.mempool)
return false;
678 return m_node.mempool->exists(txid);
680 bool hasDescendantsInMempool(
const Txid& txid)
override
682 if (!
m_node.mempool)
return false;
683 return m_node.mempool->HasDescendants(txid);
688 std::string& err_string)
override
696 void getTransactionAncestry(
const Txid& txid,
size_t& ancestors,
size_t& cluster_count,
size_t* ancestorsize,
CAmount* ancestorfees)
override
698 ancestors = cluster_count = 0;
699 if (!
m_node.mempool)
return;
700 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, 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 {};
734 if (!
m_node.mempool->CheckPolicyLimits(tx)) {
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();
801 void waitForNotifications()
override
803 validation_signals().SyncWithValidationInterfaceQueue();
807 return std::make_unique<RpcHandlerImpl>(
command);
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
868 return bool{chainman().CurrentChainstate().m_from_snapshot_blockhash};
871 NodeContext* context()
override {
return &
m_node; }
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<uint256> getCoinbaseMerklePath()
override
920 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
937 if (new_template)
return std::make_unique<BlockTemplateImpl>(
m_create_options, std::move(new_template),
m_node);
941 void interruptWait()
override
952 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
953 const NodeContext&
m_node;
956class MinerImpl :
public Mining
961 bool isTestChain()
override
963 return chainman().GetParams().IsTestChain();
966 bool isInitialBlockDownload()
override
968 return chainman().IsInitialBlockDownload();
971 std::optional<BlockRef>
getTip()
override
973 return GetTip(chainman());
981 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options,
bool cooldown)
override
984 std::optional<BlockRef> maybe_tip{waitTipChanged(
uint256::ZERO, MillisecondsDouble::max())};
986 if (!maybe_tip)
return {};
994 while (chainman().IsInitialBlockDownload()) {
1003 return std::make_unique<BlockTemplateImpl>(create_options,
1005 chainman().ActiveChainstate(),
1012 void interrupt()
override
1019 LOCK(chainman().GetMutex());
1022 debug = state.GetDebugMessage();
1023 return state.IsValid();
1026 bool submitBlock(
const CBlock& block_in, std::string& reason, std::string& debug)
override
1028 auto block = std::make_shared<const CBlock>(block_in);
1030 const bool accepted =
SubmitBlock(chainman(), block, &new_block, reason, debug);
1034 return accepted && new_block && reason.empty();
1037 const NodeContext* context()
override {
return &
m_node; }
1039 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
1042 const NodeContext&
m_node;
1045class RpcImpl :
public Rpc
1050 UniValue executeRpc(
UniValue request, std::string uri, std::string user)
override
1054 req.
URI = std::move(uri);
1075 return kernel_notifications.m_state.chainstate_loaded || interrupt;
1077 if (interrupt)
return nullptr;
1079 return std::make_unique<node::MinerImpl>(context);
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.
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 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
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
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 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.
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.
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.
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).
Interface giving clients ability to emulate HTTP RPC calls.
Wallet chain client that in addition to having chain client methods for starting up,...
Generate a new block, without valid proof-of-work.
static const uint256 ZERO
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.
std::optional< BlockRef > WaitTipChanged(ChainstateManager &chainman, KernelNotifications &kernel_notifications, const uint256 ¤t_tip, MillisecondsDouble &timeout, bool &interrupt)
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.
bool SubmitBlock(ChainstateManager &chainman, const std::shared_ptr< const CBlock > &block, bool *new_block, std::string &reason, std::string &debug)
Submit a block and capture the validation state via the BlockChecked callback.
BlockCreateOptions MergeMiningOptions(BlockCreateOptions x, const BlockCreateOptions &y)
Merge two BlockCreateOptions structs, replacing null values in x with non-null values from y.
TransactionError BroadcastTransaction(NodeContext &node, const CTransactionRef tx, std::string &err_string, const CAmount &max_tx_fee, TxBroadcast broadcast_method, bool wait_callback)
Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
void InterruptWait(KernelNotifications &kernel_notifications, bool &interrupt_wait)
std::unique_ptr< CBlockTemplate > WaitAndCreateNewBlock(ChainstateManager &chainman, KernelNotifications &kernel_notifications, CTxMemPool *mempool, const std::unique_ptr< CBlockTemplate > &block_template, const BlockWaitOptions &wait_options, const BlockCreateOptions &create_options, bool &interrupt_wait)
Return a new block template when fees rise to a certain threshold or after a new tip; return nullopt ...
void AddMerkleRootAndCoinbase(CBlock &block, CTransactionRef coinbase, uint32_t version, uint32_t timestamp, uint32_t nonce)
bool CooldownIfHeadersAhead(ChainstateManager &chainman, KernelNotifications &kernel_notifications, const BlockRef &last_tip, bool &interrupt_mining)
Wait while the best known header extends the current chain tip AND at least one block is being added ...
std::optional< BlockRef > GetTip(ChainstateManager &chainman)
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.
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
HTTPStatusCode
HTTP status codes.
@ RPC_WALLET_NOT_FOUND
Invalid wallet specified.
bool IsDeprecatedRPCEnabled(const std::string &method)
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< KernelNotifications > notifications
Issues blocking calls about sync status, errors and warnings.
util::SignalInterrupt * shutdown_signal
Interrupt object used to track whether node shutdown was requested.
#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.
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.
TipBlock getTip(const CChainParams ¶ms, const node::NodeContext &context)