|
|
@ -72,6 +72,37 @@ void PrintConsole(const std::string &format, ...) |
|
|
|
fprintf(stdout, "%s", buffer); |
|
|
|
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) |
|
|
|
int64 AmountFromValue(const Value& value) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -112,6 +143,28 @@ string AccountFromValue(const Value& value) |
|
|
|
return strAccount; |
|
|
|
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) |
|
|
|
Value getdifficulty(const Array& params, bool fHelp) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (fHelp || params.size() != 0) |
|
|
|
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("sendfrom", &sendfrom), |
|
|
|
make_pair("sendmany", &sendmany), |
|
|
|
make_pair("sendmany", &sendmany), |
|
|
|
make_pair("addmultisigaddress", &addmultisigaddress), |
|
|
|
make_pair("addmultisigaddress", &addmultisigaddress), |
|
|
|
|
|
|
|
make_pair("getblock", &getblock), |
|
|
|
|
|
|
|
make_pair("getblockhash", &getblockhash), |
|
|
|
make_pair("gettransaction", &gettransaction), |
|
|
|
make_pair("gettransaction", &gettransaction), |
|
|
|
make_pair("listtransactions", &listtransactions), |
|
|
|
make_pair("listtransactions", &listtransactions), |
|
|
|
make_pair("signmessage", &signmessage), |
|
|
|
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 > 0) ConvertTo<boost::int64_t>(params[0]); |
|
|
|
if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo<bool>(params[1]); |
|
|
|
if (strMethod == "listreceivedbyaccount" && n > 1) ConvertTo<bool>(params[1]); |
|
|
|
if (strMethod == "getbalance" && n > 1) ConvertTo<boost::int64_t>(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 > 2) ConvertTo<double>(params[2]); |
|
|
|
if (strMethod == "move" && n > 3) ConvertTo<boost::int64_t>(params[3]); |
|
|
|
if (strMethod == "move" && n > 3) ConvertTo<boost::int64_t>(params[3]); |
|
|
|
if (strMethod == "sendfrom" && n > 2) ConvertTo<double>(params[2]); |
|
|
|
if (strMethod == "sendfrom" && n > 2) ConvertTo<double>(params[2]); |
|
|
|