Allow the default key to be unavailable

This solves the issue where no default key can be added after -salvagewallet.
This commit is contained in:
Pieter Wuille 2013-04-25 19:30:28 +02:00 committed by Pieter Wuille
parent 77a1e12eed
commit 360cfe142c
4 changed files with 32 additions and 24 deletions

View file

@ -939,12 +939,12 @@ bool AppInit2(boost::thread_group& threadGroup)
RandAddSeedPerfmon(); RandAddSeedPerfmon();
CPubKey newDefaultKey; CPubKey newDefaultKey;
if (!pwalletMain->GetKeyFromPool(newDefaultKey, false)) if (pwalletMain->GetKeyFromPool(newDefaultKey, false)) {
strErrors << _("Cannot initialize keypool") << "\n";
pwalletMain->SetDefaultKey(newDefaultKey); pwalletMain->SetDefaultKey(newDefaultKey);
if (!pwalletMain->SetAddressBookName(pwalletMain->vchDefaultKey.GetID(), "")) if (!pwalletMain->SetAddressBookName(pwalletMain->vchDefaultKey.GetID(), ""))
strErrors << _("Cannot write default address") << "\n"; strErrors << _("Cannot write default address") << "\n";
} }
}
printf("%s", strErrors.str().c_str()); printf("%s", strErrors.str().c_str());
printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart); printf(" wallet %15"PRI64d"ms\n", GetTimeMillis() - nStart);

View file

@ -4158,7 +4158,10 @@ CBlockTemplate* CreateNewBlock(CReserveKey& reservekey)
txNew.vin.resize(1); txNew.vin.resize(1);
txNew.vin[0].prevout.SetNull(); txNew.vin[0].prevout.SetNull();
txNew.vout.resize(1); txNew.vout.resize(1);
txNew.vout[0].scriptPubKey << reservekey.GetReservedKey() << OP_CHECKSIG; CPubKey pubkey;
if (!reservekey.GetReservedKey(pubkey))
return NULL;
txNew.vout[0].scriptPubKey << pubkey << OP_CHECKSIG;
// Add our coinbase tx as first transaction // Add our coinbase tx as first transaction
pblock->vtx.push_back(txNew); pblock->vtx.push_back(txNew);

View file

@ -457,6 +457,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
return false; return false;
#ifndef QT_GUI #ifndef QT_GUI
// If default receiving address gets used, replace it with a new one // If default receiving address gets used, replace it with a new one
if (vchDefaultKey.IsValid()) {
CScript scriptDefaultKey; CScript scriptDefaultKey;
scriptDefaultKey.SetDestination(vchDefaultKey.GetID()); scriptDefaultKey.SetDestination(vchDefaultKey.GetID());
BOOST_FOREACH(const CTxOut& txout, wtx.vout) BOOST_FOREACH(const CTxOut& txout, wtx.vout)
@ -471,6 +472,7 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
} }
} }
} }
}
#endif #endif
// since AddToWallet is called directly for self-originating transactions, check for consumption of own coins // since AddToWallet is called directly for self-originating transactions, check for consumption of own coins
WalletUpdateSpent(wtx); WalletUpdateSpent(wtx);
@ -1199,8 +1201,8 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
// post-backup change. // post-backup change.
// Reserve a new key pair from key pool // Reserve a new key pair from key pool
CPubKey vchPubKey = reservekey.GetReservedKey(); CPubKey vchPubKey;
// assert(mapKeys.count(vchPubKey)); assert(reservekey.GetReservedKey(vchPubKey)); // should never fail, as we just unlocked
// Fill a vout to ourself // Fill a vout to ourself
// TODO: pass in scriptChange instead of reservekey so // TODO: pass in scriptChange instead of reservekey so
@ -1737,7 +1739,7 @@ set< set<CTxDestination> > CWallet::GetAddressGroupings()
return ret; return ret;
} }
CPubKey CReserveKey::GetReservedKey() bool CReserveKey::GetReservedKey(CPubKey& pubkey)
{ {
if (nIndex == -1) if (nIndex == -1)
{ {
@ -1745,14 +1747,17 @@ CPubKey CReserveKey::GetReservedKey()
pwallet->ReserveKeyFromKeyPool(nIndex, keypool); pwallet->ReserveKeyFromKeyPool(nIndex, keypool);
if (nIndex != -1) if (nIndex != -1)
vchPubKey = keypool.vchPubKey; vchPubKey = keypool.vchPubKey;
else else {
{ if (pwallet->vchDefaultKey.IsValid()) {
printf("CReserveKey::GetReservedKey(): Warning: Using default key instead of a new key, top up your keypool!"); printf("CReserveKey::GetReservedKey(): Warning: Using default key instead of a new key, top up your keypool!");
vchPubKey = pwallet->vchDefaultKey; vchPubKey = pwallet->vchDefaultKey;
} else
return false;
} }
} }
assert(vchPubKey.IsValid()); assert(vchPubKey.IsValid());
return vchPubKey; pubkey = vchPubKey;
return true;
} }
void CReserveKey::KeepKey() void CReserveKey::KeepKey()

View file

@ -331,7 +331,7 @@ public:
} }
void ReturnKey(); void ReturnKey();
CPubKey GetReservedKey(); bool GetReservedKey(CPubKey &pubkey);
void KeepKey(); void KeepKey();
}; };