|
|
@ -3081,11 +3081,15 @@ bool CWallet::NewKeyPool() |
|
|
|
{ |
|
|
|
{ |
|
|
|
LOCK(cs_wallet); |
|
|
|
LOCK(cs_wallet); |
|
|
|
CWalletDB walletdb(*dbw); |
|
|
|
CWalletDB walletdb(*dbw); |
|
|
|
for (int64_t nIndex : setInternalKeyPool) |
|
|
|
|
|
|
|
|
|
|
|
for (int64_t nIndex : setInternalKeyPool) { |
|
|
|
walletdb.ErasePool(nIndex); |
|
|
|
walletdb.ErasePool(nIndex); |
|
|
|
|
|
|
|
} |
|
|
|
setInternalKeyPool.clear(); |
|
|
|
setInternalKeyPool.clear(); |
|
|
|
BOOST_FOREACH(int64_t nIndex, setExternalKeyPool) |
|
|
|
|
|
|
|
|
|
|
|
for (int64_t nIndex : setExternalKeyPool) { |
|
|
|
walletdb.ErasePool(nIndex); |
|
|
|
walletdb.ErasePool(nIndex); |
|
|
|
|
|
|
|
} |
|
|
|
setExternalKeyPool.clear(); |
|
|
|
setExternalKeyPool.clear(); |
|
|
|
|
|
|
|
|
|
|
|
if (!TopUpKeyPool()) { |
|
|
|
if (!TopUpKeyPool()) { |
|
|
@ -3132,12 +3136,16 @@ bool CWallet::TopUpKeyPool(unsigned int kpSize) |
|
|
|
for (int64_t i = missingInternal + missingExternal; i--;) |
|
|
|
for (int64_t i = missingInternal + missingExternal; i--;) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64_t nEnd = 1; |
|
|
|
int64_t nEnd = 1; |
|
|
|
if (i < missingInternal) |
|
|
|
if (i < missingInternal) { |
|
|
|
internal = true; |
|
|
|
internal = true; |
|
|
|
if (!setInternalKeyPool.empty()) |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!setInternalKeyPool.empty()) { |
|
|
|
nEnd = *(--setInternalKeyPool.end()) + 1; |
|
|
|
nEnd = *(--setInternalKeyPool.end()) + 1; |
|
|
|
if (!setExternalKeyPool.empty()) |
|
|
|
} |
|
|
|
|
|
|
|
if (!setExternalKeyPool.empty()) { |
|
|
|
nEnd = std::max(nEnd, *(--setExternalKeyPool.end()) + 1); |
|
|
|
nEnd = std::max(nEnd, *(--setExternalKeyPool.end()) + 1); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!walletdb.WritePool(nEnd, CKeyPool(GenerateNewKey(internal), internal))) |
|
|
|
if (!walletdb.WritePool(nEnd, CKeyPool(GenerateNewKey(internal), internal))) |
|
|
|
throw std::runtime_error(std::string(__func__) + ": writing generated key failed"); |
|
|
|
throw std::runtime_error(std::string(__func__) + ": writing generated key failed"); |
|
|
@ -3238,8 +3246,9 @@ static int64_t GetOldestKeyTimeInPool(const std::set<int64_t>& setKeyPool, CWall |
|
|
|
|
|
|
|
|
|
|
|
CKeyPool keypool; |
|
|
|
CKeyPool keypool; |
|
|
|
int64_t nIndex = *(setKeyPool.begin()); |
|
|
|
int64_t nIndex = *(setKeyPool.begin()); |
|
|
|
if (!walletdb.ReadPool(nIndex, keypool)) |
|
|
|
if (!walletdb.ReadPool(nIndex, keypool)) { |
|
|
|
throw std::runtime_error(std::string(__func__) + ": read oldest key in keypool failed"); |
|
|
|
throw std::runtime_error(std::string(__func__) + ": read oldest key in keypool failed"); |
|
|
|
|
|
|
|
} |
|
|
|
assert(keypool.vchPubKey.IsValid()); |
|
|
|
assert(keypool.vchPubKey.IsValid()); |
|
|
|
return keypool.nTime; |
|
|
|
return keypool.nTime; |
|
|
|
} |
|
|
|
} |
|
|
@ -3434,8 +3443,9 @@ void CReserveKey::KeepKey() |
|
|
|
|
|
|
|
|
|
|
|
void CReserveKey::ReturnKey() |
|
|
|
void CReserveKey::ReturnKey() |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (nIndex != -1) |
|
|
|
if (nIndex != -1) { |
|
|
|
pwallet->ReturnKey(nIndex, fInternal); |
|
|
|
pwallet->ReturnKey(nIndex, fInternal); |
|
|
|
|
|
|
|
} |
|
|
|
nIndex = -1; |
|
|
|
nIndex = -1; |
|
|
|
vchPubKey = CPubKey(); |
|
|
|
vchPubKey = CPubKey(); |
|
|
|
} |
|
|
|
} |
|
|
|