7#include <blockfilter.h>
10#include <chainparams.h>
68#include <bitcoin-build-config.h>
97#ifdef ENABLE_EXTERNAL_SIGNER
107class NodeImpl :
public Node
110 explicit NodeImpl(NodeContext& context) { setContext(&context); }
114 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
116 bool baseInitialize()
override
121 m_context->warnings = std::make_unique<node::Warnings>();
122 m_context->kernel = std::make_unique<kernel::Context>();
123 m_context->ecc_context = std::make_unique<ECC_Context>();
135 m_context->exit_status.store(EXIT_FAILURE);
138 void appShutdown()
override
142 void startShutdown()
override
145 if (!(
Assert(ctx.shutdown_request))()) {
146 LogError(
"Failed to send shutdown signal\n");
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); }
192 std::optional<Proxy> getProxy(
Network net)
override {
return GetProxy(net); }
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 LOCK(chainman().GetMutex());
329 return chainman().GuessVerificationProgress(chainman().ActiveTip());
331 bool isInitialBlockDownload()
override
333 return chainman().IsInitialBlockDownload();
335 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
336 void setNetworkActive(
bool active)
override
339 m_context->connman->SetNetworkActive(active);
342 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
346 return m_context->mempool->m_opts.dust_relay_feerate;
358 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
361 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
376 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
380 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
384 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
388 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
392 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
396 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
400 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
404 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
408 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
412 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
418 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
425 NodeContext* context()
override {
return m_context; }
426 void setContext(NodeContext* context)
override
438 if (!index)
return false;
439 if (block.m_hash) *block.m_hash = index->
GetBlockHash();
440 if (block.m_height) *block.m_height = index->
nHeight;
441 if (block.m_time) *block.m_time = index->
GetBlockTime();
444 if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
445 if (block.m_locator) { *block.m_locator =
GetLocator(index); }
446 if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] :
nullptr, *block.m_next_block, lock, active, blockman);
449 if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
458 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
460 virtual ~NotificationsProxy() =
default;
469 void BlockConnected(
const ChainstateRole& role,
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
473 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
488class NotificationsHandlerImpl :
public Handler
491 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
492 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
496 ~NotificationsHandlerImpl()
override { disconnect(); }
497 void disconnect()
override
508class RpcHandlerImpl :
public Handler
533 void disconnect() final
541 ~RpcHandlerImpl()
override { disconnect(); }
547class ChainImpl :
public Chain
551 std::optional<int> getHeight()
override
554 return height >= 0 ? std::optional{height} : std::nullopt;
556 uint256 getBlockHash(
int height)
override
559 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
561 bool haveBlockOnDisk(
int height)
override
564 const CBlockIndex* block{chainman().ActiveChain()[height]};
567 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
570 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
571 return fork->nHeight;
582 if (!block_filter_index)
return std::nullopt;
586 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
592 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
594 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
597 const CChain& active = chainman().ActiveChain();
598 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
600 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
603 const CChain& active = chainman().ActiveChain();
604 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
605 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
606 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
609 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
611 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
614 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
615 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
616 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
617 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
622 const CChain& active = chainman().ActiveChain();
623 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
624 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
629 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
630 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
631 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
633 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
634 double guessVerificationProgress(
const uint256& block_hash)
override
636 LOCK(chainman().GetMutex());
637 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
639 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
649 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
650 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
653 if (block->
nHeight <= min_height || !block->
pprev)
return true;
664 bool isInMempool(
const Txid& txid)
override
666 if (!
m_node.mempool)
return false;
667 return m_node.mempool->exists(txid);
669 bool hasDescendantsInMempool(
const Txid& txid)
override
671 if (!
m_node.mempool)
return false;
672 return m_node.mempool->HasDescendants(txid);
677 std::string& err_string)
override
685 void getTransactionAncestry(
const Txid& txid,
size_t& ancestors,
size_t& cluster_count,
size_t* ancestorsize,
CAmount* ancestorfees)
override
687 ancestors = cluster_count = 0;
688 if (!
m_node.mempool)
return;
689 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, ancestorsize, ancestorfees);
692 std::map<COutPoint, CAmount> calculateIndividualBumpFees(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
695 std::map<COutPoint, CAmount> bump_fees;
696 for (
const auto& outpoint : outpoints) {
697 bump_fees.emplace(outpoint, 0);
701 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
704 std::optional<CAmount> calculateCombinedBumpFee(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
709 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
711 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
717 limit_ancestor_count = limits.ancestor_count;
718 limit_descendant_count = limits.descendant_count;
722 if (!
m_node.mempool)
return {};
723 if (!
m_node.mempool->CheckPolicyLimits(tx)) {
730 if (!
m_node.fee_estimator)
return {};
731 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
733 unsigned int estimateMaxBlocks()
override
735 if (!
m_node.fee_estimator)
return 0;
740 if (!
m_node.mempool)
return {};
741 return m_node.mempool->GetMinFee();
746 return m_node.mempool->m_opts.min_relay_feerate;
748 CFeeRate relayIncrementalFee()
override
751 return m_node.mempool->m_opts.incremental_relay_feerate;
756 return m_node.mempool->m_opts.dust_relay_feerate;
758 bool havePruned()
override
761 return chainman().m_blockman.m_have_pruned;
763 std::optional<int> getPruneHeight()
override
765 LOCK(chainman().GetMutex());
766 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
768 bool isReadyToBroadcast()
override {
return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
769 bool isInitialBlockDownload()
override
771 return chainman().IsInitialBlockDownload();
774 void initMessage(
const std::string& message)
override {
::uiInterface.InitMessage(message); }
777 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
779 ::uiInterface.ShowProgress(title, progress, resume_possible);
781 std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications)
override
783 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
785 void waitForNotificationsIfTipChanged(
const uint256& old_tip)
override
787 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
788 validation_signals().SyncWithValidationInterfaceQueue();
790 void waitForNotifications()
override
792 validation_signals().SyncWithValidationInterfaceQueue();
796 return std::make_unique<RpcHandlerImpl>(
command);
803 std::vector<common::SettingsValue> getSettingsList(
const std::string&
name)
override
817 bool updateRwSetting(
const std::string&
name,
820 std::optional<interfaces::SettingsAction> action;
823 action = update_settings_func(*value);
824 if (value->isNull()) settings.rw_settings.erase(name);
827 action = update_settings_func(new_value);
828 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
831 if (!action)
return false;
838 settings = std::move(value);
844 return overwriteRwSetting(
name, {}, action);
846 void requestMempoolTransactions(Notifications& notifications)
override
848 if (!
m_node.mempool)
return;
851 notifications.transactionAddedToMempool(entry.GetSharedTx());
854 bool hasAssumedValidChain()
override
857 return bool{chainman().CurrentChainstate().m_from_snapshot_blockhash};
860 NodeContext* context()
override {
return &
m_node; }
870 explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
871 std::unique_ptr<CBlockTemplate> block_template,
884 CBlock getBlock()
override
889 std::vector<CAmount> getTxFees()
override
894 std::vector<int64_t> getTxSigops()
override
904 std::vector<uint256> getCoinbaseMerklePath()
override
909 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
912 return chainman().ProcessNewBlock(std::make_shared<const CBlock>(
m_block_template->block),
true,
true,
nullptr);
922 void interruptWait()
override
933 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
937class MinerImpl :
public Mining
942 bool isTestChain()
override
944 return chainman().GetParams().IsTestChain();
947 bool isInitialBlockDownload()
override
949 return chainman().IsInitialBlockDownload();
952 std::optional<BlockRef>
getTip()
override
954 return GetTip(chainman());
962 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options,
bool cooldown)
override
969 throw std::runtime_error(
strprintf(
"block_reserved_weight (%zu) must be at least %u weight units",
970 *options.block_reserved_weight,
975 std::optional<BlockRef> maybe_tip{waitTipChanged(
uint256::ZERO, MillisecondsDouble::max())};
977 if (!maybe_tip)
return {};
985 while (chainman().IsInitialBlockDownload()) {
994 BlockAssembler::Options assemble_options{options};
996 return std::make_unique<BlockTemplateImpl>(assemble_options,
BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.
CreateNewBlock(),
m_node);
999 void interrupt()
override
1006 LOCK(chainman().GetMutex());
1009 debug = state.GetDebugMessage();
1010 return state.IsValid();
1013 NodeContext* context()
override {
return &
m_node; }
1015 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
1021class RpcImpl :
public Rpc
1026 UniValue executeRpc(
UniValue request, std::string uri, std::string user)
override
1030 req.
URI = std::move(uri);
1051 return kernel_notifications.m_state.chainstate_loaded || interrupt;
1053 if (interrupt)
return nullptr;
1055 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.
std::unique_ptr< CBlockTemplate > CreateNewBlock()
Construct a new block template.
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.
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(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.
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
std::unique_ptr< CBlockTemplate > WaitAndCreateNewBlock(ChainstateManager &chainman, KernelNotifications &kernel_notifications, CTxMemPool *mempool, const std::unique_ptr< CBlockTemplate > &block_template, const BlockWaitOptions &options, const BlockAssembler::Options &assemble_options, bool &interrupt_wait)
Return a new block template when fees rise to a certain threshold or after a new tip; return nullopt ...
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)
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
const BlockAssembler::Options m_assemble_options
std::shared_ptr< Chain::Notifications > m_notifications
const CRPCCommand * m_wrapped_command
const std::unique_ptr< CBlockTemplate > m_block_template
std::shared_ptr< NotificationsProxy > m_proxy
is a home for public enum and struct type definitions that are used internally by node code,...
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
RBFTransactionState IsRBFOptIn(const CTransaction &tx, const CTxMemPool &pool)
Determine whether an unconfirmed transaction is signaling opt-in to RBF according to BIP 125 This inv...
RBFTransactionState
The rbf state of unconfirmed transactions.
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
static constexpr unsigned int MINIMUM_BLOCK_RESERVED_WEIGHT
This accounts for the block header, var_int encoding of the transaction count and a minimally viable ...
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.
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)