|
|
@ -95,13 +95,13 @@ UniValue getnetworkhashps(const UniValue& params, bool fHelp) |
|
|
|
|
|
|
|
|
|
|
|
UniValue generate(const UniValue& params, bool fHelp) |
|
|
|
UniValue generate(const UniValue& params, bool fHelp) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (fHelp || params.size() < 1 || params.size() > 1) |
|
|
|
if (fHelp || params.size() < 1 || params.size() > 2) |
|
|
|
throw runtime_error( |
|
|
|
throw runtime_error( |
|
|
|
"generate numblocks\n" |
|
|
|
"generate numblocks ( maxtries )\n" |
|
|
|
"\nMine blocks immediately (before the RPC call returns)\n" |
|
|
|
"\nMine up to numblocks blocks immediately (before the RPC call returns)\n" |
|
|
|
"\nNote: this function can only be used on the regtest network\n" |
|
|
|
|
|
|
|
"\nArguments:\n" |
|
|
|
"\nArguments:\n" |
|
|
|
"1. numblocks (numeric, required) How many blocks are generated immediately.\n" |
|
|
|
"1. numblocks (numeric, required) How many blocks are generated immediately.\n" |
|
|
|
|
|
|
|
"2. maxtries (numeric, optional) How many iterations to try (default = 1000000).\n" |
|
|
|
"\nResult\n" |
|
|
|
"\nResult\n" |
|
|
|
"[ blockhashes ] (array) hashes of blocks generated\n" |
|
|
|
"[ blockhashes ] (array) hashes of blocks generated\n" |
|
|
|
"\nExamples:\n" |
|
|
|
"\nExamples:\n" |
|
|
@ -109,13 +109,15 @@ UniValue generate(const UniValue& params, bool fHelp) |
|
|
|
+ HelpExampleCli("generate", "11") |
|
|
|
+ HelpExampleCli("generate", "11") |
|
|
|
); |
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
if (!Params().MineBlocksOnDemand()) |
|
|
|
static const int nInnerLoopCount = 0x10000; |
|
|
|
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "This method can only be used on regtest"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int nHeightStart = 0; |
|
|
|
int nHeightStart = 0; |
|
|
|
int nHeightEnd = 0; |
|
|
|
int nHeightEnd = 0; |
|
|
|
int nHeight = 0; |
|
|
|
int nHeight = 0; |
|
|
|
int nGenerate = params[0].get_int(); |
|
|
|
int nGenerate = params[0].get_int(); |
|
|
|
|
|
|
|
uint64_t nMaxTries = 1000000; |
|
|
|
|
|
|
|
if (params.size() > 1) { |
|
|
|
|
|
|
|
nMaxTries = params[1].get_int(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
boost::shared_ptr<CReserveScript> coinbaseScript; |
|
|
|
boost::shared_ptr<CReserveScript> coinbaseScript; |
|
|
|
GetMainSignals().ScriptForMining(coinbaseScript); |
|
|
|
GetMainSignals().ScriptForMining(coinbaseScript); |
|
|
@ -146,10 +148,15 @@ UniValue generate(const UniValue& params, bool fHelp) |
|
|
|
LOCK(cs_main); |
|
|
|
LOCK(cs_main); |
|
|
|
IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce); |
|
|
|
IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce); |
|
|
|
} |
|
|
|
} |
|
|
|
while (!CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) { |
|
|
|
while (nMaxTries > 0 && pblock->nNonce < nInnerLoopCount && !CheckProofOfWork(pblock->GetHash(), pblock->nBits, Params().GetConsensus())) { |
|
|
|
// Yes, there is a chance every nonce could fail to satisfy the -regtest
|
|
|
|
|
|
|
|
// target -- 1 in 2^(2^32). That ain't gonna happen.
|
|
|
|
|
|
|
|
++pblock->nNonce; |
|
|
|
++pblock->nNonce; |
|
|
|
|
|
|
|
--nMaxTries; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (nMaxTries == 0) { |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (pblock->nNonce == nInnerLoopCount) { |
|
|
|
|
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
CValidationState state; |
|
|
|
CValidationState state; |
|
|
|
if (!ProcessNewBlock(state, Params(), NULL, pblock, true, NULL)) |
|
|
|
if (!ProcessNewBlock(state, Params(), NULL, pblock, true, NULL)) |
|
|
|