Browse Source

Merge pull request #5275

1837987 Optimize -regtest setgenerate block generation (Gavin Andresen)

Signed-off-by: Gavin Andresen <gavinandresen@gmail.com>
0.10
Gavin Andresen 10 years ago
parent
commit
d6479ffc6a
No known key found for this signature in database
GPG Key ID: 7588242FBE38D3A8
  1. 30
      src/rpcmining.cpp

30
src/rpcmining.cpp

@ -121,6 +121,8 @@ Value setgenerate(const Array& params, bool fHelp)
"1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n" "1. generate (boolean, required) Set to true to turn on generation, off to turn off.\n"
"2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n" "2. genproclimit (numeric, optional) Set the processor limit for when generation is on. Can be -1 for unlimited.\n"
" Note: in -regtest mode, genproclimit controls how many blocks are generated immediately.\n" " Note: in -regtest mode, genproclimit controls how many blocks are generated immediately.\n"
"\nResult\n"
"[ blockhashes ] (array, -regtest only) hashes of blocks generated\n"
"\nExamples:\n" "\nExamples:\n"
"\nSet the generation on with a limit of one processor\n" "\nSet the generation on with a limit of one processor\n"
+ HelpExampleCli("setgenerate", "true 1") + + HelpExampleCli("setgenerate", "true 1") +
@ -154,26 +156,38 @@ Value setgenerate(const Array& params, bool fHelp)
int nHeightEnd = 0; int nHeightEnd = 0;
int nHeight = 0; int nHeight = 0;
int nGenerate = (nGenProcLimit > 0 ? nGenProcLimit : 1); int nGenerate = (nGenProcLimit > 0 ? nGenProcLimit : 1);
CReserveKey reservekey(pwalletMain);
{ // Don't keep cs_main locked { // Don't keep cs_main locked
LOCK(cs_main); LOCK(cs_main);
nHeightStart = chainActive.Height(); nHeightStart = chainActive.Height();
nHeight = nHeightStart; nHeight = nHeightStart;
nHeightEnd = nHeightStart+nGenerate; nHeightEnd = nHeightStart+nGenerate;
} }
int nHeightLast = -1; unsigned int nExtraNonce = 0;
Array blockHashes;
while (nHeight < nHeightEnd) while (nHeight < nHeightEnd)
{ {
if (nHeightLast != nHeight) auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlockWithKey(reservekey));
if (!pblocktemplate.get())
throw JSONRPCError(RPC_INTERNAL_ERROR, "Wallet keypool empty");
CBlock *pblock = &pblocktemplate->block;
{ {
nHeightLast = nHeight;
GenerateBitcoins(fGenerate, pwalletMain, 1);
}
MilliSleep(1);
{ // Don't keep cs_main locked
LOCK(cs_main); LOCK(cs_main);
nHeight = chainActive.Height(); IncrementExtraNonce(pblock, chainActive.Tip(), nExtraNonce);
}
while (!CheckProofOfWork(pblock->GetHash(), pblock->nBits)) {
// 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;
} }
CValidationState state;
if (!ProcessNewBlock(state, NULL, pblock))
throw JSONRPCError(RPC_INTERNAL_ERROR, "ProcessNewBlock, block not accepted");
++nHeight;
blockHashes.push_back(pblock->GetHash().GetHex());
} }
return blockHashes;
} }
else // Not -regtest: start generate thread, return immediately else // Not -regtest: start generate thread, return immediately
{ {

Loading…
Cancel
Save