6#include <bitcoin-build-config.h>
10#include <chainparams.h>
47#ifdef HAVE_MALLOC_INFO
58 "Set the local time to given timestamp (-regtest only)\n",
61 "Pass 0 to go back to using the system time."},
68 throw std::runtime_error(
"setmocktime is for regression testing (-regtest mode) only");
78 const int64_t time{request.params[0].getInt<int64_t>()};
81 constexpr int64_t max_time{std::numeric_limits<uint32_t>::max()};
82 if (time < 0 || time > max_time) {
88 for (
const auto& chain_client : node_context.chain_clients) {
89 chain_client->setMockTime(time);
101 "Bump the scheduler into the future (-regtest only)\n",
110 throw std::runtime_error(
"mockscheduler is for regression testing (-regtest mode) only");
113 int64_t delta_seconds = request.params[0].getInt<int64_t>();
114 if (delta_seconds <= 0 || delta_seconds > 3600) {
115 throw std::runtime_error(
"delta_time must be between 1 and 3600 seconds (1 hr)");
119 CHECK_NONFATAL(node_context.scheduler)->MockForward(std::chrono::seconds{delta_seconds});
120 CHECK_NONFATAL(node_context.validation_signals)->SyncWithValidationInterfaceQueue();
121 for (
const auto& chain_client : node_context.chain_clients) {
122 chain_client->schedulerMockForward(std::chrono::seconds(delta_seconds));
143#ifdef HAVE_MALLOC_INFO
144static std::string RPCMallocInfo()
148 FILE *f = open_memstream(&ptr, &size);
153 std::string rv(ptr, size);
168 "Returns an object containing information about memory usage.\n",
171 " - \"stats\" returns general statistics about memory usage in the daemon.\n"
172 " - \"mallocinfo\" returns an XML string describing low-level heap state (only available if compiled with glibc)."},
183 {
RPCResult::Type::NUM,
"locked",
"Amount of bytes that succeeded locking. If this number is smaller than total, locking pages failed at some point and key data could be swapped to disk."},
199 auto mode{self.
Arg<std::string_view>(
"mode")};
200 if (mode ==
"stats") {
204 }
else if (mode ==
"mallocinfo") {
205#ifdef HAVE_MALLOC_INFO
206 return RPCMallocInfo();
219 for (
unsigned int i = 0; i < cats.
size(); ++i) {
220 std::string cat = cats[i].
get_str();
238 "Gets and sets the logging configuration.\n"
239 "When called without an argument, returns the list of categories with status that are currently being debug logged or not.\n"
240 "When called with arguments, adds or removes categories from debug logging and return the lists above.\n"
241 "The arguments are evaluated in order \"include\", \"exclude\".\n"
242 "If an item is both included and excluded, it will thus end up being excluded.\n"
244 "In addition, the following are available as category names with special meanings:\n"
245 " - \"all\", \"1\" : represent all logging categories.\n"
269 if (request.params[0].isArray()) {
272 if (request.params[1].isArray()) {
277 for (
const auto& logCatActive :
LogInstance().LogCategoriesList()) {
278 result.
pushKV(logCatActive.category, logCatActive.active);
290 "Simply echo back the input arguments. This command is for testing.\n"
291 "\nIt will return an internal bug report when arg9='trigger_internal_bug' is passed.\n"
292 "\nThe difference between echo and echojson is that echojson has argument conversion enabled in the client-side table in "
293 "bitcoin-cli and the GUI. There is no server-side difference.",
310 if (request.params[9].isStr()) {
311 CHECK_NONFATAL(request.params[9].get_str() !=
"trigger_internal_bug");
314 return request.params;
326 "Echo back the input argument, passing it through a spawned process in a multiprocess build.\n"
327 "This command is for testing.\n",
334 std::unique_ptr<interfaces::Echo>
echo;
344 auto init =
ipc->spawnProcess(
"bitcoin-node");
355 return echo->echo(request.params[0].get_str());
363 if (!index_name.empty() && index_name != summary.name)
return ret_summary;
366 entry.
pushKV(
"synced", summary.synced);
367 entry.
pushKV(
"best_block_height", summary.best_block_height);
368 ret_summary.
pushKV(summary.name, std::move(entry));
376 "Returns the status of one or all available indices currently running in the node.\n",
400 const std::string index_name{self.
MaybeArg<std::string_view>(
"index_name").value_or(
"")};
435 for (
const auto& c : commands) {
436 t.appendCommand(c.name, &c);
void ForEachBlockFilterIndex(std::function< void(BlockFilterIndex &)> fn)
Iterate over all running block filter indexes, invoking fn on each.
const CChainParams & Params()
Return the currently selected parameters.
#define CHECK_NONFATAL(condition)
Identity function.
void EnableCategory(LogFlags flag)
std::string LogCategoriesString() const
Returns a string with the log categories in alphabetical order.
void DisableCategory(LogFlags flag)
IndexSummary GetSummary() const
Get a summary of the index and its state.
BlockFilterIndex is used to store and retrieve block filters, hashes, and headers for a range of bloc...
bool IsMockableChain() const
If this chain allows time to be mocked.
Stats stats() const
Get pool usage statistics.
static LockedPoolManager & Instance()
Return the current instance, or create it once.
auto MaybeArg(std::string_view key) const
Helper to get an optional request argument.
auto Arg(std::string_view key) const
Helper to get a required or default-valued request argument.
const std::string & get_str() const
void pushKVs(UniValue obj)
const UniValue & get_array() const
void pushKV(std::string key, UniValue val)
Initial interface created when a process is first started, and used to give and get access to other i...
virtual std::unique_ptr< Echo > makeEcho()
Interface providing access to interprocess-communication (IPC) functionality.
std::unique_ptr< CoinStatsIndex > g_coin_stats_index
The global UTXO set hash object.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
BCLog::Logger & LogInstance()
void RegisterNodeRPCCommands(CRPCTable &t)
static void EnableOrDisableLogCategories(UniValue cats, bool enable)
static RPCMethod getmemoryinfo()
static UniValue RPCLockedMemoryInfo()
static RPCMethod echoipc()
static RPCMethod echo(const std::string &name)
static RPCMethod echojson()
static RPCMethod setmocktime()
static RPCMethod getindexinfo()
static RPCMethod logging()
static UniValue SummaryToJSON(const IndexSummary &&summary, std::string index_name)
static RPCMethod mockscheduler()
UniValue JSONRPCError(int code, const std::string &message)
@ RPC_INVALID_PARAMETER
Invalid, missing or duplicate parameter.
std::string HelpExampleCli(const std::string &methodname, const std::string &args)
std::string HelpExampleRpc(const std::string &methodname, const std::string &args)
const std::string UNIX_EPOCH_TIME
String used to describe UNIX epoch time in documentation, factored out to a constant for consistency.
NodeContext & EnsureAnyNodeContext(const std::any &context)
@ OMITTED
Optional argument for which the default value is omitted from help text for one of two reasons:
@ ANY
Special type to disable type checks.
@ OBJ_DYN
Special dictionary with keys that are not literals.
NodeContext struct containing references to chain state and connection state.
interfaces::Init * init
Init interface for initializing current process and connecting to other processes.
std::unique_ptr< TxIndex > g_txindex
The global transaction index, used in GetTransaction. May be null.
std::unique_ptr< TxoSpenderIndex > g_txospenderindex
The global txo spender index. May be null.
void SetMockTime(std::chrono::time_point< NodeClock, std::chrono::seconds > mock)