7 #include <blockfilter.h> 9 #include <chainparams.h> 54 #include <txmempool.h> 65 #include <bitcoin-build-config.h> 72 #include <boost/signals2/signal.hpp> 91 #ifdef ENABLE_EXTERNAL_SIGNER 101 class NodeImpl :
public Node 104 explicit NodeImpl(NodeContext& context) { setContext(&context); }
108 int getExitStatus()
override {
return Assert(
m_context)->exit_status.load(); }
110 bool baseInitialize()
override 115 m_context->warnings = std::make_unique<node::Warnings>();
116 m_context->kernel = std::make_unique<kernel::Context>();
117 m_context->ecc_context = std::make_unique<ECC_Context>();
129 m_context->exit_status.store(EXIT_FAILURE);
132 void appShutdown()
override 137 void startShutdown()
override 140 if (!(
Assert(ctx.shutdown_request))()) {
141 LogError(
"Failed to send shutdown signal\n");
145 if (
args().GetBoolArg(
"-server",
false)) {
151 bool isSettingIgnored(
const std::string&
name)
override 153 bool ignored =
false;
156 ignored = !options->empty();
183 void resetSettings()
override 191 void mapPort(
bool enable)
override {
StartMapPort(enable); }
197 bool getNodesStats(NodesStats& stats)
override 202 std::vector<CNodeStats> stats_temp;
203 m_context->connman->GetNodeStats(stats_temp);
205 stats.reserve(stats_temp.size());
206 for (
auto& node_stats_temp : stats_temp) {
207 stats.emplace_back(std::move(node_stats_temp),
false,
CNodeStateStats());
214 for (
auto& node_stats : stats) {
215 std::get<1>(node_stats) =
216 m_context->peerman->GetNodeStateStats(std::get<0>(node_stats).nodeid, std::get<2>(node_stats));
224 bool getBanned(
banmap_t& banmap)
override 232 bool ban(
const CNetAddr& net_addr, int64_t ban_time_offset)
override 235 m_context->banman->Ban(net_addr, ban_time_offset);
248 bool disconnectByAddress(
const CNetAddr& net_addr)
override 251 return m_context->connman->DisconnectNode(net_addr);
255 bool disconnectById(
NodeId id)
override 258 return m_context->connman->DisconnectNode(
id);
262 std::vector<std::unique_ptr<interfaces::ExternalSigner>> listExternalSigners()
override 264 #ifdef ENABLE_EXTERNAL_SIGNER 265 std::vector<ExternalSigner> signers = {};
269 std::vector<std::unique_ptr<interfaces::ExternalSigner>>
result;
270 result.reserve(signers.size());
271 for (
auto&
signer : signers) {
272 result.emplace_back(std::make_unique<ExternalSignerImpl>(std::move(
signer)));
283 #endif // ENABLE_EXTERNAL_SIGNER 285 int64_t getTotalBytesRecv()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesRecv() : 0; }
286 int64_t getTotalBytesSent()
override {
return m_context->connman ?
m_context->connman->GetTotalBytesSent() : 0; }
287 size_t getMempoolSize()
override {
return m_context->mempool ?
m_context->mempool->size() : 0; }
288 size_t getMempoolDynamicUsage()
override {
return m_context->mempool ?
m_context->mempool->DynamicMemoryUsage() : 0; }
289 size_t getMempoolMaxUsage()
override {
return m_context->mempool ?
m_context->mempool->m_opts.max_size_bytes : 0; }
290 bool getHeaderTip(
int& height, int64_t& block_time)
override 293 auto best_header = chainman().m_best_header;
295 height = best_header->nHeight;
296 block_time = best_header->GetBlockTime();
301 std::map<CNetAddr, LocalServiceInfo> getNetLocalAddresses()
override 304 return m_context->connman->getNetLocalAddresses();
308 int getNumBlocks()
override 311 return chainman().ActiveChain().Height();
313 uint256 getBestBlockHash()
override 316 return tip ? tip->
GetBlockHash() : chainman().GetParams().GenesisBlock().GetHash();
318 int64_t getLastBlockTime()
override 321 if (chainman().ActiveChain().Tip()) {
322 return chainman().ActiveChain().Tip()->GetBlockTime();
324 return chainman().GetParams().GenesisBlock().GetBlockTime();
326 double getVerificationProgress()
override 328 return chainman().GuessVerificationProgress(
WITH_LOCK(chainman().GetMutex(),
return chainman().ActiveChain().Tip()));
330 bool isInitialBlockDownload()
override 332 return chainman().IsInitialBlockDownload();
334 bool isLoadingBlocks()
override {
return chainman().m_blockman.LoadingBlocks(); }
335 void setNetworkActive(
bool active)
override 338 m_context->connman->SetNetworkActive(active);
341 bool getNetworkActive()
override {
return m_context->connman &&
m_context->connman->GetNetworkActive(); }
345 return m_context->mempool->m_opts.dust_relay_feerate;
359 std::optional<Coin> getUnspentOutput(
const COutPoint& output)
override 362 return chainman().ActiveChainstate().CoinsTip().GetCoin(output);
372 std::unique_ptr<Handler> handleInitMessage(InitMessageFn fn)
override 376 std::unique_ptr<Handler> handleMessageBox(MessageBoxFn fn)
override 380 std::unique_ptr<Handler> handleQuestion(QuestionFn fn)
override 384 std::unique_ptr<Handler> handleShowProgress(ShowProgressFn fn)
override 388 std::unique_ptr<Handler> handleInitWallet(InitWalletFn fn)
override 392 std::unique_ptr<Handler> handleNotifyNumConnectionsChanged(NotifyNumConnectionsChangedFn fn)
override 396 std::unique_ptr<Handler> handleNotifyNetworkActiveChanged(NotifyNetworkActiveChangedFn fn)
override 400 std::unique_ptr<Handler> handleNotifyAlertChanged(NotifyAlertChangedFn fn)
override 404 std::unique_ptr<Handler> handleBannedListChanged(BannedListChangedFn fn)
override 408 std::unique_ptr<Handler> handleNotifyBlockTip(NotifyBlockTipFn fn)
override 411 fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()},
412 chainman().GuessVerificationProgress(block));
415 std::unique_ptr<Handler> handleNotifyHeaderTip(NotifyHeaderTipFn fn)
override 419 fn(sync_state, BlockTip{(int)height, timestamp, uint256{}}, presync);
422 NodeContext* context()
override {
return m_context; }
423 void setContext(NodeContext* context)
override 435 if (!index)
return false;
455 explicit NotificationsProxy(std::shared_ptr<Chain::Notifications> notifications)
457 virtual ~NotificationsProxy() =
default;
484 class NotificationsHandlerImpl :
public Handler 487 explicit NotificationsHandlerImpl(
ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
488 :
m_signals{signals},
m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
492 ~NotificationsHandlerImpl()
override {
disconnect(); }
504 class RpcHandlerImpl :
public Handler 543 class ChainImpl :
public Chain 549 const int height{
WITH_LOCK(::
cs_main,
return chainman().ActiveChain().Height())};
550 return height >= 0 ? std::optional{height} : std::nullopt;
555 return Assert(chainman().ActiveChain()[height])->GetBlockHash();
560 const CBlockIndex* block{chainman().ActiveChain()[height]};
566 return chainman().ActiveChain().GetLocator();
571 const CBlockIndex* index = chainman().m_blockman.LookupBlockIndex(block_hash);
577 if (
const CBlockIndex* fork = chainman().ActiveChainstate().FindForkInGlobalIndex(locator)) {
578 return fork->nHeight;
589 if (!block_filter_index)
return std::nullopt;
593 if (index ==
nullptr || !block_filter_index->LookupFilter(index, filter))
return std::nullopt;
599 return FillBlock(chainman().m_blockman.LookupBlockIndex(hash), block, lock, chainman().ActiveChain(), chainman().m_blockman);
604 const CChain& active = chainman().ActiveChain();
605 return FillBlock(active.
FindEarliestAtLeast(min_time, min_height), block, lock, active, chainman().m_blockman);
610 const CChain& active = chainman().ActiveChain();
611 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
612 if (
const CBlockIndex* ancestor = block->GetAncestor(ancestor_height)) {
613 return FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman);
616 return FillBlock(
nullptr, ancestor_out, lock, active, chainman().m_blockman);
621 const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash);
622 const CBlockIndex* ancestor = chainman().m_blockman.LookupBlockIndex(ancestor_hash);
623 if (block && ancestor && block->
GetAncestor(ancestor->
nHeight) != ancestor) ancestor =
nullptr;
624 return FillBlock(ancestor, ancestor_out, lock, chainman().ActiveChain(), chainman().m_blockman);
629 const CChain& active = chainman().ActiveChain();
630 const CBlockIndex* block1 = chainman().m_blockman.LookupBlockIndex(block_hash1);
631 const CBlockIndex* block2 = chainman().m_blockman.LookupBlockIndex(block_hash2);
636 return int{FillBlock(ancestor, ancestor_out, lock, active, chainman().m_blockman)} &
637 int{FillBlock(block1, block1_out, lock, active, chainman().m_blockman)} &
638 int{FillBlock(block2, block2_out, lock, active, chainman().m_blockman)};
643 LOCK(chainman().GetMutex());
644 return chainman().GuessVerificationProgress(chainman().m_blockman.LookupBlockIndex(block_hash));
646 bool hasBlocks(
const uint256& block_hash,
int min_height, std::optional<int> max_height)
override 656 if (
const CBlockIndex* block = chainman().m_blockman.LookupBlockIndex(block_hash)) {
657 if (max_height && block->
nHeight >= *max_height) block = block->
GetAncestor(*max_height);
660 if (block->
nHeight <= min_height || !block->
pprev)
return true;
673 if (!
m_node.mempool)
return false;
679 if (!
m_node.mempool)
return false;
682 if (entry ==
nullptr)
return false;
683 return entry->GetCountWithDescendants() > 1;
688 std::string& err_string)
override 694 return TransactionError::OK == err;
698 ancestors = descendants = 0;
699 if (!
m_node.mempool)
return;
700 m_node.mempool->GetTransactionAncestry(txid, ancestors, descendants, ancestorsize, ancestorfees);
706 std::map<COutPoint, CAmount> bump_fees;
707 for (
const auto& outpoint : outpoints) {
708 bump_fees.emplace(outpoint, 0);
712 return MiniMiner(*
m_node.mempool, outpoints).CalculateBumpFees(target_feerate);
720 return MiniMiner(*
m_node.mempool, outpoints).CalculateTotalBumpFees(target_feerate);
722 void getPackageLimits(
unsigned int& limit_ancestor_count,
unsigned int& limit_descendant_count)
override 728 limit_ancestor_count = limits.ancestor_count;
729 limit_descendant_count = limits.descendant_count;
733 if (!
m_node.mempool)
return {};
737 return m_node.mempool->CheckPackageLimits({tx}, entry.GetTxSize());
741 if (!
m_node.fee_estimator)
return {};
742 return m_node.fee_estimator->estimateSmartFee(num_blocks, calc, conservative);
746 if (!
m_node.fee_estimator)
return 0;
751 if (!
m_node.mempool)
return {};
752 return m_node.mempool->GetMinFee();
757 return m_node.mempool->m_opts.min_relay_feerate;
762 return m_node.mempool->m_opts.incremental_relay_feerate;
767 return m_node.mempool->m_opts.dust_relay_feerate;
772 return chainman().m_blockman.m_have_pruned;
776 LOCK(chainman().GetMutex());
777 return GetPruneHeight(chainman().m_blockman, chainman().ActiveChain());
782 return chainman().IsInitialBlockDownload();
788 void showProgress(
const std::string& title,
int progress,
bool resume_possible)
override 790 ::uiInterface.ShowProgress(title, progress, resume_possible);
792 std::unique_ptr<Handler>
handleNotifications(std::shared_ptr<Notifications> notifications)
override 794 return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
798 if (!old_tip.
IsNull() && old_tip ==
WITH_LOCK(::
cs_main,
return chainman().ActiveChain().Tip()->GetBlockHash()))
return;
799 validation_signals().SyncWithValidationInterfaceQueue();
803 return std::make_unique<RpcHandlerImpl>(
command);
806 void rpcRunLater(
const std::string&
name, std::function<
void()> fn, int64_t seconds)
override 831 std::optional<interfaces::SettingsAction> action;
834 action = update_settings_func(*value);
835 if (value->isNull()) settings.rw_settings.erase(name);
838 action = update_settings_func(new_value);
839 if (!new_value.isNull()) settings.rw_settings[name] = std::move(new_value);
842 if (!action)
return false;
849 settings = std::move(value);
859 if (!
m_node.mempool)
return;
862 notifications.transactionAddedToMempool(entry.GetSharedTx());
867 return chainman().IsSnapshotActive();
880 explicit BlockTemplateImpl(std::unique_ptr<CBlockTemplate> block_template, NodeContext&
node) :
m_block_template(std::move(block_template)),
m_node(
node)
895 std::vector<CAmount>
getTxFees()
override 929 if (block.vtx.size() == 0) {
930 block.vtx.push_back(coinbase);
932 block.vtx[0] = coinbase;
936 block.
nTime = timestamp;
941 auto block_ptr = std::make_shared<const CBlock>(block);
942 return chainman().ProcessNewBlock(block_ptr,
true,
true,
nullptr);
951 class MinerImpl :
public Mining 958 return chainman().GetParams().IsTestChain();
963 return chainman().IsInitialBlockDownload();
966 std::optional<BlockRef>
getTip()
override 976 if (timeout > std::chrono::years{100}) timeout = std::chrono::years{100};
978 WAIT_LOCK(notifications().m_tip_block_mutex, lock);
979 notifications().m_tip_block_cv.wait_for(lock, timeout, [&]()
EXCLUSIVE_LOCKS_REQUIRED(notifications().m_tip_block_mutex) {
982 return (notifications().
TipBlock() && notifications().
TipBlock() != current_tip) || chainman().m_interrupt;
987 return BlockRef{chainman().ActiveChain().Tip()->GetBlockHash(), chainman().ActiveChain().Tip()->nHeight};
990 std::unique_ptr<BlockTemplate>
createNewBlock(
const BlockCreateOptions& options)
override 992 BlockAssembler::Options assemble_options{options};
999 KernelNotifications& notifications() {
return *
Assert(
m_node.notifications); }
std::shared_ptr< const CTransaction > CTransactionRef
virtual int getWitnessCommitmentIndex()=0
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.
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
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 getTransactionAncestry(const uint256 &txid, size_t &ancestors, size_t &descendants, size_t *ancestorsize=nullptr, CAmount *ancestorfees=nullptr)=0
Calculate mempool ancestor and descendant counts for the given transaction.
virtual void getPackageLimits(unsigned int &limit_ancestor_count, unsigned int &limit_descendant_count)=0
Get the node's package limits.
Block template interface.
std::vector< uint256 > TransactionMerklePath(const CBlock &block, uint32_t position)
Compute merkle path to the specified 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
int64_t GetBlockTime() const
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.
common::SettingsValue GetSetting(const std::string &arg) const
Get setting value.
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.
Provides an interface for creating and interacting with one or two chainstates: an IBD chainstate gen...
virtual CBlockLocator getActiveChainLocator(const uint256 &block_hash)=0
Return a locator that refers to a block in the active chain.
virtual void rpcRunLater(const std::string &name, std::function< void()> fn, int64_t seconds)=0
Run function after given number of seconds. Cancel any previous calls with same name.
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...
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.
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
common::SettingsValue GetPersistentSetting(const std::string &name) const
Get current setting from config file or read/write settings file, ignoring nonpersistent command line...
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.
void RPCRunLater(const std::string &name, std::function< void()> func, int64_t nSeconds)
Run func nSeconds from now.
virtual CTransactionRef getCoinbaseTx()=0
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.
CBlockLocator * m_locator
void RPCUnsetTimerInterface(RPCTimerInterface *iface)
Unset factory function for timers.
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...
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
virtual bool hasDescendantsInMempool(const uint256 &txid)=0
Check if transaction has descendants in mempool.
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 chain is in use.
RBFTransactionState IsRBFOptInEmptyMempool(const CTransaction &tx)
virtual bool isInMempool(const uint256 &txid)=0
Check if transaction is in mempool.
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.
ChainstateRole
This enum describes the various roles a specific Chainstate instance can take.
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 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.
const FoundBlock * m_next_block
std::chrono::duration< double, std::chrono::milliseconds::period > MillisecondsDouble
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.
int64_t GetBlockTimeMax() const
virtual bool findBlock(const uint256 &hash, const FoundBlock &block={})=0
Return whether node has the block and optionally return block metadata or contents.
virtual void waitForNotificationsIfTipChanged(const uint256 &old_tip)=0
Wait for pending notifications to be processed unless block hash points to the current chain tip...
TransactionError BroadcastTransaction(NodeContext &node, const CTransactionRef tx, std::string &err_string, const CAmount &max_tx_fee, bool relay, bool wait_callback)
Submit a transaction to the mempool and (optionally) relay it to all P2P peers.
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)
uint256 BlockMerkleRoot(const CBlock &block, bool *mutated)
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.
#define WAIT_LOCK(cs, name)
static bool Enumerate(const std::string &command, std::vector< ExternalSigner > &signers, const std::string chain)
Obtain a list of signers.
virtual std::vector< uint256 > getCoinbaseMerklePath()=0
Compute merkle path to the coinbase transaction.
std::shared_ptr< NotificationsProxy > m_proxy
virtual std::vector< unsigned char > getCoinbaseCommitment()=0
Invalid wallet specified.
An outpoint - a combination of a transaction hash and an index n into its vout.
constexpr bool IsNull() const
virtual BlockRef waitTipChanged(uint256 current_tip, MillisecondsDouble timeout=MillisecondsDouble::max())=0
Waits for the connected tip to change.
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.
int64_t GetMedianTimePast() const
virtual std::unique_ptr< BlockTemplate > createNewBlock(const node::BlockCreateOptions &options={})=0
Construct a new block template.
void FindCoins(const NodeContext &node, std::map< COutPoint, Coin > &coins)
Look up unspent output information.
External signer interface used by the GUI.
void RPCSetTimerInterfaceIfUnset(RPCTimerInterface *iface)
Set the factory function for timer, but only, if unset.
std::unordered_set< Element, ByteVectorHash > ElementSet
virtual void initWarning(const bilingual_str &message)=0
Send init warning.
Generic interface for managing an event handler or callback function registered with another interfac...
virtual node::NodeContext * context()
Get internal node context.
static constexpr unsigned int DUST_RELAY_TX_FEE
Min feerate for defining dust.
int32_t nVersion
block header
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.
static transaction_identifier FromUint256(const uint256 &id)
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
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.
virtual void ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator)
Notifies listeners of the new active block chain on-disk.
bool AppInitSanityChecks(const kernel::Context &kernel)
Initialization sanity checks.
std::unique_ptr< Mining > MakeMining(node::NodeContext &node)
Return implementation of Mining interface.
const CTransactionRef m_tx
Fee rate in satoshis per kilovirtualbyte: CAmount / kvB.
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. ...
virtual void showProgress(const std::string &title, int progress, bool resume_possible)=0
Send progress indicator.
virtual void BlockConnected(ChainstateRole role, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex)
Notifies listeners of a block being connected.
std::unique_ptr< Handler > MakeSignalHandler(boost::signals2::connection connection)
Return handler wrapping a boost signal connection.
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.
virtual bool broadcastTransaction(const CTransactionRef &tx, const CAmount &max_tx_fee, bool relay, std::string &err_string)=0
Transaction is added to memory pool, if the transaction fee is below the amount specified by max_tx_f...
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
virtual util::Result< void > checkChainLimits(const CTransactionRef &tx)=0
Check if transaction will pass the mempool's chain limits.
CBlockIndex * GetAncestor(int height)
Efficiently find an ancestor of this block.
virtual CBlockLocator getTipLocator()=0
Get locator for the current chain tip.
void LockSettings(Fn &&fn)
Access settings with lock held.
full block available in blk*.dat
virtual CBlock getBlock()=0
int GetWitnessCommitmentIndex(const CBlock &block)
Compute at which vout of the block's coinbase transaction the witness commitment occurs, or -1 if not found.
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::vector< std::string > listCommands() const
Returns a list of registered commands.
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).
void UnregisterSharedValidationInterface(std::shared_ptr< CValidationInterface > callbacks)
Unregister subscriber.
unsigned int nTx
Number of transactions in this block.
std::unique_ptr< ChainstateManager > chainman
static GenTxid Txid(const uint256 &hash)
void InitParameterInteraction(ArgsManager &args)
Parameter interaction: change current parameters depending on various rules.
virtual bool havePruned()=0
Check if any block has been pruned.
#define Assert(val)
Identity function.
std::shared_ptr< Chain::Notifications > m_notifications
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...