1 // Copyright (c) 2010 Satoshi Nakamoto
2 // Copyright (c) 2009-2013 The Bitcoin developers
3 // Distributed under the MIT/X11 software license, see the accompanying
4 // file COPYING or http://www.opensource.org/licenses/mit-license.php.
7 #include "chainparams.h"
18 #include "json/json_spirit_utils.h"
19 #include "json/json_spirit_value.h"
21 using namespace json_spirit;
25 // Key used by getwork miners.
26 // Allocated in InitRPCMining, free'd in ShutdownRPCMining
27 static CReserveKey* pMiningKey = NULL;
34 // getwork/getblocktemplate mining rewards paid here:
35 pMiningKey = new CReserveKey(pwalletMain);
38 void ShutdownRPCMining()
43 delete pMiningKey; pMiningKey = NULL;
49 void ShutdownRPCMining()
54 // Return average network hashes per second based on the last 'lookup' blocks,
55 // or from the last difficulty change if 'lookup' is nonpositive.
56 // If 'height' is nonnegative, compute the estimate at the time when a given block was found.
57 Value GetNetworkHashPS(int lookup, int height) {
58 CBlockIndex *pb = chainActive.Tip();
60 if (height >= 0 && height < chainActive.Height())
61 pb = chainActive[height];
63 if (pb == NULL || !pb->nHeight)
66 // If lookup is -1, then use blocks since last difficulty change.
68 lookup = pb->nHeight % 2016 + 1;
70 // If lookup is larger than chain, then set it to chain length.
71 if (lookup > pb->nHeight)
74 CBlockIndex *pb0 = pb;
75 int64_t minTime = pb0->GetBlockTime();
76 int64_t maxTime = minTime;
77 for (int i = 0; i < lookup; i++) {
79 int64_t time = pb0->GetBlockTime();
80 minTime = std::min(time, minTime);
81 maxTime = std::max(time, maxTime);
84 // In case there's a situation where minTime == maxTime, we don't want a divide by zero exception.
85 if (minTime == maxTime)
88 uint256 workDiff = pb->nChainWork - pb0->nChainWork;
89 int64_t timeDiff = maxTime - minTime;
91 return (int64_t)(workDiff.getdouble() / timeDiff);
94 Value getnetworkhashps(const Array& params, bool fHelp)
96 if (fHelp || params.size() > 2)
98 "getnetworkhashps ( blocks height )\n"
99 "\nReturns the estimated network hashes per second based on the last n blocks.\n"
100 "Pass in [blocks] to override # of blocks, -1 specifies since last difficulty change.\n"
101 "Pass in [height] to estimate the network speed at the time when a certain block was found.\n"
103 "1. blocks (numeric, optional, default=120) The number of blocks, or -1 for blocks since last difficulty change.\n"
104 "2. height (numeric, optional, default=-1) To estimate at the time of the given height.\n"
106 "x (numeric) Hashes per second estimated\n"
108 + HelpExampleCli("getnetworkhashps", "")
109 + HelpExampleRpc("getnetworkhashps", "")
112 return GetNetworkHashPS(params.size() > 0 ? params[0].get_int() : 120, params.size() > 1 ? params[1].get_int() : -1);
116 Value getgenerate(const Array& params, bool fHelp)
118 if (fHelp || params.size() != 0)
121 "\nReturn if the server is set to generate coins or not. The default is false.\n"
122 "It is set with the command line argument -gen (or bitcoin.conf setting gen)\n"
123 "It can also be set with the setgenerate call.\n"
125 "true|false (boolean) If the server is set to generate coins or not\n"
127 + HelpExampleCli("getgenerate", "")
128 + HelpExampleRpc("getgenerate", "")
134 return GetBoolArg("-gen", false);
138 Value setgenerate(const Array& params, bool fHelp)
140 if (fHelp || params.size() < 1 || params.size() > 2)
142 "setgenerate generate ( genproclimit )\n"
143 "\nSet 'generate' true or false to turn generation on or off.\n"
144 "Generation is limited to 'genproclimit' processors, -1 is unlimited.\n"
145 "See the getgenerate call for the current setting.\n"
147 "1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n"
148 "2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n"
149 " Note: in -regtest mode, genproclimit controls how many blocks are generated immediately.\n"
151 "\nSet the generation on with a limit of one processor\n"
152 + HelpExampleCli("setgenerate", "true 1") +
153 "\nCheck the setting\n"
154 + HelpExampleCli("getgenerate", "") +
155 "\nTurn off generation\n"
156 + HelpExampleCli("setgenerate", "false") +
158 + HelpExampleRpc("setgenerate", "true, 1")
161 if (pwalletMain == NULL)
162 throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
164 bool fGenerate = true;
165 if (params.size() > 0)
166 fGenerate = params[0].get_bool();
168 int nGenProcLimit = -1;
169 if (params.size() > 1)
171 nGenProcLimit = params[1].get_int();
172 if (nGenProcLimit == 0)
176 // -regtest mode: don't return until nGenProcLimit blocks are generated
177 if (fGenerate && Params().NetworkID() == CChainParams::REGTEST)
179 int nHeightStart = 0;
182 int nGenerate = (nGenProcLimit > 0 ? nGenProcLimit : 1);
183 { // Don't keep cs_main locked
185 nHeightStart = chainActive.Height();
186 nHeight = nHeightStart;
187 nHeightEnd = nHeightStart+nGenerate;
189 int nHeightLast = -1;
190 while (nHeight < nHeightEnd)
192 if (nHeightLast != nHeight)
194 nHeightLast = nHeight;
195 GenerateBitcoins(fGenerate, pwalletMain, 1);
198 { // Don't keep cs_main locked
200 nHeight = chainActive.Height();
204 else // Not -regtest: start generate thread, return immediately
206 mapArgs["-gen"] = (fGenerate ? "1" : "0");
207 mapArgs ["-genproclimit"] = itostr(nGenProcLimit);
208 GenerateBitcoins(fGenerate, pwalletMain, nGenProcLimit);
214 Value gethashespersec(const Array& params, bool fHelp)
216 if (fHelp || params.size() != 0)
219 "\nReturns a recent hashes per second performance measurement while generating.\n"
220 "See the getgenerate and setgenerate calls to turn generation on and off.\n"
222 "n (numeric) The recent hashes per second when generation is on (will return 0 if generation is off)\n"
224 + HelpExampleCli("gethashespersec", "")
225 + HelpExampleRpc("gethashespersec", "")
228 if (GetTimeMillis() - nHPSTimerStart > 8000)
230 return (int64_t)dHashesPerSec;
235 Value getmininginfo(const Array& params, bool fHelp)
237 if (fHelp || params.size() != 0)
240 "\nReturns a json object containing mining-related information."
243 " \"blocks\": nnn, (numeric) The current block\n"
244 " \"currentblocksize\": nnn, (numeric) The last block size\n"
245 " \"currentblocktx\": nnn, (numeric) The last block transaction\n"
246 " \"difficulty\": xxx.xxxxx (numeric) The current difficulty\n"
247 " \"errors\": \"...\" (string) Current errors\n"
248 " \"generate\": true|false (boolean) If the generation is on or off (see getgenerate or setgenerate calls)\n"
249 " \"genproclimit\": n (numeric) The processor limit for generation. -1 if no generation. (see getgenerate or setgenerate calls)\n"
250 " \"hashespersec\": n (numeric) The hashes per second of the generation, or 0 if no generation.\n"
251 " \"pooledtx\": n (numeric) The size of the mem pool\n"
252 " \"testnet\": true|false (boolean) If using testnet or not\n"
255 + HelpExampleCli("getmininginfo", "")
256 + HelpExampleRpc("getmininginfo", "")
260 obj.push_back(Pair("blocks", (int)chainActive.Height()));
261 obj.push_back(Pair("currentblocksize", (uint64_t)nLastBlockSize));
262 obj.push_back(Pair("currentblocktx", (uint64_t)nLastBlockTx));
263 obj.push_back(Pair("difficulty", (double)GetDifficulty()));
264 obj.push_back(Pair("errors", GetWarnings("statusbar")));
265 obj.push_back(Pair("genproclimit", (int)GetArg("-genproclimit", -1)));
266 obj.push_back(Pair("networkhashps", getnetworkhashps(params, false)));
267 obj.push_back(Pair("pooledtx", (uint64_t)mempool.size()));
268 obj.push_back(Pair("testnet", TestNet()));
270 obj.push_back(Pair("generate", getgenerate(params, false)));
271 obj.push_back(Pair("hashespersec", gethashespersec(params, false)));
278 Value getwork(const Array& params, bool fHelp)
280 if (fHelp || params.size() > 1)
282 "getwork ( \"data\" )\n"
283 "\nIf 'data' is not specified, it returns the formatted hash data to work on.\n"
284 "If 'data' is specified, tries to solve the block and returns true if it was successful.\n"
286 "1. \"data\" (string, optional) The hex encoded data to solve\n"
287 "\nResult (when 'data' is not specified):\n"
289 " \"midstate\" : \"xxxx\", (string) The precomputed hash state after hashing the first half of the data (DEPRECATED)\n" // deprecated
290 " \"data\" : \"xxxxx\", (string) The block data\n"
291 " \"hash1\" : \"xxxxx\", (string) The formatted hash buffer for second hash (DEPRECATED)\n" // deprecated
292 " \"target\" : \"xxxx\" (string) The little endian hash target\n"
294 "\nResult (when 'data' is specified):\n"
295 "true|false (boolean) If solving the block specified in the 'data' was successfull\n"
297 + HelpExampleCli("getwork", "")
298 + HelpExampleRpc("getwork", "")
302 throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
304 if (IsInitialBlockDownload())
305 throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
307 typedef map<uint256, pair<CBlock*, CScript> > mapNewBlock_t;
308 static mapNewBlock_t mapNewBlock; // FIXME: thread safety
309 static vector<CBlockTemplate*> vNewBlockTemplate;
311 if (params.size() == 0)
314 static unsigned int nTransactionsUpdatedLast;
315 static CBlockIndex* pindexPrev;
316 static int64_t nStart;
317 static CBlockTemplate* pblocktemplate;
318 if (pindexPrev != chainActive.Tip() ||
319 (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 60))
321 if (pindexPrev != chainActive.Tip())
323 // Deallocate old blocks since they're obsolete now
325 BOOST_FOREACH(CBlockTemplate* pblocktemplate, vNewBlockTemplate)
326 delete pblocktemplate;
327 vNewBlockTemplate.clear();
330 // Clear pindexPrev so future getworks make a new block, despite any failures from here on
333 // Store the pindexBest used before CreateNewBlock, to avoid races
334 nTransactionsUpdatedLast = mempool.GetTransactionsUpdated();
335 CBlockIndex* pindexPrevNew = chainActive.Tip();
339 pblocktemplate = CreateNewBlockWithKey(*pMiningKey);
341 throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
342 vNewBlockTemplate.push_back(pblocktemplate);
344 // Need to update only after we know CreateNewBlock succeeded
345 pindexPrev = pindexPrevNew;
347 CBlock* pblock = &pblocktemplate->block; // pointer for convenience
350 UpdateTime(*pblock, pindexPrev);
353 // Update nExtraNonce
354 static unsigned int nExtraNonce = 0;
355 IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
358 mapNewBlock[pblock->hashMerkleRoot] = make_pair(pblock, pblock->vtx[0].vin[0].scriptSig);
360 // Pre-build hash buffers
364 FormatHashBuffers(pblock, pmidstate, pdata, phash1);
366 uint256 hashTarget = uint256().SetCompact(pblock->nBits);
369 result.push_back(Pair("midstate", HexStr(BEGIN(pmidstate), END(pmidstate)))); // deprecated
370 result.push_back(Pair("data", HexStr(BEGIN(pdata), END(pdata))));
371 result.push_back(Pair("hash1", HexStr(BEGIN(phash1), END(phash1)))); // deprecated
372 result.push_back(Pair("target", HexStr(BEGIN(hashTarget), END(hashTarget))));
378 vector<unsigned char> vchData = ParseHex(params[0].get_str());
379 if (vchData.size() != 128)
380 throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter");
381 CBlock* pdata = (CBlock*)&vchData[0];
384 for (int i = 0; i < 128/4; i++)
385 ((unsigned int*)pdata)[i] = ByteReverse(((unsigned int*)pdata)[i]);
388 if (!mapNewBlock.count(pdata->hashMerkleRoot))
390 CBlock* pblock = mapNewBlock[pdata->hashMerkleRoot].first;
392 pblock->nTime = pdata->nTime;
393 pblock->nNonce = pdata->nNonce;
394 pblock->vtx[0].vin[0].scriptSig = mapNewBlock[pdata->hashMerkleRoot].second;
395 pblock->hashMerkleRoot = pblock->BuildMerkleTree();
397 assert(pwalletMain != NULL);
398 return CheckWork(pblock, *pwalletMain, *pMiningKey);
403 Value getblocktemplate(const Array& params, bool fHelp)
405 if (fHelp || params.size() > 1)
407 "getblocktemplate ( \"jsonrequestobject\" )\n"
408 "\nIf the request parameters include a 'mode' key, that is used to explicitly select between the default 'template' request or a 'proposal'.\n"
409 "It returns data needed to construct a block to work on.\n"
410 "See https://en.bitcoin.it/wiki/BIP_0022 for full specification.\n"
413 "1. \"jsonrequestobject\" (string, optional) A json object in the following spec\n"
415 " \"mode\":\"template\" (string, optional) This must be set to \"template\" or omitted\n"
416 " \"capabilities\":[ (array, optional) A list of strings\n"
417 " \"support\" (string) client side supported feature, 'longpoll', 'coinbasetxn', 'coinbasevalue', 'proposal', 'serverlist', 'workid'\n"
425 " \"version\" : n, (numeric) The block version\n"
426 " \"previousblockhash\" : \"xxxx\", (string) The hash of current highest block\n"
427 " \"transactions\" : [ (array) contents of non-coinbase transactions that should be included in the next block\n"
429 " \"data\" : \"xxxx\", (string) transaction data encoded in hexadecimal (byte-for-byte)\n"
430 " \"hash\" : \"xxxx\", (string) hash/id encoded in little-endian hexadecimal\n"
431 " \"depends\" : [ (array) array of numbers \n"
432 " n (numeric) transactions before this one (by 1-based index in 'transactions' list) that must be present in the final block if this one is\n"
435 " \"fee\": n, (numeric) difference in value between transaction inputs and outputs (in Satoshis); for coinbase transactions, this is a negative Number of the total collected block fees (ie, not including the block subsidy); if key is not present, fee is unknown and clients MUST NOT assume there isn't one\n"
436 " \"sigops\" : n, (numeric) total number of SigOps, as counted for purposes of block limits; if key is not present, sigop count is unknown and clients MUST NOT assume there aren't any\n"
437 " \"required\" : true|false (boolean) if provided and true, this transaction must be in the final block\n"
441 " \"coinbaseaux\" : { (json object) data that should be included in the coinbase's scriptSig content\n"
442 " \"flags\" : \"flags\" (string) \n"
444 " \"coinbasevalue\" : n, (numeric) maximum allowable input to coinbase transaction, including the generation award and transaction fees (in Satoshis)\n"
445 " \"coinbasetxn\" : { ... }, (json object) information for coinbase transaction\n"
446 " \"target\" : \"xxxx\", (string) The hash target\n"
447 " \"mintime\" : xxx, (numeric) The minimum timestamp appropriate for next block time in seconds since epoch (Jan 1 1970 GMT)\n"
448 " \"mutable\" : [ (array of string) list of ways the block template may be changed \n"
449 " \"value\" (string) A way the block template may be changed, e.g. 'time', 'transactions', 'prevblock'\n"
452 " \"noncerange\" : \"00000000ffffffff\", (string) A range of valid nonces\n"
453 " \"sigoplimit\" : n, (numeric) limit of sigops in blocks\n"
454 " \"sizelimit\" : n, (numeric) limit of block size\n"
455 " \"curtime\" : ttt, (numeric) current timestamp in seconds since epoch (Jan 1 1970 GMT)\n"
456 " \"bits\" : \"xxx\", (string) compressed target of next block\n"
457 " \"height\" : n (numeric) The height of the next block\n"
461 + HelpExampleCli("getblocktemplate", "")
462 + HelpExampleRpc("getblocktemplate", "")
465 std::string strMode = "template";
466 if (params.size() > 0)
468 const Object& oparam = params[0].get_obj();
469 const Value& modeval = find_value(oparam, "mode");
470 if (modeval.type() == str_type)
471 strMode = modeval.get_str();
472 else if (modeval.type() == null_type)
477 throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
480 if (strMode != "template")
481 throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid mode");
484 throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Bitcoin is not connected!");
486 if (IsInitialBlockDownload())
487 throw JSONRPCError(RPC_CLIENT_IN_INITIAL_DOWNLOAD, "Bitcoin is downloading blocks...");
490 static unsigned int nTransactionsUpdatedLast;
491 static CBlockIndex* pindexPrev;
492 static int64_t nStart;
493 static CBlockTemplate* pblocktemplate;
494 if (pindexPrev != chainActive.Tip() ||
495 (mempool.GetTransactionsUpdated() != nTransactionsUpdatedLast && GetTime() - nStart > 5))
497 // Clear pindexPrev so future calls make a new block, despite any failures from here on
500 // Store the pindexBest used before CreateNewBlock, to avoid races
501 nTransactionsUpdatedLast = mempool.GetTransactionsUpdated();
502 CBlockIndex* pindexPrevNew = chainActive.Tip();
508 delete pblocktemplate;
509 pblocktemplate = NULL;
511 CScript scriptDummy = CScript() << OP_TRUE;
512 pblocktemplate = CreateNewBlock(scriptDummy);
514 throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory");
516 // Need to update only after we know CreateNewBlock succeeded
517 pindexPrev = pindexPrevNew;
519 CBlock* pblock = &pblocktemplate->block; // pointer for convenience
522 UpdateTime(*pblock, pindexPrev);
526 map<uint256, int64_t> setTxIndex;
528 BOOST_FOREACH (CTransaction& tx, pblock->vtx)
530 uint256 txHash = tx.GetHash();
531 setTxIndex[txHash] = i++;
538 CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
540 entry.push_back(Pair("data", HexStr(ssTx.begin(), ssTx.end())));
542 entry.push_back(Pair("hash", txHash.GetHex()));
545 BOOST_FOREACH (const CTxIn &in, tx.vin)
547 if (setTxIndex.count(in.prevout.hash))
548 deps.push_back(setTxIndex[in.prevout.hash]);
550 entry.push_back(Pair("depends", deps));
552 int index_in_template = i - 1;
553 entry.push_back(Pair("fee", pblocktemplate->vTxFees[index_in_template]));
554 entry.push_back(Pair("sigops", pblocktemplate->vTxSigOps[index_in_template]));
556 transactions.push_back(entry);
560 aux.push_back(Pair("flags", HexStr(COINBASE_FLAGS.begin(), COINBASE_FLAGS.end())));
562 uint256 hashTarget = uint256().SetCompact(pblock->nBits);
564 static Array aMutable;
565 if (aMutable.empty())
567 aMutable.push_back("time");
568 aMutable.push_back("transactions");
569 aMutable.push_back("prevblock");
573 result.push_back(Pair("version", pblock->nVersion));
574 result.push_back(Pair("previousblockhash", pblock->hashPrevBlock.GetHex()));
575 result.push_back(Pair("transactions", transactions));
576 result.push_back(Pair("coinbaseaux", aux));
577 result.push_back(Pair("coinbasevalue", (int64_t)pblock->vtx[0].vout[0].nValue));
578 result.push_back(Pair("target", hashTarget.GetHex()));
579 result.push_back(Pair("mintime", (int64_t)pindexPrev->GetMedianTimePast()+1));
580 result.push_back(Pair("mutable", aMutable));
581 result.push_back(Pair("noncerange", "00000000ffffffff"));
582 result.push_back(Pair("sigoplimit", (int64_t)MAX_BLOCK_SIGOPS));
583 result.push_back(Pair("sizelimit", (int64_t)MAX_BLOCK_SIZE));
584 result.push_back(Pair("curtime", (int64_t)pblock->nTime));
585 result.push_back(Pair("bits", HexBits(pblock->nBits)));
586 result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1)));
591 Value submitblock(const Array& params, bool fHelp)
593 if (fHelp || params.size() < 1 || params.size() > 2)
595 "submitblock \"hexdata\" ( \"jsonparametersobject\" )\n"
596 "\nAttempts to submit new block to network.\n"
597 "The 'jsonparametersobject' parameter is currently ignored.\n"
598 "See https://en.bitcoin.it/wiki/BIP_0022 for full specification.\n"
601 "1. \"hexdata\" (string, required) the hex-encoded block data to submit\n"
602 "2. \"jsonparametersobject\" (string, optional) object of optional parameters\n"
604 " \"workid\" : \"id\" (string, optional) if the server provided a workid, it MUST be included with submissions\n"
608 + HelpExampleCli("submitblock", "\"mydata\"")
609 + HelpExampleRpc("submitblock", "\"mydata\"")
612 vector<unsigned char> blockData(ParseHex(params[0].get_str()));
613 CDataStream ssBlock(blockData, SER_NETWORK, PROTOCOL_VERSION);
618 catch (std::exception &e) {
619 throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "Block decode failed");
622 CValidationState state;
623 bool fAccepted = ProcessBlock(state, NULL, &pblock);
625 return "rejected"; // TODO: report validation state