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"
|
||||
"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"
|
||||
"\nResult\n"
|
||||
"[ blockhashes ] (array, -regtest only) hashes of blocks generated\n"
|
||||
"\nExamples:\n"
|
||||
"\nSet the generation on with a limit of one processor\n"
|
||||
+ HelpExampleCli("setgenerate", "true 1") +
|
||||
|
@ -154,26 +156,38 @@ Value setgenerate(const Array& params, bool fHelp)
|
|||
int nHeightEnd = 0;
|
||||
int nHeight = 0;
|
||||
int nGenerate = (nGenProcLimit > 0 ? nGenProcLimit : 1);
|
||||
CReserveKey reservekey(pwalletMain);
|
||||
|
||||
{ // Don't keep cs_main locked
|
||||
LOCK(cs_main);
|
||||
nHeightStart = chainActive.Height();
|
||||
nHeight = nHeightStart;
|
||||
nHeightEnd = nHeightStart+nGenerate;
|
||||
}
|
||||
int nHeightLast = -1;
|
||||
unsigned int nExtraNonce = 0;
|
||||
Array blockHashes;
|
||||
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);
|
||||
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
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue