7#include <blockfilter.h>
9#include <chainparams.h>
65#include <bitcoin-build-config.h>
72#include <boost/signals2/signal.hpp>
94#ifdef ENABLE_EXTERNAL_SIGNER
104class NodeImpl :
public Node
107 explicit NodeImpl(NodeContext& context) { setContext(&context); }
111 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
113 bool baseInitialize()
override
118 m_context->warnings = std::make_unique<node::Warnings>();
119 m_context->kernel = std::make_unique<kernel::Context>();
120 m_context->ecc_context = std::make_unique<ECC_Context>();
132 m_context->exit_status.store(EXIT_FAILURE);
135 void appShutdown()
override
139 void startShutdown()
override
142 if (!(
Assert(ctx.shutdown_request))()) {
143 LogError(
"Failed to send shutdown signal\n");
148 bool isSettingIgnored(
const std::string&
name)
override
150 bool ignored =
false;
153 ignored = !options->empty();
163 settings.rw_settings.erase(name);
165 settings.rw_settings[name] = value;
174 settings.forced_settings.erase(name);
176 settings.forced_settings[name] = value;
180 void resetSettings()
override
188 void mapPort(
bool enable)
override {
StartMapPort(enable); }
194 bool getNodesStats(NodesStats& stats)
override
199 std::vector<CNodeStats> stats_temp;
200 m_context->connman->GetNodeStats(stats_temp);
202 stats.reserve(stats_temp.size());
203 for (
auto& node_stats_temp : stats_temp) {
204 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
211 for (
auto& node_stats : stats) {
212 std::get<1>(node_stats) =
213 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
221 bool getBanned(
banmap_t& banmap)
override
229 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
232 m_context->banman->Ban(net_addr, ban_time_offset);
245 bool disconnectByAddress(
const CNetAddr& net_addr)
override
248 return m_context->connman->DisconnectNode(net_addr);
252 bool disconnectById(
NodeId id)
override
255 return m_context->connman->DisconnectNode(
id);
259 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
261#ifdef ENABLE_EXTERNAL_SIGNER
262 std::vector<ExternalSigner> signers = {};
266 std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
267 result.reserve(signers.size());
268 for (
auto&
signer : signers) {
269 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
282 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
283 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
284 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
285 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
286 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
287 bool getHeaderTip(
int& height, int64_t& block_time)
override
290 auto best_header = chainman().m_best_header;
292 height = best_header->nHeight;
293 block_time = best_header->GetBlockTime();
298 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
301 return m_context->connman->getNetLocalAddresses();
305 int getNumBlocks()
override
308 return chainman().ActiveChain().Height();
310 uint256 getBestBlockHash()
override
313 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
315 int64_t getLastBlockTime()
override
318 if (chainman().ActiveChain().Tip()) {
319 return chainman().ActiveChain().Tip()->GetBlockTime();
321 return chainman().GetParams().GenesisBlock().GetBlockTime();
323 double getVerificationProgress()
override
325 LOCK(chainman().GetMutex());
326 return chainman().GuessVerificationProgress(chainman().ActiveTip());
328 bool isInitialBlockDownload()
override
330 return chainman().IsInitialBlockDownload();
332 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
333 void setNetworkActive(
bool active)
override
336 m_context->connman->SetNetworkActive(active);
339 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
343 return m_context->mempool->m_opts.dust_relay_feerate;
355 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
358 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
373 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
377 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
381 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
385 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
389 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
393 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
397 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
401 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
405 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
409 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
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;
436 if (block.m_hash) *block.m_hash = index->
GetBlockHash();
437 if (block.m_height) *block.m_height = index->
nHeight;
438 if (block.m_time) *block.m_time = index->
GetBlockTime();
441 if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
442 if (block.m_locator) { *block.m_locator =
GetLocator(index); }
443 if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] :
nullptr, *block.m_next_block, lock, active, blockman);
446 if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
455 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
457 virtual ~NotificationsProxy() =
default;
466 void BlockConnected(
const ChainstateRole& role,
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
470 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
485class NotificationsHandlerImpl :
public Handler
488 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
489 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
493 ~NotificationsHandlerImpl()
override { disconnect(); }
494 void disconnect()
override
505class RpcHandlerImpl :
public Handler
530 void disconnect() final
538 ~RpcHandlerImpl()
override { disconnect(); }
544class ChainImpl :
public Chain
548 std::optional<int> getHeight()
override
551 return height >= 0 ? std::optional{height} : std::nullopt;
553 uint256 getBlockHash(
int height)
override
556 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
558 bool haveBlockOnDisk(
int height)
override
561 const CBlockIndex* block{chainman().ActiveChain()[height]};
564 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
567 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
568 return fork->nHeight;
579 if (!block_filter_index)
return std::nullopt;
583 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
589 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
591 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
594 const CChain& active = chainman().ActiveChain();
595 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
597 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
600 const CChain& active = chainman().ActiveChain();
601 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
602 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
603 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
606 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
608 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
611 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
612 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
613 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
614 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
619 const CChain& active = chainman().ActiveChain();
620 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
621 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
626 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
627 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
628 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
630 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
631 double guessVerificationProgress(
const uint256& block_hash)
override
633 LOCK(chainman().GetMutex());
634 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
636 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
646 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
647 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
650 if (block->
nHeight <= min_height || !block->
pprev)
return true;
661 bool isInMempool(
const Txid& txid)
override
663 if (!
m_node.mempool)
return false;
664 return m_node.mempool->exists(txid);
666 bool hasDescendantsInMempool(
const Txid& txid)
override
668 if (!
m_node.mempool)
return false;
669 return m_node.mempool->HasDescendants(txid);
674 std::string& err_string)
override
682 void getTransactionAncestry(
const Txid& txid,
size_t& ancestors,
size_t& cluster_count,
size_t* ancestorsize,
CAmount* ancestorfees)
override
684 ancestors = cluster_count = 0;
685 if (!
m_node.mempool)
return;
686 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, ancestorsize, ancestorfees);
689 std::map<COutPoint, CAmount> calculateIndividualBumpFees(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
692 std::map<COutPoint, CAmount> bump_fees;
693 for (
const auto& outpoint : outpoints) {
694 bump_fees.emplace(outpoint, 0);
698 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
701 std::optional<CAmount> calculateCombinedBumpFee(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
706 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
708 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
714 limit_ancestor_count = limits.ancestor_count;
715 limit_descendant_count = limits.descendant_count;
719 if (!
m_node.mempool)
return {};
720 if (!
m_node.mempool->CheckPolicyLimits(tx)) {
727 if (!
m_node.fee_estimator)
return {};
728 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
730 unsigned int estimateMaxBlocks()
override
732 if (!
m_node.fee_estimator)
return 0;
737 if (!
m_node.mempool)
return {};
738 return m_node.mempool->GetMinFee();
743 return m_node.mempool->m_opts.min_relay_feerate;
745 CFeeRate relayIncrementalFee()
override
748 return m_node.mempool->m_opts.incremental_relay_feerate;
753 return m_node.mempool->m_opts.dust_relay_feerate;
755 bool havePruned()
override
758 return chainman().m_blockman.m_have_pruned;
760 std::optional<int> getPruneHeight()
override
762 LOCK(chainman().GetMutex());
763 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
765 bool isReadyToBroadcast()
override {
return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
766 bool isInitialBlockDownload()
override
768 return chainman().IsInitialBlockDownload();
771 void initMessage(
const std::string& message)
override {
::uiInterface.InitMessage(message); }
774 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
776 ::uiInterface.ShowProgress(title, progress, resume_possible);
778 std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications)
override
780 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
782 void waitForNotificationsIfTipChanged(
const uint256& old_tip)
override
784 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
785 validation_signals().SyncWithValidationInterfaceQueue();
789 return std::make_unique<RpcHandlerImpl>(
command);
796 std::vector<common::SettingsValue> getSettingsList(
const std::string&
name)
override
810 bool updateRwSetting(
const std::string&
name,
813 std::optional<interfaces::SettingsAction> action;
816 action = update_settings_func(*value);
817 if (value->isNull()) settings.rw_settings.erase(name);
820 action = update_settings_func(new_value);
821 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
824 if (!action)
return false;
831 settings = std::move(value);
837 return overwriteRwSetting(
name, {}, action);
839 void requestMempoolTransactions(Notifications& notifications)
override
841 if (!
m_node.mempool)
return;
844 notifications.transactionAddedToMempool(entry.GetSharedTx());
847 bool hasAssumedValidChain()
override
850 return bool{chainman().CurrentChainstate().m_from_snapshot_blockhash};
853 NodeContext* context()
override {
return &
m_node; }
863 explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
864 std::unique_ptr<CBlockTemplate> block_template,
877 CBlock getBlock()
override
882 std::vector<CAmount> getTxFees()
override
887 std::vector<int64_t> getTxSigops()
override
902 std::vector<unsigned char> getCoinbaseCommitment()
override
907 int getWitnessCommitmentIndex()
override
912 std::vector<uint256> getCoinbaseMerklePath()
override
917 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
920 return chainman().ProcessNewBlock(std::make_shared<const CBlock>(
m_block_template->block),
true,
true,
nullptr);
930 void interruptWait()
override
941 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
945class MinerImpl :
public Mining
950 bool isTestChain()
override
952 return chainman().GetParams().IsTestChain();
955 bool isInitialBlockDownload()
override
957 return chainman().IsInitialBlockDownload();
960 std::optional<BlockRef>
getTip()
override
962 return GetTip(chainman());
967 return WaitTipChanged(chainman(), notifications(), current_tip, timeout);
970 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options)
override
973 if (!waitTipChanged(
uint256::ZERO, MillisecondsDouble::max()))
return {};
975 BlockAssembler::Options assemble_options{options};
977 return std::make_unique<BlockTemplateImpl>(assemble_options,
BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.
CreateNewBlock(),
m_node);
982 LOCK(chainman().GetMutex());
985 debug = state.GetDebugMessage();
986 return state.IsValid();
989 NodeContext* context()
override {
return &
m_node; }
991 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.
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).
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
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
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.
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< 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.
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 ...
std::optional< BlockRef > WaitTipChanged(ChainstateManager &chainman, KernelNotifications &kernel_notifications, const uint256 ¤t_tip, MillisecondsDouble &timeout)
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)
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
bool GetProxy(enum Network net, Proxy &proxyInfoOut)
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 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.
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.
#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)