Merge pull request #5275
1837987
Optimize -regtest setgenerate block generation (Gavin Andresen)
Signed-off-by: Gavin Andresen <gavinandresen@gmail.com>
This commit is contained in:
commit
d6479ffc6a
1 changed files with 22 additions and 8 deletions
|
@ -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…
Add table
Reference in a new issue