7#include <blockfilter.h>
9#include <chainparams.h>
65#include <bitcoin-build-config.h>
73#include <boost/signals2/signal.hpp>
95#ifdef ENABLE_EXTERNAL_SIGNER
105class NodeImpl :
public Node
108 explicit NodeImpl(NodeContext& context) { setContext(&context); }
112 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
114 bool baseInitialize()
override
119 m_context->warnings = std::make_unique<node::Warnings>();
120 m_context->kernel = std::make_unique<kernel::Context>();
121 m_context->ecc_context = std::make_unique<ECC_Context>();
133 m_context->exit_status.store(EXIT_FAILURE);
136 void appShutdown()
override
140 void startShutdown()
override
143 if (!(
Assert(ctx.shutdown_request))()) {
144 LogError(
"Failed to send shutdown signal\n");
149 bool isSettingIgnored(
const std::string&
name)
override
151 bool ignored =
false;
154 ignored = !options->empty();
164 settings.rw_settings.erase(name);
166 settings.rw_settings[name] = value;
175 settings.forced_settings.erase(name);
177 settings.forced_settings[name] = value;
181 void resetSettings()
override
189 void mapPort(
bool enable)
override {
StartMapPort(enable); }
195 bool getNodesStats(NodesStats& stats)
override
200 std::vector<CNodeStats> stats_temp;
201 m_context->connman->GetNodeStats(stats_temp);
203 stats.reserve(stats_temp.size());
204 for (
auto& node_stats_temp : stats_temp) {
205 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
212 for (
auto& node_stats : stats) {
213 std::get<1>(node_stats) =
214 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
222 bool getBanned(
banmap_t& banmap)
override
230 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override
233 m_context->banman->Ban(net_addr, ban_time_offset);
246 bool disconnectByAddress(
const CNetAddr& net_addr)
override
249 return m_context->connman->DisconnectNode(net_addr);
253 bool disconnectById(
NodeId id)
override
256 return m_context->connman->DisconnectNode(
id);
260 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override
262#ifdef ENABLE_EXTERNAL_SIGNER
263 std::vector<ExternalSigner> signers = {};
267 std::vector<std::unique_ptr<interfaces::ExternalSigner>> result;
268 result.reserve(signers.size());
269 for (
auto&
signer : signers) {
270 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
283 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
284 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
285 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
286 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
287 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
288 bool getHeaderTip(
int& height, int64_t& block_time)
override
291 auto best_header = chainman().m_best_header;
293 height = best_header->nHeight;
294 block_time = best_header->GetBlockTime();
299 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override
302 return m_context->connman->getNetLocalAddresses();
306 int getNumBlocks()
override
309 return chainman().ActiveChain().Height();
311 uint256 getBestBlockHash()
override
314 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
316 int64_t getLastBlockTime()
override
319 if (chainman().ActiveChain().Tip()) {
320 return chainman().ActiveChain().Tip()->GetBlockTime();
322 return chainman().GetParams().GenesisBlock().GetBlockTime();
324 double getVerificationProgress()
override
326 LOCK(chainman().GetMutex());
327 return chainman().GuessVerificationProgress(chainman().ActiveTip());
329 bool isInitialBlockDownload()
override
331 return chainman().IsInitialBlockDownload();
333 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
334 void setNetworkActive(
bool active)
override
337 m_context->connman->SetNetworkActive(active);
340 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
344 return m_context->mempool->m_opts.dust_relay_feerate;
356 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override
359 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
374 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override
378 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override
382 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override
386 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override
390 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override
394 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override
398 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override
402 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override
406 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override
410 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override
416 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override
423 NodeContext* context()
override {
return m_context; }
424 void setContext(NodeContext* context)
override
436 if (!index)
return false;
437 if (block.m_hash) *block.m_hash = index->
GetBlockHash();
438 if (block.m_height) *block.m_height = index->
nHeight;
439 if (block.m_time) *block.m_time = index->
GetBlockTime();
442 if (block.m_in_active_chain) *block.m_in_active_chain = active[index->nHeight] == index;
443 if (block.m_locator) { *block.m_locator =
GetLocator(index); }
444 if (block.m_next_block) FillBlock(active[index->nHeight] == index ? active[index->nHeight + 1] :
nullptr, *block.m_next_block, lock, active, blockman);
447 if (!blockman.ReadBlock(*block.m_data, *index)) block.m_data->SetNull();
456 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
458 virtual ~NotificationsProxy() =
default;
467 void BlockConnected(
const ChainstateRole& role,
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
471 void BlockDisconnected(
const std::shared_ptr<const CBlock>& block,
const CBlockIndex* index)
override
486class NotificationsHandlerImpl :
public Handler
489 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
490 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
494 ~NotificationsHandlerImpl()
override { disconnect(); }
495 void disconnect()
override
506class RpcHandlerImpl :
public Handler
531 void disconnect() final
539 ~RpcHandlerImpl()
override { disconnect(); }
545class ChainImpl :
public Chain
549 std::optional<int> getHeight()
override
552 return height >= 0 ? std::optional{height} : std::nullopt;
554 uint256 getBlockHash(
int height)
override
557 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
559 bool haveBlockOnDisk(
int height)
override
562 const CBlockIndex* block{chainman().ActiveChain()[height]};
565 std::optional<int> findLocatorFork(
const CBlockLocator& locator)
override
568 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
569 return fork->nHeight;
580 if (!block_filter_index)
return std::nullopt;
584 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
590 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
592 bool findFirstBlockWithTimeAndHeight(int64_t min_time,
int min_height,
const FoundBlock& block)
override
595 const CChain& active = chainman().ActiveChain();
596 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
598 bool findAncestorByHeight(
const uint256& block_hash,
int ancestor_height,
const FoundBlock& ancestor_out)
override
601 const CChain& active = chainman().ActiveChain();
602 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
603 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
604 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
607 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
609 bool findAncestorByHash(
const uint256& block_hash,
const uint256& ancestor_hash,
const FoundBlock& ancestor_out)
override
612 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
613 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
614 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
615 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
620 const CChain& active = chainman().ActiveChain();
621 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
622 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
627 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
628 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
629 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
631 void findCoins(std::map<COutPoint, Coin>& coins)
override {
return FindCoins(
m_node, coins); }
632 double guessVerificationProgress(
const uint256& block_hash)
override
634 LOCK(chainman().GetMutex());
635 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
637 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override
647 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
648 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
651 if (block->
nHeight <= min_height || !block->
pprev)
return true;
662 bool isInMempool(
const Txid& txid)
override
664 if (!
m_node.mempool)
return false;
665 return m_node.mempool->exists(txid);
667 bool hasDescendantsInMempool(
const Txid& txid)
override
669 if (!
m_node.mempool)
return false;
670 return m_node.mempool->HasDescendants(txid);
675 std::string& err_string)
override
683 void getTransactionAncestry(
const Txid& txid,
size_t& ancestors,
size_t& cluster_count,
size_t* ancestorsize,
CAmount* ancestorfees)
override
685 ancestors = cluster_count = 0;
686 if (!
m_node.mempool)
return;
687 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, ancestorsize, ancestorfees);
690 std::map<COutPoint, CAmount> calculateIndividualBumpFees(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
693 std::map<COutPoint, CAmount> bump_fees;
694 for (
const auto& outpoint : outpoints) {
695 bump_fees.emplace(outpoint, 0);
699 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
702 std::optional<CAmount> calculateCombinedBumpFee(
const std::vector<COutPoint>& outpoints,
const CFeeRate& target_feerate)
override
707 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
709 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override
715 limit_ancestor_count = limits.ancestor_count;
716 limit_descendant_count = limits.descendant_count;
720 if (!
m_node.mempool)
return {};
721 if (!
m_node.mempool->CheckPolicyLimits(tx)) {
728 if (!
m_node.fee_estimator)
return {};
729 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
731 unsigned int estimateMaxBlocks()
override
733 if (!
m_node.fee_estimator)
return 0;
738 if (!
m_node.mempool)
return {};
739 return m_node.mempool->GetMinFee();
744 return m_node.mempool->m_opts.min_relay_feerate;
746 CFeeRate relayIncrementalFee()
override
749 return m_node.mempool->m_opts.incremental_relay_feerate;
754 return m_node.mempool->m_opts.dust_relay_feerate;
756 bool havePruned()
override
759 return chainman().m_blockman.m_have_pruned;
761 std::optional<int> getPruneHeight()
override
763 LOCK(chainman().GetMutex());
764 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
766 bool isReadyToBroadcast()
override {
return !chainman().m_blockman.LoadingBlocks() && !isInitialBlockDownload(); }
767 bool isInitialBlockDownload()
override
769 return chainman().IsInitialBlockDownload();
772 void initMessage(
const std::string& message)
override {
::uiInterface.InitMessage(message); }
775 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override
777 ::uiInterface.ShowProgress(title, progress, resume_possible);
779 std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications)
override
781 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
783 void waitForNotificationsIfTipChanged(
const uint256& old_tip)
override
785 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(
::cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
786 validation_signals().SyncWithValidationInterfaceQueue();
790 return std::make_unique<RpcHandlerImpl>(
command);
797 std::vector<common::SettingsValue> getSettingsList(
const std::string&
name)
override
811 bool updateRwSetting(
const std::string&
name,
814 std::optional<interfaces::SettingsAction> action;
817 action = update_settings_func(*value);
818 if (value->isNull()) settings.rw_settings.erase(name);
821 action = update_settings_func(new_value);
822 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
825 if (!action)
return false;
832 settings = std::move(value);
838 return overwriteRwSetting(
name, {}, action);
840 void requestMempoolTransactions(Notifications& notifications)
override
842 if (!
m_node.mempool)
return;
845 notifications.transactionAddedToMempool(entry.GetSharedTx());
848 bool hasAssumedValidChain()
override
851 return bool{chainman().CurrentChainstate().m_from_snapshot_blockhash};
854 NodeContext* context()
override {
return &
m_node; }
864 explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
865 std::unique_ptr<CBlockTemplate> block_template,
878 CBlock getBlock()
override
883 std::vector<CAmount> getTxFees()
override
888 std::vector<int64_t> getTxSigops()
override
898 std::vector<uint256> getCoinbaseMerklePath()
override
903 bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t
nonce,
CTransactionRef coinbase)
override
906 return chainman().ProcessNewBlock(std::make_shared<const CBlock>(
m_block_template->block),
true,
true,
nullptr);
916 void interruptWait()
override
927 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
931class MinerImpl :
public Mining
936 bool isTestChain()
override
938 return chainman().GetParams().IsTestChain();
941 bool isInitialBlockDownload()
override
943 return chainman().IsInitialBlockDownload();
946 std::optional<BlockRef>
getTip()
override
948 return GetTip(chainman());
953 return WaitTipChanged(chainman(), notifications(), current_tip, timeout);
956 std::unique_ptr<BlockTemplate> createNewBlock(
const BlockCreateOptions& options)
override
963 throw std::runtime_error(
strprintf(
"block_reserved_weight (%zu) must be at least %u weight units",
964 *options.block_reserved_weight,
969 if (!waitTipChanged(
uint256::ZERO, MillisecondsDouble::max()))
return {};
971 BlockAssembler::Options assemble_options{options};
973 return std::make_unique<BlockTemplateImpl>(assemble_options,
BlockAssembler{chainman().ActiveChainstate(), context()->mempool.get(), assemble_options}.
CreateNewBlock(),
m_node);
978 LOCK(chainman().GetMutex());
981 debug = state.GetDebugMessage();
982 return state.IsValid();
985 NodeContext* context()
override {
return &
m_node; }
987 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.
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 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
@ 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)