rpc: add getblockchaininfo
and getnetworkinfo
Adds two new info query commands that take over information from hodge-podge `getinfo`. Also some new information is added: - `getblockchaininfo` - `chain`: (string) current chain (main, testnet3, regtest) - `verificationprogress: (numeric) estimated verification progress - `chainwork` - `getnetworkinfo` - `localaddresses`: (array) local addresses, from mapLocalHost (fixes #1734)
This commit is contained in:
parent
d4ffe4e425
commit
d387b8ec15
6 changed files with 100 additions and 7 deletions
|
@ -44,18 +44,13 @@ static const int MAX_OUTBOUND_CONNECTIONS = 8;
|
||||||
bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false);
|
bool OpenNetworkConnection(const CAddress& addrConnect, CSemaphoreGrant *grantOutbound = NULL, const char *strDest = NULL, bool fOneShot = false);
|
||||||
|
|
||||||
|
|
||||||
struct LocalServiceInfo {
|
|
||||||
int nScore;
|
|
||||||
int nPort;
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global state variables
|
// Global state variables
|
||||||
//
|
//
|
||||||
bool fDiscover = true;
|
bool fDiscover = true;
|
||||||
uint64_t nLocalServices = NODE_NETWORK;
|
uint64_t nLocalServices = NODE_NETWORK;
|
||||||
static CCriticalSection cs_mapLocalHost;
|
CCriticalSection cs_mapLocalHost;
|
||||||
static map<CNetAddr, LocalServiceInfo> mapLocalHost;
|
map<CNetAddr, LocalServiceInfo> mapLocalHost;
|
||||||
static bool vfReachable[NET_MAX] = {};
|
static bool vfReachable[NET_MAX] = {};
|
||||||
static bool vfLimited[NET_MAX] = {};
|
static bool vfLimited[NET_MAX] = {};
|
||||||
static CNode* pnodeLocalHost = NULL;
|
static CNode* pnodeLocalHost = NULL;
|
||||||
|
|
|
@ -116,6 +116,13 @@ extern CCriticalSection cs_vAddedNodes;
|
||||||
extern NodeId nLastNodeId;
|
extern NodeId nLastNodeId;
|
||||||
extern CCriticalSection cs_nLastNodeId;
|
extern CCriticalSection cs_nLastNodeId;
|
||||||
|
|
||||||
|
struct LocalServiceInfo {
|
||||||
|
int nScore;
|
||||||
|
int nPort;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern CCriticalSection cs_mapLocalHost;
|
||||||
|
extern map<CNetAddr, LocalServiceInfo> mapLocalHost;
|
||||||
|
|
||||||
class CNodeStats
|
class CNodeStats
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include "rpcserver.h"
|
#include "rpcserver.h"
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
#include "sync.h"
|
#include "sync.h"
|
||||||
|
#include "checkpoints.h"
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
@ -429,3 +430,38 @@ Value verifychain(const Array& params, bool fHelp)
|
||||||
return VerifyDB(nCheckLevel, nCheckDepth);
|
return VerifyDB(nCheckLevel, nCheckDepth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value getblockchaininfo(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw runtime_error(
|
||||||
|
"getblockchaininfo\n"
|
||||||
|
"Returns an object containing various state info regarding block chain processing.\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"chain\": \"xxxx\", (string) current chain (main, testnet3, regtest)\n"
|
||||||
|
" \"blocks\": xxxxxx, (numeric) the current number of blocks processed in the server\n"
|
||||||
|
" \"bestblockhash\": \"...\", (string) the hash of the currently best block\n"
|
||||||
|
" \"difficulty\": xxxxxx, (numeric) the current difficulty\n"
|
||||||
|
" \"verificationprogress\": xxxx, (numeric) estimate of verification progress [0..1]\n"
|
||||||
|
" \"chainwork\": \"xxxx\" (string) total amount of work in active chain, in hexadecimal\n"
|
||||||
|
"}\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("getblockchaininfo", "")
|
||||||
|
+ HelpExampleRpc("getblockchaininfo", "")
|
||||||
|
);
|
||||||
|
|
||||||
|
proxyType proxy;
|
||||||
|
GetProxy(NET_IPV4, proxy);
|
||||||
|
|
||||||
|
Object obj;
|
||||||
|
std::string chain = Params().DataDir();
|
||||||
|
if(chain.empty())
|
||||||
|
chain = "main";
|
||||||
|
obj.push_back(Pair("chain", chain));
|
||||||
|
obj.push_back(Pair("blocks", (int)chainActive.Height()));
|
||||||
|
obj.push_back(Pair("bestblockhash", chainActive.Tip()->GetBlockHash().GetHex()));
|
||||||
|
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
|
||||||
|
obj.push_back(Pair("verificationprogress", Checkpoints::GuessVerificationProgress(chainActive.Tip())));
|
||||||
|
obj.push_back(Pair("chainwork", chainActive.Tip()->nChainWork.GetHex()));
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
|
@ -333,3 +333,54 @@ Value getnettotals(const Array& params, bool fHelp)
|
||||||
obj.push_back(Pair("timemillis", static_cast<boost::int64_t>(GetTimeMillis())));
|
obj.push_back(Pair("timemillis", static_cast<boost::int64_t>(GetTimeMillis())));
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Value getnetworkinfo(const Array& params, bool fHelp)
|
||||||
|
{
|
||||||
|
if (fHelp || params.size() != 0)
|
||||||
|
throw runtime_error(
|
||||||
|
"getnetworkinfo\n"
|
||||||
|
"Returns an object containing various state info regarding P2P networking.\n"
|
||||||
|
"\nResult:\n"
|
||||||
|
"{\n"
|
||||||
|
" \"version\": xxxxx, (numeric) the server version\n"
|
||||||
|
" \"protocolversion\": xxxxx, (numeric) the protocol version\n"
|
||||||
|
" \"timeoffset\": xxxxx, (numeric) the time offset\n"
|
||||||
|
" \"connections\": xxxxx, (numeric) the number of connections\n"
|
||||||
|
" \"proxy\": \"host:port\", (string, optional) the proxy used by the server\n"
|
||||||
|
" \"relayfee\": x.xxxx, (numeric) minimum relay fee for non-free transactions in btc/kb\n"
|
||||||
|
" \"localaddresses\": [, (array) list of local addresses\n"
|
||||||
|
" \"address\": \"xxxx\", (string) network address\n"
|
||||||
|
" \"port\": xxx, (numeric) network port\n"
|
||||||
|
" \"score\": xxx (numeric) relative score\n"
|
||||||
|
" ]\n"
|
||||||
|
"}\n"
|
||||||
|
"\nExamples:\n"
|
||||||
|
+ HelpExampleCli("getnetworkinfo", "")
|
||||||
|
+ HelpExampleRpc("getnetworkinfo", "")
|
||||||
|
);
|
||||||
|
|
||||||
|
proxyType proxy;
|
||||||
|
GetProxy(NET_IPV4, proxy);
|
||||||
|
|
||||||
|
Object obj;
|
||||||
|
obj.push_back(Pair("version", (int)CLIENT_VERSION));
|
||||||
|
obj.push_back(Pair("protocolversion",(int)PROTOCOL_VERSION));
|
||||||
|
obj.push_back(Pair("timeoffset", (boost::int64_t)GetTimeOffset()));
|
||||||
|
obj.push_back(Pair("connections", (int)vNodes.size()));
|
||||||
|
obj.push_back(Pair("proxy", (proxy.first.IsValid() ? proxy.first.ToStringIPPort() : string())));
|
||||||
|
obj.push_back(Pair("relayfee", ValueFromAmount(CTransaction::nMinRelayTxFee)));
|
||||||
|
Array localAddresses;
|
||||||
|
{
|
||||||
|
LOCK(cs_mapLocalHost);
|
||||||
|
BOOST_FOREACH(const PAIRTYPE(CNetAddr, LocalServiceInfo) &item, mapLocalHost)
|
||||||
|
{
|
||||||
|
Object rec;
|
||||||
|
rec.push_back(Pair("address", item.first.ToString()));
|
||||||
|
rec.push_back(Pair("port", item.second.nPort));
|
||||||
|
rec.push_back(Pair("score", item.second.nScore));
|
||||||
|
localAddresses.push_back(rec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
obj.push_back(Pair("localaddresses", localAddresses));
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
|
@ -228,6 +228,7 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "stop", &stop, true, true, false },
|
{ "stop", &stop, true, true, false },
|
||||||
|
|
||||||
/* P2P networking */
|
/* P2P networking */
|
||||||
|
{ "getnetworkinfo", &getnetworkinfo, true, false, false },
|
||||||
{ "addnode", &addnode, true, true, false },
|
{ "addnode", &addnode, true, true, false },
|
||||||
{ "getaddednodeinfo", &getaddednodeinfo, true, true, false },
|
{ "getaddednodeinfo", &getaddednodeinfo, true, true, false },
|
||||||
{ "getconnectioncount", &getconnectioncount, true, false, false },
|
{ "getconnectioncount", &getconnectioncount, true, false, false },
|
||||||
|
@ -236,6 +237,7 @@ static const CRPCCommand vRPCCommands[] =
|
||||||
{ "ping", &ping, true, false, false },
|
{ "ping", &ping, true, false, false },
|
||||||
|
|
||||||
/* Block chain and UTXO */
|
/* Block chain and UTXO */
|
||||||
|
{ "getblockchaininfo", &getblockchaininfo, true, false, false },
|
||||||
{ "getbestblockhash", &getbestblockhash, true, false, false },
|
{ "getbestblockhash", &getbestblockhash, true, false, false },
|
||||||
{ "getblockcount", &getblockcount, true, false, false },
|
{ "getblockcount", &getblockcount, true, false, false },
|
||||||
{ "getblock", &getblock, false, false, false },
|
{ "getblock", &getblock, false, false, false },
|
||||||
|
|
|
@ -164,6 +164,8 @@ extern json_spirit::Value encryptwallet(const json_spirit::Array& params, bool f
|
||||||
extern json_spirit::Value validateaddress(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value validateaddress(const json_spirit::Array& params, bool fHelp);
|
||||||
extern json_spirit::Value getinfo(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value getinfo(const json_spirit::Array& params, bool fHelp);
|
||||||
extern json_spirit::Value getwalletinfo(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value getwalletinfo(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value getblockchaininfo(const json_spirit::Array& params, bool fHelp);
|
||||||
|
extern json_spirit::Value getnetworkinfo(const json_spirit::Array& params, bool fHelp);
|
||||||
|
|
||||||
extern json_spirit::Value getrawtransaction(const json_spirit::Array& params, bool fHelp); // in rcprawtransaction.cpp
|
extern json_spirit::Value getrawtransaction(const json_spirit::Array& params, bool fHelp); // in rcprawtransaction.cpp
|
||||||
extern json_spirit::Value listunspent(const json_spirit::Array& params, bool fHelp);
|
extern json_spirit::Value listunspent(const json_spirit::Array& params, bool fHelp);
|
||||||
|
|
Loading…
Reference in a new issue