#include "main.h"
#include "db.h"
+#include "txdb.h"
#include "init.h"
+#include "miner.h"
#include "bitcoinrpc.h"
using namespace json_spirit;
using namespace std;
+Value getsubsidy(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() > 1)
+ throw runtime_error(
+ "getsubsidy [nTarget]\n"
+ "Returns proof-of-work subsidy value for the specified value of target.");
+
+ unsigned int nBits = 0;
+
+ if (params.size() != 0)
+ {
+ CBigNum bnTarget(uint256(params[0].get_str()));
+ nBits = bnTarget.GetCompact();
+ }
+ else
+ {
+ nBits = GetNextTargetRequired(pindexBest, false);
+ }
+
+ return (uint64_t)GetProofOfWorkReward(nBits);
+}
+
Value getmininginfo(const Array& params, bool fHelp)
{
if (fHelp || params.size() != 0)
"getmininginfo\n"
"Returns an object containing mining-related information.");
- int64 nTargetSpacingWorkMin = 30;
- int64 nTargetSpacingWork = nTargetSpacingWorkMin;
- int64 nPoWInterval = 72;
- int64 nTargetSpacingStake = 10;
+ float nKernelsRate = 0, nCoinDaysRate = 0;
+ pwalletMain->GetStakeStats(nKernelsRate, nCoinDaysRate);
- CBlockIndex* pindex = pindexGenesisBlock;
- CBlockIndex* pindexPrevWork = pindexGenesisBlock;
-
- while (pindex)
- {
- if (pindex->IsProofOfWork())
- {
- int64 nActualSpacingWork = pindex->GetBlockTime() - pindexPrevWork->GetBlockTime();
- nTargetSpacingWork = ((nPoWInterval - 1) * nTargetSpacingWork + nActualSpacingWork + nActualSpacingWork) / (nPoWInterval + 1);
- nTargetSpacingWork = max(nTargetSpacingWork, nTargetSpacingWorkMin);
- pindexPrevWork = pindex;
- }
-
- pindex = pindex->pnext;
- }
-
- double dNetworkMhps = GetDifficulty() * 4294.967296 / nTargetSpacingWork;
- int nNetworkWeight = GetDifficulty(GetLastBlockIndex(pindexBest, true)) * 4294967296 / nTargetSpacingStake;
-
- Object obj;
+ Object obj, diff, weight;
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("netmhashps", dNetworkMhps));
- obj.push_back(Pair("netstakeweight", nNetworkWeight));
+
+ diff.push_back(Pair("proof-of-work", GetDifficulty()));
+ diff.push_back(Pair("proof-of-stake", GetDifficulty(GetLastBlockIndex(pindexBest, true))));
+ diff.push_back(Pair("search-interval", (int)nLastCoinStakeSearchInterval));
+ obj.push_back(Pair("difficulty", diff));
+
+ obj.push_back(Pair("blockvalue", (uint64_t)GetProofOfWorkReward(GetLastBlockIndex(pindexBest, false)->nBits)));
+ obj.push_back(Pair("netmhashps", GetPoWMHashPS()));
+ obj.push_back(Pair("netstakeweight", GetPoSKernelPS()));
obj.push_back(Pair("errors", GetWarnings("statusbar")));
obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
- obj.push_back(Pair("stakepower", (uint64_t)pwalletMain->GetStakeMintPower(*pwalletMain)));
+
+ weight.push_back(Pair("kernelsrate", nKernelsRate));
+ weight.push_back(Pair("cdaysrate", nCoinDaysRate));
+ obj.push_back(Pair("stakestats", weight));
+
+ 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;
}
// Update block
static unsigned int nTransactionsUpdatedLast;
static CBlockIndex* pindexPrev;
- static int64 nStart;
+ static int64_t nStart;
static CBlock* pblock;
if (pindexPrev != pindexBest ||
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60))
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
- if (!fTestNet && pblock->GetBlockTime() < CHAINCHECKS_SWITCH_TIME)
- {
- if (!pblock->SignBlock(*pwalletMain))
- throw JSONRPCError(-100, "Unable to sign block, wallet locked?");
- }
-
return CheckWork(pblock, *pwalletMain, reservekey);
}
}
// Update block
static unsigned int nTransactionsUpdatedLast;
static CBlockIndex* pindexPrev;
- static int64 nStart;
+ static int64_t nStart;
static CBlock* pblock;
if (pindexPrev != pindexBest ||
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 60))
pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second;
pblock->hashMerkleRoot = pblock->BuildMerkleTree();
- if (!fTestNet && pblock->GetBlockTime() < CHAINCHECKS_SWITCH_TIME)
- {
- if (!pblock->SignBlock(*pwalletMain))
- throw JSONRPCError(-100, "Unable to sign block, wallet locked?");
- }
-
return CheckWork(pblock, *pwalletMain, reservekey);
}
}
// Update block
static unsigned int nTransactionsUpdatedLast;
static CBlockIndex* pindexPrev;
- static int64 nStart;
+ static int64_t nStart;
static CBlock* pblock;
if (pindexPrev != pindexBest ||
(nTransactionsUpdated != nTransactionsUpdatedLast && GetTime() - nStart > 5))
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
}
- if (!fTestNet && block.GetBlockTime() < CHAINCHECKS_SWITCH_TIME)
- {
- if (!block.SignBlock(*pwalletMain))
- throw JSONRPCError(-100, "Unable to sign block, wallet locked?");
- }
-
bool fAccepted = ProcessBlock(NULL, &block);
if (!fAccepted)
return "rejected";