|
|
|
@ -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]);
|
|
|
|
|