X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Frpcblockchain.cpp;h=69e436ce91811027806ebe0cc0966de4220c92da;hb=HEAD;hp=8d2f3892238bf2baf83c456233d15d88ddce617a;hpb=086e4fae8b918e0844d7a306acdd0683bec729db;p=novacoin.git diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 8d2f389..c537a46 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -5,11 +5,14 @@ #include "main.h" #include "bitcoinrpc.h" +#include +#include +#include using namespace json_spirit; using namespace std; -extern void TxToJSON(const CTransaction& tx, const uint256 hashBlock, json_spirit::Object& entry); +extern void TxToJSON(const CTransaction& tx, const uint256& hashBlock, json_spirit::Object& entry); extern enum Checkpoints::CPMode CheckpointsMode; double GetDifficulty(const CBlockIndex* blockindex) @@ -46,7 +49,7 @@ double GetDifficulty(const CBlockIndex* blockindex) double GetPoWMHashPS() { int nPoWInterval = 72; - int64 nTargetSpacingWorkMin = 30, nTargetSpacingWork = 30; + int64_t nTargetSpacingWorkMin = 30, nTargetSpacingWork = 30; CBlockIndex* pindex = pindexGenesisBlock; CBlockIndex* pindexPrevWork = pindexGenesisBlock; @@ -55,7 +58,7 @@ double GetPoWMHashPS() { if (pindex->IsProofOfWork()) { - int64 nActualSpacingWork = pindex->GetBlockTime() - pindexPrevWork->GetBlockTime(); + int64_t nActualSpacingWork = pindex->GetBlockTime() - pindexPrevWork->GetBlockTime(); nTargetSpacingWork = ((nPoWInterval - 1) * nTargetSpacingWork + nActualSpacingWork + nActualSpacingWork) / (nPoWInterval + 1); nTargetSpacingWork = max(nTargetSpacingWork, nTargetSpacingWorkMin); pindexPrevWork = pindex; @@ -73,7 +76,7 @@ double GetPoSKernelPS() double dStakeKernelsTriedAvg = 0; int nStakesHandled = 0, nStakesTime = 0; - CBlockIndex* pindex = pindexBest;; + CBlockIndex* pindex = pindexBest; CBlockIndex* pindexPrevStake = NULL; while (pindex && nStakesHandled < nPoSInterval) @@ -89,13 +92,16 @@ double GetPoSKernelPS() pindex = pindex->pprev; } + if (!nStakesHandled) + return 0; + return dStakeKernelsTriedAvg / nStakesTime; } Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool fPrintTransactionDetail) { Object result; - result.push_back(Pair("hash", block.GetHash().GetHex())); + result.push_back(Pair("hash", blockindex->GetBlockHash().GetHex())); CMerkleTx txGen(block.vtx[0]); txGen.SetMerkleBranch(&block); result.push_back(Pair("confirmations", (int)txGen.GetDepthInMainChain())); @@ -104,8 +110,8 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool fPri result.push_back(Pair("version", block.nVersion)); result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex())); result.push_back(Pair("mint", ValueFromAmount(blockindex->nMint))); - result.push_back(Pair("time", (boost::int64_t)block.GetBlockTime())); - result.push_back(Pair("nonce", (boost::uint64_t)block.nNonce)); + result.push_back(Pair("time", (int64_t)block.GetBlockTime())); + result.push_back(Pair("nonce", (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'))); @@ -118,10 +124,10 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool fPri result.push_back(Pair("flags", strprintf("%s%s", blockindex->IsProofOfStake()? "proof-of-stake" : "proof-of-work", blockindex->GeneratedStakeModifier()? " stake-modifier": ""))); result.push_back(Pair("proofhash", blockindex->IsProofOfStake()? blockindex->hashProofOfStake.GetHex() : blockindex->GetBlockHash().GetHex())); result.push_back(Pair("entropybit", (int)blockindex->GetStakeEntropyBit())); - result.push_back(Pair("modifier", strprintf("%016"PRI64x, blockindex->nStakeModifier))); + result.push_back(Pair("modifier", strprintf("%016" PRIx64, blockindex->nStakeModifier))); result.push_back(Pair("modifierchecksum", strprintf("%08x", blockindex->nStakeModifierChecksum))); Array txinfo; - BOOST_FOREACH (const CTransaction& tx, block.vtx) + for (const CTransaction& tx : block.vtx) { if (fPrintTransactionDetail) { @@ -137,7 +143,7 @@ Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool fPri result.push_back(Pair("tx", txinfo)); - if ( block.IsProofOfStake() || (!fTestNet && block.GetBlockTime() < ENTROPY_SWITCH_TIME) ) + if ( block.IsProofOfStake() ) result.push_back(Pair("signature", HexStr(block.vchBlockSig.begin(), block.vchBlockSig.end()))); return result; @@ -203,7 +209,7 @@ Value getrawmempool(const Array& params, bool fHelp) mempool.queryHashes(vtxid); Array a; - BOOST_FOREACH(const uint256& hash, vtxid) + for (const uint256& hash : vtxid) a.push_back(hash.ToString()); return a; @@ -249,7 +255,7 @@ Value getblockbynumber(const Array& params, bool fHelp) { if (fHelp || params.size() < 1 || params.size() > 2) throw runtime_error( - "getblock [txinfo]\n" + "getblockbynumber [txinfo]\n" "txinfo optional to print more detailed tx info\n" "Returns details of a block with given block-number."); @@ -262,15 +268,94 @@ Value getblockbynumber(const Array& params, bool fHelp) while (pblockindex->nHeight > nHeight) pblockindex = pblockindex->pprev; - uint256 hash = *pblockindex->phashBlock; - - pblockindex = mapBlockIndex[hash]; + pblockindex = mapBlockIndex[*pblockindex->phashBlock]; block.ReadFromDisk(pblockindex, true); return blockToJSON(block, pblockindex, params.size() > 1 ? params[1].get_bool() : false); } -// ppcoin: get information of sync-checkpoint +bool ExportBlock(const string& strBlockHash, const CDataStream& ssBlock) +{ + boost::filesystem::path pathDest = GetDataDir() / strBlockHash; + if (boost::filesystem::is_directory(pathDest)) + pathDest /= strBlockHash; + + try { + boost::iostreams::stream_buffer buf(pathDest.string()); + ostream exportStream(&buf); + exportStream << HexStr(ssBlock.begin(), ssBlock.end()); + exportStream.flush(); + + printf("Successfully exported block to %s\n", pathDest.string().c_str()); + return true; + } catch(const boost::filesystem::filesystem_error &e) { + printf("error exporting the block data %s (%s)\n", pathDest.string().c_str(), e.what()); + return false; + } +} + + +Value dumpblock(const Array& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "dumpblock [destination]\n" + "Returns serialized contents of a block with given block-hash."); + + std::string strHash = params[0].get_str(); + uint256 hash(strHash); + + if (mapBlockIndex.count(hash) == 0) + throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, "Block not found"); + + CBlock block; + CBlockIndex* pblockindex = mapBlockIndex[hash]; + block.ReadFromDisk(pblockindex, true); + + CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION); + ssBlock << block; + + if (params.size() > 1) + { + return ExportBlock(params[1].get_str(), ssBlock); + } + + return HexStr(ssBlock.begin(), ssBlock.end()); +} + + +Value dumpblockbynumber(const Array& params, bool fHelp) +{ + if (fHelp || params.size() < 1 || params.size() > 2) + throw runtime_error( + "dumpblockbynumber [destination]\n" + "Returns serialized contents of a block with given block-number."); + + int nHeight = params[0].get_int(); + if (nHeight < 0 || nHeight > nBestHeight) + throw runtime_error("Block number out of range."); + + CBlock block; + CBlockIndex* pblockindex = mapBlockIndex[hashBestChain]; + while (pblockindex->nHeight > nHeight) + pblockindex = pblockindex->pprev; + + pblockindex = mapBlockIndex[*pblockindex->phashBlock]; + block.ReadFromDisk(pblockindex, true); + + CDataStream ssBlock(SER_NETWORK, PROTOCOL_VERSION); + ssBlock << block; + + if (params.size() > 1) + { + return ExportBlock(params[1].get_str(), ssBlock); + } + + return HexStr(ssBlock.begin(), ssBlock.end()); +} + + +// get information of sync-checkpoint Value getcheckpoint(const Array& params, bool fHelp) { if (fHelp || params.size() != 0) @@ -286,6 +371,27 @@ Value getcheckpoint(const Array& params, bool fHelp) result.push_back(Pair("height", pindexCheckpoint->nHeight)); result.push_back(Pair("timestamp", DateTimeStrFormat(pindexCheckpoint->GetBlockTime()).c_str())); + if (Checkpoints::checkpointMessage.vchSig.size() != 0) + { + Object msgdata; + CUnsignedSyncCheckpoint checkpoint; + + CDataStream sMsg(Checkpoints::checkpointMessage.vchMsg, SER_NETWORK, PROTOCOL_VERSION); + sMsg >> checkpoint; + + Object parsed; // message version and data (block hash) + parsed.push_back(Pair("version", checkpoint.nVersion)); + parsed.push_back(Pair("hash", checkpoint.hashCheckpoint.GetHex().c_str())); + msgdata.push_back(Pair("parsed", parsed)); + + Object raw; // raw checkpoint message data + raw.push_back(Pair("data", HexStr(Checkpoints::checkpointMessage.vchMsg).c_str())); + raw.push_back(Pair("signature", HexStr(Checkpoints::checkpointMessage.vchSig).c_str())); + msgdata.push_back(Pair("raw", raw)); + + result.push_back(Pair("data", msgdata)); + } + // Check that the block satisfies synchronized checkpoint if (CheckpointsMode == Checkpoints::STRICT) result.push_back(Pair("policy", "strict"));