7 #include <blockfilter.h> 9 #include <chainparams.h> 54 #include <txmempool.h> 65 #include <bitcoin-build-config.h> 73 #include <boost/signals2/signal.hpp> 95 #ifdef ENABLE_EXTERNAL_SIGNER 105 class 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();
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)));
281 #endif // ENABLE_EXTERNAL_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 413 fn(sync_state, BlockTip{block.nHeight, block.GetBlockTime(), block.GetBlockHash()}, verification_progress);
416 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override 420 fn(sync_state, BlockTip{(int)height, timestamp, uint256{}}, presync);
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();
440 if (block.m_max_time) *block.m_max_time = index->GetBlockTimeMax();
441 if (block.m_mtp_time) *block.m_mtp_time = index->GetMedianTimePast();
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;
486 class 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(); }
506 class RpcHandlerImpl :
public Handler 545 class ChainImpl :
public Chain 551 const int height{
WITH_LOCK(::
cs_main,
return chainman().ActiveChain().Height())};
552 return height >= 0 ? std::optional{height} : std::nullopt;
557 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
562 const CBlockIndex* block{chainman().ActiveChain()[height]};
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);
595 const CChain& active = chainman().ActiveChain();
596 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
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);
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)};
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;
664 if (!
m_node.mempool)
return false;
665 return m_node.mempool->exists(txid);
669 if (!
m_node.mempool)
return false;
670 return m_node.mempool->HasDescendants(txid);
675 std::string& err_string)
override 681 return TransactionError::OK == err;
685 ancestors = cluster_count = 0;
686 if (!
m_node.mempool)
return;
687 m_node.mempool->GetTransactionAncestry(txid, ancestors, cluster_count, ancestorsize, ancestorfees);
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);
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);
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;
749 return m_node.mempool->m_opts.incremental_relay_feerate;
754 return m_node.mempool->m_opts.dust_relay_feerate;
759 return chainman().m_blockman.m_have_pruned;
763 LOCK(chainman().GetMutex());
764 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
769 return chainman().IsInitialBlockDownload();
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));
785 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(::
cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
786 validation_signals().SyncWithValidationInterfaceQueue();
790 validation_signals().SyncWithValidationInterfaceQueue();
794 return std::make_unique<RpcHandlerImpl>(
command);
818 std::optional<interfaces::SettingsAction> action;
821 action = update_settings_func(*value);
822 if (value->isNull()) settings.rw_settings.erase(name);
825 action = update_settings_func(new_value);
826 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
829 if (!action)
return false;
836 settings = std::move(value);
846 if (!
m_node.mempool)
return;
849 notifications.transactionAddedToMempool(entry.GetSharedTx());
855 return bool{chainman().CurrentChainstate().m_from_snapshot_blockhash};
868 explicit BlockTemplateImpl(BlockAssembler::Options assemble_options,
869 std::unique_ptr<CBlockTemplate> block_template,
887 std::vector<CAmount>
getTxFees()
override 910 return chainman().ProcessNewBlock(std::make_shared<const CBlock>(
m_block_template->block),
true,
true,
nullptr);
931 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
935 class MinerImpl :
public Mining 942 return chainman().GetParams().IsTestChain();
947 return chainman().IsInitialBlockDownload();
950 std::optional<BlockRef>
getTip()
override 952 return GetTip(chainman());
960 std::unique_ptr<BlockTemplate>
createNewBlock(
const BlockCreateOptions& options,
bool cooldown)
override 967 throw std::runtime_error(
strprintf(
"block_reserved_weight (%zu) must be at least %u weight units",
968 *options.block_reserved_weight,
975 if (!maybe_tip)
return {};
983 while (chainman().IsInitialBlockDownload()) {
992 BlockAssembler::Options assemble_options{options};
994 return std::make_unique<BlockTemplateImpl>(assemble_options,
BlockAssembler{chainman().ActiveChainstate(),
context()->
mempool.get(), assemble_options}.CreateNewBlock(),
m_node);
1004 LOCK(chainman().GetMutex());
1007 debug = state.GetDebugMessage();
1008 return state.IsValid();
1013 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
1031 return kernel_notifications.m_state.chainstate_loaded || interrupt;
1033 if (interrupt)
return nullptr;
1035 return std::make_unique<node::MinerImpl>(context);
std::shared_ptr< const CTransaction > CTransactionRef
virtual bool haveBlockOnDisk(int height)=0
Check that the block is available on disk (i.e.
Helper for findBlock to selectively return pieces of block data.
const GCSFilter & GetFilter() const LIFETIMEBOUND
virtual bool deleteRwSettings(const std::string &name, SettingsAction action=SettingsAction::WRITE)=0
Delete a given setting in <datadir>/settings.json.
Interval between compact filter checkpoints.
virtual bool findCommonAncestor(const uint256 &block_hash1, const uint256 &block_hash2, const FoundBlock &ancestor_out={}, const FoundBlock &block1_out={}, const FoundBlock &block2_out={})=0
Find most recent common ancestor between two blocks and optionally return block information.
virtual void findCoins(std::map< COutPoint, Coin > &coins)=0
Look up unspent output information.
virtual void getPackageLimits(unsigned int &limit_ancestor_count, unsigned int &limit_descendant_count)=0
Get the node's package limits.
Block template interface.
TxBroadcast
How to broadcast a local transaction.
Block tip (could be a header or not, depends on the subscribed signal).
Enables interaction with an external signing device or service, such as a hardware wallet...
virtual void TransactionRemovedFromMempool(const CTransactionRef &tx, MemPoolRemovalReason reason, uint64_t mempool_sequence)
Notifies listeners of a transaction leaving mempool.
static constexpr unsigned int DEFAULT_INCREMENTAL_RELAY_FEE
Default for -incrementalrelayfee, which sets the minimum feerate increase for mempool limiting or rep...
void InitLogging(const ArgsManager &args)
Initialize global loggers.
SynchronizationState
Current sync state passed to tip changed callbacks.
BCLog::Logger & LogInstance()
virtual std::optional< int > getHeight()=0
Get current chain height, not including genesis block (returns 0 if chain only contains genesis block...
virtual CBlockHeader getBlockHeader()=0
virtual bool findFirstBlockWithTimeAndHeight(int64_t min_time, int min_height, const FoundBlock &block={})=0
Find first block in the chain with timestamp >= the given time and height >= than the given height...
CClientUIInterface uiInterface
virtual void getTransactionAncestry(const Txid &txid, size_t &ancestors, size_t &cluster_count, size_t *ancestorsize=nullptr, CAmount *ancestorfees=nullptr)=0
Calculate mempool ancestor and cluster counts for the given transaction.
Generate a new block, without valid proof-of-work.
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
virtual std::unique_ptr< Handler > handleNotifications(std::shared_ptr< Notifications > notifications)=0
Register handler for notifications.
virtual void BlockDisconnected(const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being disconnected Provides the block that was disconnected.
CBlockIndex * pprev
pointer to the index of the predecessor of this block
#define TRY_LOCK(cs, name)
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...
std::map< std::string, SettingsValue > forced_settings
Map of setting name to forced setting value.
util::SignalInterrupt * shutdown_signal
Interrupt object used to track whether node shutdown was requested.
common::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified transaction.
virtual uint256 getBlockHash(int height)=0
Get block hash. Height must be valid or this function will abort.
virtual CFeeRate mempoolMinFee()=0
Mempool minimum fee.
virtual common::SettingsValue getSetting(const std::string &arg)=0
Get settings value.
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
Options struct containing limit options for a CTxMemPool.
An in-memory indexed chain of blocks.
void appendCommand(const std::string &name, const CRPCCommand *pcmd)
Appends a CRPCCommand to the dispatch table.
virtual CFeeRate relayDustFee()=0
Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend...
virtual bool hasBlockFilterIndex(BlockFilterType filter_type)=0
Returns whether a block filter index is available.
virtual std::vector< common::SettingsValue > getSettingsList(const std::string &arg)=0
Get list of settings values.
BlockFilterIndex * GetBlockFilterIndex(BlockFilterType filter_type)
Get a block filter index by type.
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
MemPoolRemovalReason
Reason why a transaction was removed from the mempool, this is passed to the notification signal...
Information about chainstate that notifications are sent from.
const CBlockIndex * LastCommonAncestor(const CBlockIndex *pa, const CBlockIndex *pb)
Find the last common ancestor two blocks have.
bool GetProxy(enum Network net, Proxy &proxyInfoOut)
virtual bool isInitialBlockDownload()=0
Check if in IBD.
std::optional< BlockRef > GetTip(ChainstateManager &chainman)
#define REVERSE_LOCK(g, cs)
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE
Default for -minrelaytxfee, minimum relay fee for transactions.
Hash/height pair to help track and identify blocks.
virtual std::optional< int > getPruneHeight()=0
Get the current prune height.
bool MatchAny(const ElementSet &elements) const
Checks if any of the given elements may be in the set.
bool removeCommand(const std::string &name, const CRPCCommand *pcmd)
::ExternalSigner m_signer
std::optional< BlockRef > WaitTipChanged(ChainstateManager &chainman, KernelNotifications &kernel_notifications, const uint256 ¤t_tip, MillisecondsDouble &timeout, bool &interrupt)
common::SettingsValue GetPersistentSetting(const std::string &name) const
Get current setting from config file or read/write settings file, ignoring nonpersistent command line...
virtual std::unique_ptr< BlockTemplate > waitNext(node::BlockWaitOptions options={})=0
Waits for fees in the next block to rise, a new tip or the timeout.
Add the transaction to the mempool and broadcast to all peers for which tx relay is enabled...
bool AppInitLockDirectories()
Lock bitcoin core critical directories.
util::Result< void > ApplyArgsManOptions(const ArgsManager &args, BlockManager::Options &opts)
const CRPCCommand * m_wrapped_command
std::unique_ptr< Node > MakeNode(node::NodeContext &context)
Return implementation of Node interface.
void InitWarning(const bilingual_str &str)
Show warning message.
virtual void TransactionAddedToMempool(const NewMempoolTransactionInfo &tx, uint64_t mempool_sequence)
Notifies listeners of a transaction having been added to mempool.
std::string m_name
Name of signer.
virtual double guessVerificationProgress(const uint256 &block_hash)=0
Estimate fraction of total transactions verified if blocks up to the specified block hash are verifie...
Implement this to subscribe to events generated in validation and mempool.
virtual bool hasDescendantsInMempool(const Txid &txid)=0
Check if transaction has descendants in mempool.
RBFTransactionState
The rbf state of unconfirmed transactions.
std::unique_ptr< CTxMemPool > mempool
bool AppInitBasicSetup(const ArgsManager &args, std::atomic< int > &exit_status)
Initialize bitcoin core: Basic context setup.
CTxMemPoolEntry stores data about the corresponding transaction, as well as data about all in-mempool...
virtual node::CoinbaseTx getCoinbaseTx()=0
Return fields needed to construct a coinbase transaction.
int64_t CAmount
Amount in satoshis (Can be negative)
UniValue execute(const JSONRPCRequest &request) const
Execute a method.
virtual std::optional< int > findLocatorFork(const CBlockLocator &locator)=0
Return height of the highest block on chain in common with the locator, which will either be the orig...
uint256 GetBlockHash() const
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...
NodeContext struct containing references to chain state and connection state.
Interface giving clients (RPC, Stratum v2 Template Provider in the future) ability to create block te...
virtual bool hasAssumedValidChain()=0
Return true if an assumed-valid snapshot is in use.
std::unique_ptr< Mining > MakeMining(node::NodeContext &node, bool wait_loaded=true)
Return implementation of Mining interface.
const BlockAssembler::Options m_assemble_options
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
std::vector< common::SettingsValue > GetSettingsList(const std::string &arg) const
Get list of setting values.
std::function< std::optional< interfaces::SettingsAction >(common::SettingsValue &)> SettingsUpdate
std::map< std::string, std::vector< SettingsValue > > command_line_options
Map of setting name to list of command line values.
SettingsAction
The action to be taken after updating a settings value.
virtual bool findAncestorByHeight(const uint256 &block_hash, int ancestor_height, const FoundBlock &ancestor_out={})=0
Find ancestor of block at specified height and optionally return ancestor information.
virtual bool submitSolution(uint32_t version, uint32_t timestamp, uint32_t nonce, CTransactionRef coinbase)=0
Construct and broadcast the block.
virtual CFeeRate estimateSmartFee(int num_blocks, bool conservative, FeeCalculation *calc=nullptr)=0
Estimate smart fee.
bool InitError(const bilingual_str &str)
Show error message.
void AddMerkleRootAndCoinbase(CBlock &block, CTransactionRef coinbase, uint32_t version, uint32_t timestamp, uint32_t nonce)
void StartMapPort(bool enable)
virtual bool updateRwSetting(const std::string &name, const SettingsUpdate &update_function)=0
Updates a setting in <datadir>/settings.json.
Complete block filter struct as defined in BIP 157.
virtual bool overwriteRwSetting(const std::string &name, common::SettingsValue value, SettingsAction action=SettingsAction::WRITE)=0
Replace a setting in <datadir>/settings.json with a new value.
Template containing all coinbase transaction fields that are set by our miner code.
static const uint256 ZERO
virtual std::unique_ptr< Handler > handleRpc(const CRPCCommand &command)=0
Register handler for RPC.
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
Notifies listeners when the block chain tip advances.
virtual std::vector< CAmount > getTxFees()=0
bool AppInitMain(NodeContext &node, interfaces::BlockAndHeaderTipInfo *tip_info)
Bitcoin core main initialization.
virtual bool findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
virtual bool broadcastTransaction(const CTransactionRef &tx, const CAmount &max_tx_fee, node::TxBroadcast broadcast_method, std::string &err_string)=0
Process a local transaction, optionally adding it to the mempool and optionally broadcasting it to th...
virtual void waitForNotificationsIfTipChanged(const uint256 &old_tip)=0
Wait for pending notifications to be processed unless block hash points to the current chain tip...
void InterruptWait(KernelNotifications &kernel_notifications, bool &interrupt_wait)
virtual void requestMempoolTransactions(Notifications ¬ifications)=0
Synchronously send transactionAddedToMempool notifications about all current mempool transactions to ...
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...
static CService ip(uint32_t i)
Block and header tip information.
virtual std::optional< CAmount > calculateCombinedBumpFee(const std::vector< COutPoint > &outpoints, const CFeeRate &target_feerate)=0
Calculate the combined bump fee for an input set per the same strategy.
virtual void BlockConnected(const kernel::ChainstateRole &role, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being connected.
virtual void interrupt()=0
Interrupts createNewBlock and waitTipChanged.
#define WAIT_LOCK(cs, name)
virtual std::vector< uint256 > getCoinbaseMerklePath()=0
Compute merkle path to the coinbase transaction.
virtual bool checkBlock(const CBlock &block, const node::BlockCheckOptions &options, std::string &reason, std::string &debug)=0
Checks if a given block is valid.
std::shared_ptr< NotificationsProxy > m_proxy
Invalid wallet specified.
An outpoint - a combination of a transaction hash and an index n into its vout.
constexpr bool IsNull() const
Wallet chain client that in addition to having chain client methods for starting up, shutting down, and registering RPCs, also has additional methods (called by the GUI) to load and create wallets.
bool IsDeprecatedRPCEnabled(const std::string &method)
virtual bool isInitialBlockDownload()=0
Returns whether IBD is still in progress.
#define WITH_LOCK(cs, code)
Run code while locking a mutex.
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
External signer interface used by the GUI.
std::unordered_set< Element, ByteVectorHash > ElementSet
virtual void initWarning(const bilingual_str &message)=0
Send init warning.
virtual bool isInMempool(const Txid &txid)=0
Check if transaction is in mempool.
Generic interface for managing an event handler or callback function registered with another interfac...
Helper class that manages an interrupt flag, and allows a thread or signal to interrupt another threa...
virtual node::NodeContext * context()
Get internal node context.
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
virtual bool isReadyToBroadcast()=0
Check if the node is ready to broadcast transactions.
virtual node::NodeContext * context()
Get internal node context.
#define EXCLUSIVE_LOCKS_REQUIRED(...)
std::unique_ptr< Chain > MakeChain(node::NodeContext &node)
Return implementation of Chain interface.
CategoryMask GetCategoryMask() const
bool WriteSettingsFile(std::vector< std::string > *errors=nullptr, bool backup=false) const
Write settings file or backup settings file.
bool AppInitParameterInteraction(const ArgsManager &args)
Initialization: parameter interaction.
void RegisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Register subscriber.
virtual bool findAncestorByHash(const uint256 &block_hash, const uint256 &ancestor_hash, const FoundBlock &ancestor_out={})=0
Return whether block descends from a specified ancestor, and optionally return ancestor information...
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
The block chain is a tree shaped structure starting with the genesis block at the root...
const CChainParams & Params()
Return the currently selected parameters.
bool ShutdownRequested(node::NodeContext &node)
Return whether node shutdown was requested.
std::string GetArg(const std::string &strArg, const std::string &strDefault) const
Return string argument or default value.
virtual std::optional< BlockRef > getTip()=0
Returns the hash and height for the tip of this chain.
virtual std::vector< int64_t > getTxSigops()=0
std::unique_ptr< KernelNotifications > notifications
Issues blocking calls about sync status, errors and warnings.
bool check_pow
Set false to omit the proof-of-work check.
virtual void initMessage(const std::string &message)=0
Send init message.
virtual std::map< COutPoint, CAmount > calculateIndividualBumpFees(const std::vector< COutPoint > &outpoints, const CFeeRate &target_feerate)=0
For each outpoint, calculate the fee-bumping cost to spend this outpoint at the specified.
bool AppInitSanityChecks(const kernel::Context &kernel)
Initialization sanity checks.
const CTransactionRef m_tx
Fee rate in satoshis per virtualbyte: CAmount / vB the feerate is represented internally as FeeFrac...
virtual RBFTransactionState isRBFOptIn(const CTransaction &tx)=0
Check if transaction is RBF opt in.
virtual bool hasBlocks(const uint256 &block_hash, int min_height=0, std::optional< int > max_height={})=0
Return true if data is available for all blocks in the specified range of blocks. ...
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 ...
virtual void showProgress(const std::string &title, int progress, bool resume_possible)=0
Send progress indicator.
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
bool check_merkle_root
Set false to omit the merkle root check.
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.
std::map< CSubNet, CBanEntry > banmap_t
Wrapper around std::unique_lock style lock for MutexType.
virtual unsigned int estimateMaxBlocks()=0
Fee estimator max target.
CBlockLocator GetLocator(const CBlockIndex *index)
Get a locator for a block index entry.
std::map< std::string, SettingsValue > rw_settings
Map of setting name to read-write file setting value.
virtual bool shutdownRequested()=0
Check if shutdown requested.
bool AppInitInterfaces(NodeContext &node)
Initialize node and wallet interface pointers.
interfaces::BlockInfo MakeBlockInfo(const CBlockIndex *index, const CBlock *data)
Return data from block index.
virtual void disconnect()=0
Disconnect the handler.
The basic transaction that is broadcasted on the network and contained in blocks. ...
int nHeight
height of the entry in the chain. The genesis block has height 0
BlockValidationState TestBlockValidity(Chainstate &chainstate, const CBlock &block, const bool check_pow, const bool check_merkle_root)
Verify a block, including transactions.
virtual util::Result< void > checkChainLimits(const CTransactionRef &tx)=0
Check if transaction will pass the mempool's chain limits.
virtual void ChainStateFlushed(const kernel::ChainstateRole &role, const CBlockLocator &locator)
Notifies listeners of the new active block chain on-disk.
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
std::string GetRejectReason() const
void LockSettings(Fn &&fn)
Access settings with lock held.
full block available in blk*.dat
virtual std::optional< BlockRef > waitTipChanged(uint256 current_tip, MillisecondsDouble timeout=MillisecondsDouble::max())=0
Waits for the connected tip to change.
virtual CBlock getBlock()=0
is a home for public enum and struct type definitions that are used internally by node code...
virtual bool isTestChain()=0
If this chain is exclusively used for testing.
ValidationSignals & m_signals
virtual bool rpcEnableDeprecated(const std::string &method)=0
Check if deprecated RPC is enabled.
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::vector< std::string > listCommands() const
Returns a list of registered commands.
static bool Enumerate(const std::string &command, std::vector< ExternalSigner > &signers, const std::string &chain)
Obtain a list of signers.
virtual common::SettingsValue getRwSetting(const std::string &name)=0
Return <datadir>/settings.json setting value.
const std::unique_ptr< CBlockTemplate > m_block_template
auto Join(const C &container, const S &separator, UnaryOp unary_op)
Join all container items.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
virtual void initError(const bilingual_str &message)=0
Send init error.
Top-level interface for a bitcoin node (bitcoind process).
virtual CFeeRate relayIncrementalFee()=0
Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay.
virtual CFeeRate relayMinFee()=0
Relay current minimum fee (from -minrelaytxfee and -incrementalrelayfee settings).
virtual void waitForNotifications()=0
Wait for all pending notifications up to this point to be processed.
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 ...
void UnregisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Unregister subscriber.
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
unsigned int nTx
Number of transactions in this block.
std::unique_ptr< ChainstateManager > chainman
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
virtual void interruptWait()=0
Interrupts the current wait for the next block template.
virtual bool havePruned()=0
Check if any block has been pruned.
#define Assert(val)
Identity function.
std::shared_ptr< Chain::Notifications > m_notifications
virtual std::unique_ptr< BlockTemplate > createNewBlock(const node::BlockCreateOptions &options={}, bool cooldown=true)=0
Construct a new block template.
auto FindKey(Map &&map, Key &&key) -> decltype(&map.at(key))
Map lookup helper.
virtual std::optional< bool > blockFilterMatchesAny(BlockFilterType filter_type, const uint256 &block_hash, const GCSFilter::ElementSet &filter_set)=0
Returns whether any of the elements match the block via a BIP 157 block filter or std::nullopt if the...