Create new keypool for newly encrypted wallets.

This commit is contained in:
Gavin Andresen
2011-11-17 14:01:25 -05:00
parent 1b93ea0e31
commit 37971fcc76
2 changed files with 33 additions and 1 deletions

View File

@@ -186,12 +186,15 @@ bool CWallet::EncryptWallet(const string& strWalletPassphrase)
pwalletdbEncryption = NULL;
}
Lock();
Unlock(strWalletPassphrase);
NewKeyPool();
Lock();
// Need to completely rewrite the wallet file; if we don't, bdb might keep
// bits of the unencrypted private key in slack space in the database file.
setKeyPool.clear();
CDB::Rewrite(strWalletFile, "\x04pool");
CDB::Rewrite(strWalletFile);
}
return true;
@@ -1244,6 +1247,34 @@ bool GetWalletFile(CWallet* pwallet, string &strWalletFileOut)
return true;
}
//
// Mark old keypool keys as used,
// and generate all new keys
//
bool CWallet::NewKeyPool()
{
CRITICAL_BLOCK(cs_wallet)
{
CWalletDB walletdb(strWalletFile);
BOOST_FOREACH(int64 nIndex, setKeyPool)
walletdb.ErasePool(nIndex);
setKeyPool.clear();
if (IsLocked())
return false;
int64 nKeys = max(GetArg("-keypool", 100), (int64)0);
for (int i = 0; i < nKeys; i++)
{
int64 nIndex = i+1;
walletdb.WritePool(nIndex, CKeyPool(GenerateNewKey()));
setKeyPool.insert(nIndex);
}
printf("CWallet::NewKeyPool wrote %"PRI64d" new keys\n", nKeys);
}
return true;
}
bool CWallet::TopUpKeyPool()
{
CRITICAL_BLOCK(cs_wallet)