7#include <blockfilter.h>
9#include <chainparams.h>
65#include <bitcoin-build-config.h>
72#include <boost/signals2/signal.hpp>
92#ifdef ENABLE_EXTERNAL_SIGNER
102class NodeImpl :
public Node
105 explicit NodeImpl(NodeContext& context) { setContext(&context); }
109 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
111 bool baseInitialize()
override
116 m_context->warnings = std::make_unique<node::Warnings>();
117 m_context->kernel = std::make_unique<kernel::Context>();
118 m_context->ecc_context = std::make_unique<ECC_Context>();
130 m_context->exit_status.store(EXIT_FAILURE);
133 void appShutdown()
override
137 void startShutdown()
override
140 if (!(
Assert(ctx.shutdown_request))()) {
141 LogError(
"Failed to send shutdown signal\n");
146 bool isSettingIgnored(
const std::string&
name)
override
148 bool ignored =
false;
151 ignored = !options->empty();
161 settings.rw_settings.erase(name);
163 settings.rw_settings[name] = value;
172 settings.forced_settings.erase(name);
174 settings.forced_settings[name] = value;
178 void resetSettings()
override
186 void mapPort(
bool enable)
override {
StartMapPort(enable); }
192 bool getNodesStats(NodesStats& stats)
override
197 std::vector<CNodeStats> stats_temp;
198 m_context->connman->GetNodeStats(stats_temp);
200 stats.reserve(stats_temp.size());
201 for (
auto& node_stats_temp : stats_temp) {
202 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
209 for (
auto& node_stats : stats) {
210 std::get<1>(node_stats) =
211 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
219 bool getBanned(
banmap_t& banmap)
override
227 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
230 m_context->banman->Ban(net_addr, ban_time_offset);
243 bool disconnectByAddress(
const CNetAddr& net_addr)
override
246 return m_context->connman->DisconnectNode(net_addr);
250 bool disconnectById(
NodeId id)
override
253 return m_context->connman->DisconnectNode(
id);
257 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
259#ifdef ENABLE_EXTERNAL_SIGNER
260 std::vector<ExternalSigner> signers = {};
264 std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
265 result.reserve(signers.size());
266 for (
auto&
signer : signers) {
267 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
280 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
281 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
282 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
283 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
284 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
285 bool getHeaderTip(
int& height, int64_t& block_time)
override
288 auto best_header = chainman().m_best_header;
290 height = best_header->nHeight;
291 block_time = best_header->GetBlockTime();
296 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
299 return m_context->connman->getNetLocalAddresses();
303 int getNumBlocks()
override
306 return chainman().ActiveChain().Height();
308 uint256 getBestBlockHash()
override
311 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
313 int64_t getLastBlockTime()
override
316 if (chainman().ActiveChain().Tip()) {
317 return chainman().ActiveChain().Tip()->GetBlockTime();
319 return chainman().GetParams().GenesisBlock().GetBlockTime();
321 double getVerificationProgress()
override
323 LOCK(chainman().GetMutex());
324 return chainman().GuessVerificationProgress(chainman().ActiveTip());
326 bool isInitialBlockDownload()
override
328 return chainman().IsInitialBlockDownload();
330 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
331 void setNetworkActive(
bool active)
override
334 m_context->connman->SetNetworkActive(active);
337 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
341 return m_context->mempool->m_opts.dust_relay_feerate;
353 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
356 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
371 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
375 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
379 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
383 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
387 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
391 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
395 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
399 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
403 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
407 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
413 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
420 NodeContext* context()
override {
return m_context; }
421 void setContext(NodeContext* context)
override
433 if (!index)
return false;
434 if (block.m_hash) *block.m_hash = index->
GetBlockHash();
435 if (block.m_height) *block.m_height = index->
nHeight;
436 if (block.m_time) *block.m_time = index->
GetBlockTime();
439 if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
440 if (block.m_locator) { *block.m_locator =
GetLocator(index); }
441 if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] :
nullptr, *block.m_next_block, lock, active, blockman);
444 if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
453 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
455 virtual ~NotificationsProxy() =
default;
468 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
482class NotificationsHandlerImpl :
public Handler
485 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
486 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
490 ~NotificationsHandlerImpl()
override { disconnect(); }
491 void disconnect()
override
502class RpcHandlerImpl :
public Handler
527 void disconnect() final
535 ~RpcHandlerImpl()
override { disconnect(); }
541class ChainImpl :
public Chain
545 std::optional<int> getHeight()
override
548 return height >= 0 ? std::optional{height} : std::nullopt;
550 uint256 getBlockHash(
int height)
override
553 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
555 bool haveBlockOnDisk(
int height)
override
558 const CBlockIndex* block{chainman().ActiveChain()[height]};
561 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
564 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
565 return fork->nHeight;
576 if (!block_filter_index)
return std::nullopt;
580 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
586 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
588 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
591 const CChain& active = chainman().ActiveChain();
592 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
594 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
597 const CChain& active = chainman().ActiveChain();
598 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
599 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
600 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
603 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
605 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
608 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
609 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
610 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
611 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
616 const CChain& active = chainman().ActiveChain();
617 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
618 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
623 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
624 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
625 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
627 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
628 double guessVerificationProgress(
const uint256& block_hash)
override
630 LOCK(chainman().GetMutex());
631 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
633 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
643 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
644 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
647 if (block->
nHeight <= min_height || !block->
pprev)
return true;
658 bool isInMempool(
const Txid& txid)
override
660 if (!
m_node.mempool)
return false;
661 return m_node.mempool->exists(txid);
663 bool hasDescendantsInMempool(
const Txid& txid)
override
665 if (!
m_node.mempool)
return false;
666 return m_node.mempool->HasDescendants(txid);
671 std::string& err_string)
override
679 void getTransactionAncestry(
const Txid& txid,
size_t& ancestors,
size_t& cluster_count,
size_t* ancestorsize,
CAmount* ancestorfees)
override
681 ancestors = cluster_count = 0;
682 if (!
m_node.mempool)
return;
683 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, ancestorsize, ancestorfees);
686 std::map<COutPoint, CAmount> calculateIndividualBumpFees(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
689 std::map<COutPoint, CAmount> bump_fees;
690 for (
const auto& outpoint : outpoints) {
691 bump_fees.emplace(outpoint, 0);
695 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
698 std::optional<CAmount> calculateCombinedBumpFee(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
703 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
705 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
711 limit_ancestor_count = limits.ancestor_count;
712 limit_descendant_count = limits.descendant_count;
716 if (!
m_node.mempool)
return {};
717 if (!
m_node.mempool->CheckPolicyLimits(tx)) {
724 if (!
m_node.fee_estimator)
return {};
725 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
727 unsigned int estimateMaxBlocks()
override
729 if (!
m_node.fee_estimator)
return 0;
734 if (!
m_node.mempool)
return {};
735 return m_node.mempool->GetMinFee();
740 return m_node.mempool->m_opts.min_relay_feerate;
742 CFeeRate relayIncrementalFee()
override
745 return m_node.mempool->m_opts.incremental_relay_feerate;
750 return m_node.mempool->m_opts.dust_relay_feerate;
752 bool havePruned()
override
755 return chainman().m_blockman.m_have_pruned;
757 std::optional<int> getPruneHeight()
override
759 LOCK(chainman().GetMutex());
760 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
762 bool isReadyToBroadcast()
override {
return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
763 bool isInitialBlockDownload()
override
765 return chainman().IsInitialBlockDownload();
768 void initMessage(
const std::string& message)
override {
::uiInterface.InitMessage(message); }
771 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
773 ::uiInterface.ShowProgress(title, progress, resume_possible);
775 std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications)
override
777 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
779 void waitForNotificationsIfTipChanged(
const uint256& old_tip)
override
781 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
782 validation_signals().SyncWithValidationInterfaceQueue();
786 return std::make_unique<RpcHandlerImpl>(
command);
793 std::vector<common::SettingsValue> getSettingsList(
const std::string&
name)
override
807 bool updateRwSetting(
const std::string&
name,
810 std::optional<interfaces::SettingsAction> action;
813 action = update_settings_func(*value);
814 if (value->isNull()) settings.rw_settings.erase(name);
817 action = update_settings_func(new_value);
818 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
821 if (!action)
return false;
828 settings = std::move(value);
834 return overwriteRwSetting(
name, {}, action);
836 void requestMempoolTransactions(Notifications& notifications)
override
838 if (!
m_node.mempool)
return;
841 notifications.transactionAddedToMempool(entry.GetSharedTx());
844 bool hasAssumedValidChain()
override
846 return chainman().IsSnapshotActive();
849 NodeContext* context()
override {
return &
m_node; }
859 explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
860 std::unique_ptr<CBlockTemplate> block_template,
873 CBlock getBlock()
override
878 std::vector<CAmount> getTxFees()
override
883 std::vector<int64_t> getTxSigops()
override
893 std::vector<unsigned char> getCoinbaseCommitment()
override
898 int getWitnessCommitmentIndex()
override
903 std::vector<uint256> getCoinbaseMerklePath()
override
908 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
911 return chainman().ProcessNewBlock(std::make_shared<const CBlock>(
m_block_template->block),
true,
true,
nullptr);
921 void interruptWait()
override
932 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
936class MinerImpl :
public Mining
941 bool isTestChain()
override
943 return chainman().GetParams().IsTestChain();
946 bool isInitialBlockDownload()
override
948 return chainman().IsInitialBlockDownload();
951 std::optional<BlockRef>
getTip()
override
953 return GetTip(chainman());
958 return WaitTipChanged(chainman(), notifications(), current_tip, timeout);
961 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options)
override
964 if (!waitTipChanged(
uint256::ZERO, MillisecondsDouble::max()))
return {};
966 BlockAssembler::Options assemble_options{options};
968 return std::make_unique<BlockTemplateImpl>(assemble_options,
BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.
CreateNewBlock(),
m_node);
973 LOCK(chainman().GetMutex());
976 debug = state.GetDebugMessage();
977 return state.IsValid();
980 NodeContext* context()
override {
return &
m_node; }
982 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.
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.
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.
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.
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).
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.
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)