aboutsummaryrefslogtreecommitdiff
path: root/src/bitcoinrpc.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2011-12-23 16:26:38 -0500
committerGavin Andresen <gavinandresen@gmail.com>2011-12-23 16:26:38 -0500
commit8a53cb0b9d6a6c780c3458a2c3801409c2e3b0ca (patch)
tree5a717679b6ec43655d78e4df47225177a741f40b /src/bitcoinrpc.cpp
parent5ad2ca011eaee4f07c71458bb475224608132b25 (diff)
downloadbitcoin-8a53cb0b9d6a6c780c3458a2c3801409c2e3b0ca.tar.xz
New RPC commands: getblockhash and getblock
Diffstat (limited to 'src/bitcoinrpc.cpp')
-rw-r--r--src/bitcoinrpc.cpp120
1 files changed, 94 insertions, 26 deletions
diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
index c1e8ef7690..09be73af3d 100644
--- a/src/bitcoinrpc.cpp
+++ b/src/bitcoinrpc.cpp
@@ -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]);