using namespace std;
extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, json_spirit::Object& entry);
+extern enum Checkpoints::CPMode CheckpointsMode;
double GetDifficulty(const CBlockIndex* blockindex)
{
return dDiff;
}
+double GetPoWMHashPS()
+{
+ int nPoWInterval = 72;
+ int64 nTargetSpacingWorkMin = 30, nTargetSpacingWork = 30;
+
+ 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;
+ }
+
+ return GetDifficulty() * 4294.967296 / nTargetSpacingWork;
+}
+
+double GetPoSKernelPS()
+{
+ int nPoSInterval = 72;
+ double dStakeKernelsTriedAvg = 0;
+ int nStakesHandled = 0, nStakesTime = 0;
+
+ CBlockIndex* pindex = pindexBest;;
+ CBlockIndex* pindexPrevStake = NULL;
+
+ while (pindex && nStakesHandled < nPoSInterval)
+ {
+ if (pindex->IsProofOfStake())
+ {
+ dStakeKernelsTriedAvg += GetDifficulty(pindex) * 4294967296.0;
+ nStakesTime += pindexPrevStake ? (pindexPrevStake->nTime - pindex->nTime) : 0;
+ pindexPrevStake = pindex;
+ nStakesHandled++;
+ }
+
+ pindex = pindex->pprev;
+ }
+
+ return dStakeKernelsTriedAvg / nStakesTime;
+}
Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool fPrintTransactionDetail)
{
result.push_back(Pair("nonce", (boost::uint64_t)block.nNonce));
result.push_back(Pair("bits", HexBits(block.nBits)));
result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
-
+ result.push_back(Pair("blocktrust", leftTrim(blockindex->GetBlockTrust().GetHex(), '0')));
+ result.push_back(Pair("chaintrust", leftTrim(blockindex->nChainTrust.GetHex(), '0')));
if (blockindex->pprev)
result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex()));
if (blockindex->pnext)
result.push_back(Pair("tx", txinfo));
- if (!fTestNet && block.GetBlockTime() < CHAINCHECKS_SWITCH_TIME)
+ if ( block.IsProofOfStake() || (!fTestNet && block.GetBlockTime() < ENTROPY_SWITCH_TIME) )
result.push_back(Pair("signature", HexStr(block.vchBlockSig.begin(), block.vchBlockSig.end())));
return result;
}
+Value getbestblockhash(const Array& params, bool fHelp)
+{
+ if (fHelp || params.size() != 0)
+ throw runtime_error(
+ "getbestblockhash\n"
+ "Returns the hash of the best block in the longest block chain.");
+
+ return hashBestChain.GetHex();
+}
Value getblockcount(const Array& params, bool fHelp)
{
CBlockIndex* pindexCheckpoint;
result.push_back(Pair("synccheckpoint", Checkpoints::hashSyncCheckpoint.ToString().c_str()));
- pindexCheckpoint = mapBlockIndex[Checkpoints::hashSyncCheckpoint];
+ pindexCheckpoint = mapBlockIndex[Checkpoints::hashSyncCheckpoint];
result.push_back(Pair("height", pindexCheckpoint->nHeight));
result.push_back(Pair("timestamp", DateTimeStrFormat(pindexCheckpoint->GetBlockTime()).c_str()));
+
+ // Check that the block satisfies synchronized checkpoint
+ if (CheckpointsMode == Checkpoints::STRICT)
+ result.push_back(Pair("policy", "strict"));
+
+ if (CheckpointsMode == Checkpoints::ADVISORY)
+ result.push_back(Pair("policy", "advisory"));
+
+ if (CheckpointsMode == Checkpoints::PERMISSIVE)
+ result.push_back(Pair("policy", "permissive"));
+
if (mapArgs.count("-checkpointkey"))
result.push_back(Pair("checkpointmaster", true));