getrawchangeaddress should fail when keypool exhausted
An user on IRC reported an issue where `getrawchangeaddress` keeps returning a single address when the keypool is exhausted. In my opinion this is strange behaviour. - Change CReserveKey to fail when running out of keys in the keypool. - Make `getrawchangeaddress` return RPC_WALLET_KEYPOOL_RAN_OUT when unable to create an address. - Add a Python RPC test for checking the keypool behaviour in combination with encrypted wallets.
This commit is contained in:
@@ -467,7 +467,10 @@ void static BitcoinMiner(CWallet *pwallet)
|
||||
|
||||
auto_ptr<CBlockTemplate> pblocktemplate(CreateNewBlockWithKey(reservekey));
|
||||
if (!pblocktemplate.get())
|
||||
{
|
||||
LogPrintf("Error in BitcoinMiner: Keypool ran out, please call keypoolrefill before restarting the mining thread\n");
|
||||
return;
|
||||
}
|
||||
CBlock *pblock = &pblocktemplate->block;
|
||||
IncrementExtraNonce(pblock, pindexPrev, nExtraNonce);
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ Value getrawchangeaddress(const Array& params, bool fHelp)
|
||||
CReserveKey reservekey(pwalletMain);
|
||||
CPubKey vchPubKey;
|
||||
if (!reservekey.GetReservedKey(vchPubKey))
|
||||
throw JSONRPCError(RPC_WALLET_ERROR, "Error: Unable to obtain key for change");
|
||||
throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Error: Keypool ran out, please call keypoolrefill first");
|
||||
|
||||
reservekey.KeepKey();
|
||||
|
||||
|
||||
@@ -2010,11 +2010,7 @@ bool CReserveKey::GetReservedKey(CPubKey& pubkey)
|
||||
if (nIndex != -1)
|
||||
vchPubKey = keypool.vchPubKey;
|
||||
else {
|
||||
if (pwallet->vchDefaultKey.IsValid()) {
|
||||
LogPrintf("CReserveKey::GetReservedKey(): Warning: Using default key instead of a new key, top up your keypool!");
|
||||
vchPubKey = pwallet->vchDefaultKey;
|
||||
} else
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
assert(vchPubKey.IsValid());
|
||||
|
||||
Reference in New Issue
Block a user