if (!pcursor)
throw runtime_error("CWalletDB::ListAccountCreditDebit() : cannot create DB cursor");
unsigned int fFlags = DB_SET_RANGE;
- while (true)
+ for ( ; ; )
{
// Read next record
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
{
string strAddress;
ssKey >> strAddress;
- ssValue >> pwallet->mapAddressBook[CBitcoinAddress(strAddress).Get()];
+ ssValue >> pwallet->mapAddressBook[CBitcoinAddress(strAddress)];
}
else if (strType == "tx")
{
ssValue >> vchSecret;
CMalleableKeyView keyView(strKeyView);
- if (!pwallet->LoadMalleableKey(keyView, vchSecret))
+ if (!pwallet->LoadKey(keyView, vchSecret))
{
- strErr = "Error reading wallet database: LoadMalleableKey failed";
+ strErr = "Error reading wallet database: LoadKey failed";
return false;
}
}
ssValue >> vchCryptedSecret;
CMalleableKeyView keyView(strKeyView);
- if (!pwallet->LoadCryptedMalleableKey(keyView, vchCryptedSecret))
+ if (!pwallet->LoadCryptedKey(keyView, vchCryptedSecret))
{
- strErr = "Error reading wallet database: LoadCryptedMalleableKey failed";
+ strErr = "Error reading wallet database: LoadCryptedKey failed";
return false;
}
}
ssValue >> keyMeta;
wss.nKeyMeta++;
- pwallet->LoadMalleableKeyMetadata(keyView, keyMeta);
+ pwallet->LoadKeyMetadata(keyView, keyMeta);
}
else if (strType == "keymeta")
{
// If no metadata exists yet, create a default with the pool key's
// creation time. Note that this may be overwritten by actually
// stored metadata for that key later, which is fine.
- CKeyID keyid = keypool.vchPubKey.GetID();
- if (pwallet->mapKeyMetadata.count(keyid) == 0)
- pwallet->mapKeyMetadata[keyid] = CKeyMetadata(keypool.nTime);
+ CBitcoinAddress addr = CBitcoinAddress(keypool.vchPubKey.GetID());
+ if (pwallet->mapKeyMetadata.count(addr) == 0)
+ pwallet->mapKeyMetadata[addr] = CKeyMetadata(keypool.nTime);
}
else if (strType == "version")
return DB_CORRUPT;
}
- while (true)
+ for ( ; ; )
{
// Read next record
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
return DB_CORRUPT;
}
- while (true)
+ for ( ; ; )
{
// Read next record
CDataStream ssKey(SER_DISK, CLIENT_VERSION);
continue;
CMalleableKey mKey;
pwallet->GetMalleableKey(keyView, mKey);
- file << strprintf("%s %s # view=%s addr=%s\n", mKey.ToString().c_str(), strTime.c_str(), keyView.ToString().c_str(), strAddr.c_str());
+ file << mKey.ToString();
+ if (pwallet->mapAddressBook.count(addr))
+ file << strprintf(" %s label=%s # view=%s addr=%s\n", strTime.c_str(), EncodeDumpString(pwallet->mapAddressBook[addr]).c_str(), keyView.ToString().c_str(), strAddr.c_str());
+ else
+ file << strprintf(" %s # view=%s addr=%s\n", strTime.c_str(), keyView.ToString().c_str(), strAddr.c_str());
}
else {
// Pubkey hash address
if (!pwallet->GetKey(keyid, key))
continue;
CSecret secret = key.GetSecret(IsCompressed);
- file << CBitcoinSecret(secret, IsCompressed).ToString().c_str();
- if (pwallet->mapAddressBook.count(keyid))
- file << strprintf(" %s label=%s # addr=%s\n", strTime.c_str(), EncodeDumpString(pwallet->mapAddressBook[keyid]).c_str(), strAddr.c_str());
+ file << CBitcoinSecret(secret, IsCompressed).ToString();
+ if (pwallet->mapAddressBook.count(addr))
+ file << strprintf(" %s label=%s # addr=%s\n", strTime.c_str(), EncodeDumpString(pwallet->mapAddressBook[addr]).c_str(), strAddr.c_str());
else if (setKeyPool.count(keyid))
file << strprintf(" %s reserve=1 # addr=%s\n", strTime.c_str(), strAddr.c_str());
else
if (!pwallet->fFileBacked)
return false;
- while (!fShutdown)
- {
- // open inputfile as stream
- ifstream file;
- file.open(strLocation.c_str());
- if (!file.is_open())
- return false;
-
- int64_t nTimeBegin = pindexBest->nTime;
-
- bool fGood = true;
-
- // read through input file checking and importing keys into wallet.
- while (file.good()) {
- std::string line;
- std::getline(file, line);
- if (line.empty() || line[0] == '#')
- continue;
-
- std::vector<std::string> vstr;
- istringstream iss(line);
- copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(vstr));
- if (vstr.size() < 2)
- continue;
- CBitcoinSecret vchSecret;
- if (!vchSecret.SetString(vstr[0]))
- continue;
-
- bool fCompressed;
- CKey key;
- CSecret secret = vchSecret.GetSecret(fCompressed);
- key.SetSecret(secret, fCompressed);
- CKeyID keyid = key.GetPubKey().GetID();
-
- if (pwallet->HaveKey(keyid)) {
- printf("Skipping import of %s (key already present)\n", CBitcoinAddress(keyid).ToString().c_str());
- continue;
- }
- int64_t nTime = DecodeDumpTime(vstr[1]);
- std::string strLabel;
- bool fLabel = true;
- for (unsigned int nStr = 2; nStr < vstr.size(); nStr++) {
- if (boost::algorithm::starts_with(vstr[nStr], "#"))
- break;
- if (vstr[nStr] == "change=1")
- fLabel = false;
- if (vstr[nStr] == "reserve=1")
- fLabel = false;
- if (boost::algorithm::starts_with(vstr[nStr], "label=")) {
- strLabel = DecodeDumpString(vstr[nStr].substr(6));
- fLabel = true;
- }
- }
- printf("Importing %s...\n", CBitcoinAddress(keyid).ToString().c_str());
- if (!pwallet->AddKey(key)) {
- fGood = false;
- continue;
- }
- pwallet->mapKeyMetadata[keyid].nCreateTime = nTime;
- if (fLabel)
- pwallet->SetAddressBookName(keyid, strLabel);
- nTimeBegin = std::min(nTimeBegin, nTime);
- }
- file.close();
-
- // rescan block chain looking for coins from new keys
- CBlockIndex *pindex = pindexBest;
- while (pindex && pindex->pprev && pindex->nTime > nTimeBegin - 7200)
- pindex = pindex->pprev;
-
- printf("Rescanning last %i blocks\n", pindexBest->nHeight - pindex->nHeight + 1);
- pwallet->ScanForWalletTransactions(pindex);
- pwallet->ReacceptWalletTransactions();
- pwallet->MarkDirty();
-
- return fGood;
-
- }
-
- return false;
-}
+ // open inputfile as stream
+ ifstream file;
+ file.open(strLocation.c_str());
+ if (!file.is_open())
+ return false;
+ bool fGood = true;
+ int64_t nTimeBegin = pindexBest->nTime;
+
+ // read through input file checking and importing keys into wallet.
+ while (file.good()) {
+ std::string line;
+ std::getline(file, line);
+ if (line.empty() || line[0] == '#')
+ continue; // Skip comments and empty lines
+
+ std::vector<std::string> vstr;
+ istringstream iss(line);
+ copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(vstr));
+ if (vstr.size() < 2)
+ continue;
+
+ int64_t nTime = DecodeDumpTime(vstr[1]);
+ std::string strLabel;
+ bool fLabel = true;
+ for (unsigned int nStr = 2; nStr < vstr.size(); nStr++) {
+ if (boost::algorithm::starts_with(vstr[nStr], "#"))
+ break;
+ if (vstr[nStr] == "change=1")
+ fLabel = false;
+ if (vstr[nStr] == "reserve=1")
+ fLabel = false;
+ if (boost::algorithm::starts_with(vstr[nStr], "label=")) {
+ strLabel = DecodeDumpString(vstr[nStr].substr(6));
+ fLabel = true;
+ }
+ }
+
+ CBitcoinAddress addr;
+ CBitcoinSecret vchSecret;
+ if (vchSecret.SetString(vstr[0])) {
+ // Simple private key
+
+ bool fCompressed;
+ CKey key;
+ CSecret secret = vchSecret.GetSecret(fCompressed);
+ key.SetSecret(secret, fCompressed);
+ CKeyID keyid = key.GetPubKey().GetID();
+ addr = CBitcoinAddress(keyid);
+
+ if (pwallet->HaveKey(keyid)) {
+ printf("Skipping import of %s (key already present)\n", addr.ToString().c_str());
+ continue;
+ }
+
+ printf("Importing %s...\n", addr.ToString().c_str());
+ if (!pwallet->AddKey(key)) {
+ fGood = false;
+ continue;
+ }
+ } else {
+ // A pair of private keys
+
+ CMalleableKey mKey;
+ if (!mKey.SetString(vstr[0]))
+ continue;
+ CMalleablePubKey mPubKey = mKey.GetMalleablePubKey();
+ addr = CBitcoinAddress(mPubKey);
+
+ if (pwallet->CheckOwnership(mPubKey)) {
+ printf("Skipping import of %s (key already present)\n", addr.ToString().c_str());
+ continue;
+ }
+
+ printf("Importing %s...\n", addr.ToString().c_str());
+ if (!pwallet->AddKey(mKey)) {
+ fGood = false;
+ continue;
+ }
+ }
+
+ pwallet->mapKeyMetadata[addr].nCreateTime = nTime;
+ if (fLabel)
+ pwallet->SetAddressBookName(addr, strLabel);
+
+ nTimeBegin = std::min(nTimeBegin, nTime);
+ }
+ file.close();
+
+ // rescan block chain looking for coins from new keys
+ CBlockIndex *pindex = pindexBest;
+ while (pindex && pindex->pprev && pindex->nTime > nTimeBegin - 7200)
+ pindex = pindex->pprev;
+
+ printf("Rescanning last %i blocks\n", pindexBest->nHeight - pindex->nHeight + 1);
+ pwallet->ScanForWalletTransactions(pindex);
+ pwallet->ReacceptWalletTransactions();
+ pwallet->MarkDirty();
+
+ return fGood;
+}
//
// Try to (very carefully!) recover wallet.dat if there is a problem.