New RPC commands: getblockhash and getblock
This commit is contained in:
parent
5ad2ca011e
commit
8a53cb0b9d
2 changed files with 94 additions and 27 deletions
|
@ -72,6 +72,37 @@ void PrintConsole(const std::string &format, ...)
|
|||
fprintf(stdout, "%s", buffer);
|
||||
}
|
||||
|
||||
double GetDifficulty(const CBlockIndex* blockindex = NULL)
|
||||
{
|
||||
// Floating point number that is a multiple of the minimum difficulty,
|
||||
// minimum difficulty = 1.0.
|
||||
if (blockindex == NULL)
|
||||
{
|
||||
if (pindexBest == NULL)
|
||||
return 1.0;
|
||||
else
|
||||
blockindex = pindexBest;
|
||||
}
|
||||
|
||||
int nShift = (blockindex->nBits >> 24) & 0xff;
|
||||
|
||||
double dDiff =
|
||||
(double)0x0000ffff / (double)(blockindex->nBits & 0x00ffffff);
|
||||
|
||||
while (nShift < 29)
|
||||
{
|
||||
dDiff *= 256.0;
|
||||
nShift++;
|
||||
}
|
||||
while (nShift > 29)
|
||||
{
|
||||
dDiff /= 256.0;
|
||||
nShift--;
|
||||
}
|
||||
|
||||
return dDiff;
|
||||
}
|
||||
|
||||
|
||||
int64 AmountFromValue(const Value& value)
|
||||
{
|
||||
|
@ -112,6 +143,28 @@ string AccountFromValue(const Value& value)
|
|||
return strAccount;
|
||||
}
|
||||
|
||||
Object blockToJSON(const CBlock& block, const CBlockIndex* blockindex)
|
||||
{
|
||||
Object result;
|
||||
result.push_back(Pair("hash", block.GetHash().GetHex()));
|
||||
result.push_back(Pair("blockcount", blockindex->nHeight));
|
||||
result.push_back(Pair("version", block.nVersion));
|
||||
result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex()));
|
||||
result.push_back(Pair("time", (boost::int64_t)block.GetBlockTime()));
|
||||
result.push_back(Pair("nonce", (boost::uint64_t)block.nNonce));
|
||||
result.push_back(Pair("difficulty", GetDifficulty(blockindex)));
|
||||
Array txhashes;
|
||||
BOOST_FOREACH (const CTransaction&tx, block.vtx)
|
||||
txhashes.push_back(tx.GetHash().GetHex());
|
||||
result.push_back(Pair("tx", txhashes));
|
||||
|
||||
if (blockindex->pprev)
|
||||
result.push_back(Pair("hashprevious", blockindex->pprev->GetBlockHash().GetHex()));
|
||||
if (blockindex->pnext)
|
||||
result.push_back(Pair("hashnext", blockindex->pnext->GetBlockHash().GetHex()));
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
///
|
||||
|
@ -217,32 +270,6 @@ Value getconnectioncount(const Array& params, bool fHelp)
|
|||
}
|
||||
|
||||
|
||||
double GetDifficulty()
|
||||
{
|
||||
// Floating point number that is a multiple of the minimum difficulty,
|
||||
// minimum difficulty = 1.0.
|
||||
|
||||
if (pindexBest == NULL)
|
||||
return 1.0;
|
||||
int nShift = (pindexBest->nBits >> 24) & 0xff;
|
||||
|
||||
double dDiff =
|
||||
(double)0x0000ffff / (double)(pindexBest->nBits & 0x00ffffff);
|
||||
|
||||
while (nShift < 29)
|
||||
{
|
||||
dDiff *= 256.0;
|
||||
nShift++;
|
||||
}
|
||||
while (nShift > 29)
|
||||
{
|
||||
dDiff /= 256.0;
|
||||
nShift--;
|
||||
}
|
||||
|
||||
return dDiff;
|
||||
}
|
||||
|
||||
Value getdifficulty(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 0)
|
||||
|
@ -1892,6 +1919,44 @@ Value getmemorypool(const Array& params, bool fHelp)
|
|||
}
|
||||
}
|
||||
|
||||
Value getblockhash(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 1)
|
||||
throw runtime_error(
|
||||
"getblockhash <index>\n"
|
||||
"Returns hash of block in best-block-chain at <index>.");
|
||||
|
||||
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;
|
||||
return pblockindex->phashBlock->GetHex();
|
||||
}
|
||||
|
||||
Value getblock(const Array& params, bool fHelp)
|
||||
{
|
||||
if (fHelp || params.size() != 1)
|
||||
throw runtime_error(
|
||||
"getblock <hash>\n"
|
||||
"Returns details of a block with given block-hash.");
|
||||
|
||||
std::string strHash = params[0].get_str();
|
||||
uint256 hash(strHash);
|
||||
|
||||
if (mapBlockIndex.count(hash) == 0)
|
||||
throw JSONRPCError(-5, "Block not found");
|
||||
|
||||
CBlock block;
|
||||
CBlockIndex* pblockindex = mapBlockIndex[hash];
|
||||
block.ReadFromDisk(pblockindex, true);
|
||||
|
||||
return blockToJSON(block, pblockindex);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1940,6 +2005,8 @@ pair<string, rpcfn_type> pCallTable[] =
|
|||
make_pair("sendfrom", &sendfrom),
|
||||
make_pair("sendmany", &sendmany),
|
||||
make_pair("addmultisigaddress", &addmultisigaddress),
|
||||
make_pair("getblock", &getblock),
|
||||
make_pair("getblockhash", &getblockhash),
|
||||
make_pair("gettransaction", &gettransaction),
|
||||
make_pair("listtransactions", &listtransactions),
|
||||
make_pair("signmessage", &signmessage),
|
||||
|
@ -2565,6 +2632,7 @@ int CommandLineRPC(int argc, char *argv[])
|
|||
if (strMethod == "listreceivedbyaccount" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
||||
if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo<bool>(params[1]);
|
||||
if (strMethod == "getbalance" && n > 1) ConvertTo<boost::int64_t>(params[1]);
|
||||
if (strMethod == "getblockhash" && n > 0) ConvertTo<boost::int64_t>(params[0]);
|
||||
if (strMethod == "move" && n > 2) ConvertTo<double>(params[2]);
|
||||
if (strMethod == "move" && n > 3) ConvertTo<boost::int64_t>(params[3]);
|
||||
if (strMethod == "sendfrom" && n > 2) ConvertTo<double>(params[2]);
|
||||
|
|
|
@ -25,7 +25,6 @@ class CAddress;
|
|||
class CInv;
|
||||
class CRequestTracker;
|
||||
class CNode;
|
||||
class CBlockIndex;
|
||||
|
||||
static const int CLIENT_VERSION = 59900;
|
||||
static const bool VERSION_IS_BETA = true;
|
||||
|
|
Loading…
Reference in a new issue