if (fHelp || params.size() != 0)
throw runtime_error(
"getblockcount\n"
- "\nReturns the number of blocks in the longest block chain.\n"
+ "\nReturns the number of blocks in the best valid block chain.\n"
"\nResult:\n"
"n (numeric) The current block count\n"
"\nExamples:\n"
"\nArguments:\n"
"1. \"txid\" (string, required) The transaction id\n"
"2. n (numeric, required) vout value\n"
- "3. includemempool (boolean, optional) Whether to included the mem pool\n"
+ "3. includemempool (boolean, optional) Whether to include the mempool\n"
"\nResult:\n"
"{\n"
" \"bestblock\" : \"hash\", (string) the block hash\n"
return rv;
}
+static UniValue NetworkUpgradeDesc(const Consensus::Params& consensusParams, Consensus::UpgradeIndex idx, int height)
+{
+ UniValue rv(UniValue::VOBJ);
+ auto upgrade = NetworkUpgradeInfo[idx];
+ rv.push_back(Pair("name", upgrade.strName));
+ rv.push_back(Pair("activationheight", consensusParams.vUpgrades[idx].nActivationHeight));
+ switch (NetworkUpgradeState(height, consensusParams, idx)) {
+ case UPGRADE_DISABLED: rv.push_back(Pair("status", "disabled")); break;
+ case UPGRADE_PENDING: rv.push_back(Pair("status", "pending")); break;
+ case UPGRADE_ACTIVE: rv.push_back(Pair("status", "active")); break;
+ }
+ rv.push_back(Pair("info", upgrade.strInfo));
+ return rv;
+}
+
+void NetworkUpgradeDescPushBack(
+ UniValue& networkUpgrades,
+ const Consensus::Params& consensusParams,
+ Consensus::UpgradeIndex idx,
+ int height)
+{
+ // Network upgrades with an activation height of NO_ACTIVATION_HEIGHT are
+ // hidden. This is used when network upgrade implementations are merged
+ // without specifying the activation height.
+ if (consensusParams.vUpgrades[idx].nActivationHeight != Consensus::NetworkUpgrade::NO_ACTIVATION_HEIGHT) {
+ networkUpgrades.push_back(Pair(
+ HexInt(NetworkUpgradeInfo[idx].nBranchId),
+ NetworkUpgradeDesc(consensusParams, idx, height)));
+ }
+}
+
UniValue getblockchaininfo(const UniValue& 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"
+ "\nNote that when the chain tip is at the last block before a network upgrade activation,\n"
+ "consensus.chaintip != consensus.nextblock.\n"
"\nResult:\n"
"{\n"
" \"chain\": \"xxxx\", (string) current network name as defined in BIP70 (main, test, regtest)\n"
" },\n"
" \"reject\": { ... } (object) progress toward rejecting pre-softfork blocks (same fields as \"enforce\")\n"
" }, ...\n"
- " ]\n"
+ " ],\n"
+ " \"upgrades\": { (object) status of network upgrades\n"
+ " \"xxxx\" : { (string) branch ID of the upgrade\n"
+ " \"name\": \"xxxx\", (string) name of upgrade\n"
+ " \"activationheight\": xxxxxx, (numeric) block height of activation\n"
+ " \"status\": \"xxxx\", (string) status of upgrade\n"
+ " \"info\": \"xxxx\", (string) additional information about upgrade\n"
+ " }, ...\n"
+ " },\n"
+ " \"consensus\": { (object) branch IDs of the current and upcoming consensus rules\n"
+ " \"chaintip\": \"xxxxxxxx\", (string) branch ID used to validate the current chain tip\n"
+ " \"nextblock\": \"xxxxxxxx\" (string) branch ID that the next block will be validated under\n"
+ " }\n"
"}\n"
"\nExamples:\n"
+ HelpExampleCli("getblockchaininfo", "")
ZCIncrementalMerkleTree tree;
pcoinsTip->GetAnchorAt(pcoinsTip->GetBestAnchor(), tree);
- obj.push_back(Pair("commitments", tree.size()));
+ obj.push_back(Pair("commitments", static_cast<uint64_t>(tree.size())));
CBlockIndex* tip = chainActive.Tip();
UniValue valuePools(UniValue::VARR);
softforks.push_back(SoftForkDesc("bip65", 4, tip, consensusParams));
obj.push_back(Pair("softforks", softforks));
+ UniValue upgrades(UniValue::VOBJ);
+ for (int i = Consensus::UPGRADE_OVERWINTER; i < Consensus::MAX_NETWORK_UPGRADES; i++) {
+ NetworkUpgradeDescPushBack(upgrades, consensusParams, Consensus::UpgradeIndex(i), tip->nHeight);
+ }
+ obj.push_back(Pair("upgrades", upgrades));
+
+ UniValue consensus(UniValue::VOBJ);
+ consensus.push_back(Pair("chaintip", HexInt(CurrentEpochBranchId(tip->nHeight, consensusParams))));
+ consensus.push_back(Pair("nextblock", HexInt(CurrentEpochBranchId(tip->nHeight + 1, consensusParams))));
+ obj.push_back(Pair("consensus", consensus));
+
if (fPruneMode)
{
CBlockIndex *block = chainActive.Tip();