aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2013-04-25 19:30:28 +0200
committerPieter Wuille <pieterw@google.com>2013-04-25 19:36:10 +0200
commit360cfe142c552ac5c4d904a1e970390188151ca8 (patch)
tree4e8232b61d597b9720cbb98a54d07690324b6c3b /src
parent77a1e12eed5fc66dce16584696f54988a8c2bf4e (diff)
downloadbitcoin-360cfe142c552ac5c4d904a1e970390188151ca8.tar.xz
Allow the default key to be unavailable
This solves the issue where no default key can be added after -salvagewallet.
Diffstat (limited to 'src')
-rw-r--r--src/init.cpp10
-rw-r--r--src/main.cpp5
-rw-r--r--src/wallet.cpp39
-rw-r--r--src/wallet.h2
4 files changed, 32 insertions, 24 deletions
diff --git a/src/init.cpp b/src/init.cpp
index f6485c3b1d..f35979bc09 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -939,11 +939,11 @@ bool AppInit2(boost::thread_group& threadGroup)
RandAddSeedPerfmon();
CPubKey newDefaultKey;
- if (!pwalletMain->GetKeyFromPool(newDefaultKey, false))
- strErrors << _("Cannot initialize keypool") << "\n";
- pwalletMain->SetDefaultKey(newDefaultKey);
- if (!pwalletMain->SetAddressBookName(pwalletMain->vchDefaultKey.GetID(), ""))
- strErrors << _("Cannot write default address") << "\n";
+ if (pwalletMain->GetKeyFromPool(newDefaultKey, false)) {
+ pwalletMain->SetDefaultKey(newDefaultKey);
+ if (!pwalletMain->SetAddressBookName(pwalletMain->vchDefaultKey.GetID(), ""))
+ strErrors << _("Cannot write default address") << "\n";
+ }
}
printf("%s", strErrors.str().c_str());
diff --git a/src/main.cpp b/src/main.cpp
index aace382d8b..45fb7af005 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -4158,7 +4158,10 @@ CBlockTemplate* CreateNewBlock(CReserveKey& reservekey)
txNew.vin.resize(1);
txNew.vin[0].prevout.SetNull();
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
pblock->vtx.push_back(txNew);
diff --git a/src/wallet.cpp b/src/wallet.cpp
index c7eb4f74e8..0672a36690 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -457,17 +457,19 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn)
return false;
#ifndef QT_GUI
// If default receiving address gets used, replace it with a new one
- CScript scriptDefaultKey;
- scriptDefaultKey.SetDestination(vchDefaultKey.GetID());
- BOOST_FOREACH(const CTxOut& txout, wtx.vout)
- {
- if (txout.scriptPubKey == scriptDefaultKey)
+ if (vchDefaultKey.IsValid()) {
+ CScript scriptDefaultKey;
+ scriptDefaultKey.SetDestination(vchDefaultKey.GetID());
+ BOOST_FOREACH(const CTxOut& txout, wtx.vout)
{
- CPubKey newDefaultKey;
- if (GetKeyFromPool(newDefaultKey, false))
+ if (txout.scriptPubKey == scriptDefaultKey)
{
- SetDefaultKey(newDefaultKey);
- SetAddressBookName(vchDefaultKey.GetID(), "");
+ CPubKey newDefaultKey;
+ if (GetKeyFromPool(newDefaultKey, false))
+ {
+ SetDefaultKey(newDefaultKey);
+ SetAddressBookName(vchDefaultKey.GetID(), "");
+ }
}
}
}
@@ -1199,8 +1201,8 @@ bool CWallet::CreateTransaction(const vector<pair<CScript, int64> >& vecSend, CW
// post-backup change.
// Reserve a new key pair from key pool
- CPubKey vchPubKey = reservekey.GetReservedKey();
- // assert(mapKeys.count(vchPubKey));
+ CPubKey vchPubKey;
+ assert(reservekey.GetReservedKey(vchPubKey)); // should never fail, as we just unlocked
// Fill a vout to ourself
// TODO: pass in scriptChange instead of reservekey so
@@ -1737,7 +1739,7 @@ set< set<CTxDestination> > CWallet::GetAddressGroupings()
return ret;
}
-CPubKey CReserveKey::GetReservedKey()
+bool CReserveKey::GetReservedKey(CPubKey& pubkey)
{
if (nIndex == -1)
{
@@ -1745,14 +1747,17 @@ CPubKey CReserveKey::GetReservedKey()
pwallet->ReserveKeyFromKeyPool(nIndex, keypool);
if (nIndex != -1)
vchPubKey = keypool.vchPubKey;
- else
- {
- printf("CReserveKey::GetReservedKey(): Warning: Using default key instead of a new key, top up your keypool!");
- vchPubKey = pwallet->vchDefaultKey;
+ else {
+ if (pwallet->vchDefaultKey.IsValid()) {
+ printf("CReserveKey::GetReservedKey(): Warning: Using default key instead of a new key, top up your keypool!");
+ vchPubKey = pwallet->vchDefaultKey;
+ } else
+ return false;
}
}
assert(vchPubKey.IsValid());
- return vchPubKey;
+ pubkey = vchPubKey;
+ return true;
}
void CReserveKey::KeepKey()
diff --git a/src/wallet.h b/src/wallet.h
index 2e007557b0..55200476ae 100644
--- a/src/wallet.h
+++ b/src/wallet.h
@@ -331,7 +331,7 @@ public:
}
void ReturnKey();
- CPubKey GetReservedKey();
+ bool GetReservedKey(CPubKey &pubkey);
void KeepKey();
};