using namespace json_spirit;
using namespace std;
-Value getgenerate(const Array& params, bool fHelp)
+Value getmininginfo(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
throw runtime_error(
- "getgenerate\n"
- "Returns true or false.");
-
- return GetBoolArg("-gen");
-}
+ "getmininginfo\n"
+ "Returns an object containing mining-related information.");
+ double dStakeKernelsTriedAvg = 0;
+ int nPoWInterval = 72, nPoSInterval = 72, nStakesHandled = 0, nStakesTime = 0;
+ int64 nTargetSpacingWorkMin = 30, nTargetSpacingWork = 30;
-Value setgenerate(const Array& params, bool fHelp)
-{
- if (fHelp || params.size() < 1 || params.size() > 2)
- throw runtime_error(
- "setgenerate <generate> [genproclimit]\n"
- "<generate> is true or false to turn generation on or off.\n"
- "Generation is limited to [genproclimit] processors, -1 is unlimited.");
+ CBlockIndex* pindex = pindexGenesisBlock;
+ CBlockIndex* pindexPrevWork = pindexGenesisBlock;
+ CBlockIndex* pindexPrevStake = NULL;
- bool fGenerate = true;
- if (params.size() > 0)
- fGenerate = params[0].get_bool();
-
- if (params.size() > 1)
+ while (pindex)
{
- int nGenProcLimit = params[1].get_int();
- mapArgs["-genproclimit"] = itostr(nGenProcLimit);
- if (nGenProcLimit == 0)
- fGenerate = false;
- }
- mapArgs["-gen"] = (fGenerate ? "1" : "0");
+ if (pindex->IsProofOfWork())
+ {
+ int64 nActualSpacingWork = pindex->GetBlockTime() - pindexPrevWork->GetBlockTime();
+ nTargetSpacingWork = ((nPoWInterval - 1) * nTargetSpacingWork + nActualSpacingWork + nActualSpacingWork) / (nPoWInterval + 1);
+ nTargetSpacingWork = max(nTargetSpacingWork, nTargetSpacingWorkMin);
+ pindexPrevWork = pindex;
+ }
- GenerateBitcoins(fGenerate, pwalletMain);
- return Value::null;
-}
+ pindex = pindex->pnext;
+ }
-Value gethashespersec(const Array& params, bool fHelp)
-{
- if (fHelp || params.size() != 0)
- throw runtime_error(
- "gethashespersec\n"
- "Returns a recent hashes per second performance measurement while generating.");
+ pindex = pindexBest;
- if (GetTimeMillis() - nHPSTimerStart > 8000)
- return (boost::int64_t)0;
- return (boost::int64_t)dHashesPerSec;
-}
+ while (pindex && nStakesHandled < nPoSInterval)
+ {
+ if (pindex->IsProofOfStake())
+ {
+ dStakeKernelsTriedAvg += GetDifficulty(pindex) * 4294967296;
+ nStakesTime += pindexPrevStake ? (pindexPrevStake->nTime - pindex->nTime) : 0;
+ pindexPrevStake = pindex;
+ nStakesHandled++;
+ }
+ pindex = pindex->pprev;
+ }
-Value getmininginfo(const Array& params, bool fHelp)
-{
- if (fHelp || params.size() != 0)
- throw runtime_error(
- "getmininginfo\n"
- "Returns an object containing mining-related information.");
+ double dNetworkMhps = GetDifficulty() * 4294.967296 / nTargetSpacingWork;
+ double dNetworkWeight = dStakeKernelsTriedAvg / nStakesTime;
Object obj;
obj.push_back(Pair("blocks", (int)nBestHeight));
obj.push_back(Pair("currentblocksize",(uint64_t)nLastBlockSize));
obj.push_back(Pair("currentblocktx",(uint64_t)nLastBlockTx));
obj.push_back(Pair("difficulty", (double)GetDifficulty()));
+ obj.push_back(Pair("blockvalue", (uint64_t)GetProofOfWorkReward(GetLastBlockIndex(pindexBest, false)->nBits)));
+ obj.push_back(Pair("netmhashps", dNetworkMhps));
+ obj.push_back(Pair("netstakeweight", dNetworkWeight));
obj.push_back(Pair("errors", GetWarnings("statusbar")));
- obj.push_back(Pair("generate", GetBoolArg("-gen")));
- obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1)));
- obj.push_back(Pair("hashespersec", gethashespersec(params, false)));
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
+ obj.push_back(Pair("stakeweight", (uint64_t)pwalletMain->GetStakeWeight(*pwalletMain, STAKE_NORMAL)));
+ obj.push_back(Pair("minweight", (uint64_t)pwalletMain->GetStakeWeight(*pwalletMain, STAKE_MINWEIGHT)));
+ obj.push_back(Pair("maxweight", (uint64_t)pwalletMain->GetStakeWeight(*pwalletMain, STAKE_MAXWEIGHT)));
+ obj.push_back(Pair("stakeinterest", (uint64_t)GetProofOfStakeReward(0, GetLastBlockIndex(pindexBest, true)->nBits, GetLastBlockIndex(pindexBest, true)->nTime, true)));
obj.push_back(Pair("testnet", fTestNet));
return obj;
}