}
else if (strType == "malpair")
{
- string strKey, strKeyView;
+ string strKeyView;
CSecret vchSecret;
- CMalleableKeyView keyView;
-
ssKey >> strKeyView;
- keyView.SetString(strKeyView);
ssValue >> vchSecret;
- CMalleableKey mKey = keyView.GetMalleableKey(vchSecret);
-
- if (mKey.IsNull())
+ CMalleableKeyView keyView(strKeyView);
+ if (!pwallet->LoadMalleableKey(keyView, vchSecret))
{
- strErr = "Error reading wallet database: CMalleableKey is corrupt";
- return false;
- }
- if (mKey.GetID() != keyView.GetID())
- {
- strErr = "Error reading wallet database: CMalleableKey view inconsistency";
+ strErr = "Error reading wallet database: LoadMalleableKey failed";
return false;
}
+ }
+ else if (strType == "malcpair")
+ {
+ string strKeyView;
+
+ std::vector<unsigned char> vchCryptedSecret;
+ ssKey >> strKeyView;
+ ssValue >> vchCryptedSecret;
- if (!pwallet->LoadMalleableKey(mKey))
+ CMalleableKeyView keyView(strKeyView);
+ if (!pwallet->LoadCryptedMalleableKey(keyView, vchCryptedSecret))
{
- strErr = "Error reading wallet database: LoadMalleableKey failed";
+ strErr = "Error reading wallet database: LoadCryptedMalleableKey failed";
return false;
}
}
static bool IsKeyType(string strType)
{
return (strType== "key" || strType == "wkey" ||
- strType == "mkey" || strType == "ckey" || strType == "malpair");
+ strType == "mkey" || strType == "ckey" || strType == "malpair" || strType == "malcpair");
}
DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
bool DumpWallet(CWallet* pwallet, const string& strDest)
{
+ if (!pwallet->fFileBacked)
+ return false;
- if (!pwallet->fFileBacked)
- return false;
- while (!fShutdown)
- {
- // Populate maps
- std::map<CKeyID, int64_t> mapKeyBirth;
- std::set<CKeyID> setKeyPool;
- pwallet->GetKeyBirthTimes(mapKeyBirth);
- pwallet->GetAllReserveKeys(setKeyPool);
-
- // sort time/key pairs
- std::vector<std::pair<int64_t, CKeyID> > vKeyBirth;
- for (std::map<CKeyID, int64_t>::const_iterator it = mapKeyBirth.begin(); it != mapKeyBirth.end(); it++) {
- vKeyBirth.push_back(std::make_pair(it->second, it->first));
- }
- mapKeyBirth.clear();
- std::sort(vKeyBirth.begin(), vKeyBirth.end());
+ std::map<CBitcoinAddress, int64_t> mapAddresses;
+ std::set<CKeyID> setKeyPool;
- // open outputfile as a stream
- ofstream file;
- file.open(strDest.c_str());
- if (!file.is_open())
- return false;
-
- // produce output
- file << strprintf("# Wallet dump created by NovaCoin %s (%s)\n", CLIENT_BUILD.c_str(), CLIENT_DATE.c_str());
- file << strprintf("# * Created on %s\n", EncodeDumpTime(GetTime()).c_str());
- file << strprintf("# * Best block at time of backup was %i (%s),\n", nBestHeight, hashBestChain.ToString().c_str());
- file << strprintf("# mined on %s\n", EncodeDumpTime(pindexBest->nTime).c_str());
- file << "\n";
- for (std::vector<std::pair<int64_t, CKeyID> >::const_iterator it = vKeyBirth.begin(); it != vKeyBirth.end(); it++) {
- const CKeyID &keyid = it->second;
- std::string strTime = EncodeDumpTime(it->first);
- std::string strAddr = CBitcoinAddress(keyid).ToString();
- bool IsCompressed;
+ pwallet->GetAddresses(mapAddresses);
+ pwallet->GetAllReserveKeys(setKeyPool);
- CKey key;
- if (pwallet->GetKey(keyid, key)) {
- if (pwallet->mapAddressBook.count(keyid)) {
- CSecret secret = key.GetSecret(IsCompressed);
- file << strprintf("%s %s label=%s # addr=%s\n",
- CBitcoinSecret(secret, IsCompressed).ToString().c_str(),
- strTime.c_str(),
- EncodeDumpString(pwallet->mapAddressBook[keyid]).c_str(),
- strAddr.c_str());
- } else if (setKeyPool.count(keyid)) {
- CSecret secret = key.GetSecret(IsCompressed);
- file << strprintf("%s %s reserve=1 # addr=%s\n",
- CBitcoinSecret(secret, IsCompressed).ToString().c_str(),
- strTime.c_str(),
- strAddr.c_str());
- } else {
- CSecret secret = key.GetSecret(IsCompressed);
- file << strprintf("%s %s change=1 # addr=%s\n",
- CBitcoinSecret(secret, IsCompressed).ToString().c_str(),
- strTime.c_str(),
- strAddr.c_str());
- }
- }
- }
- file << "\n";
- file << "# End of dump\n";
- file.close();
- return true;
- }
- return false;
-}
+ // sort time/key pairs
+ std::vector<std::pair<int64_t, CBitcoinAddress> > vAddresses;
+ for (std::map<CBitcoinAddress, int64_t>::const_iterator it = mapAddresses.begin(); it != mapAddresses.end(); it++) {
+ vAddresses.push_back(std::make_pair(it->second, it->first));
+ }
+ mapAddresses.clear();
+ std::sort(vAddresses.begin(), vAddresses.end());
+
+ // open outputfile as a stream
+ ofstream file;
+ file.open(strDest.c_str());
+ if (!file.is_open())
+ return false;
+
+ // produce output
+ file << strprintf("# Wallet dump created by NovaCoin %s (%s)\n", CLIENT_BUILD.c_str(), CLIENT_DATE.c_str());
+ file << strprintf("# * Created on %s\n", EncodeDumpTime(GetTime()).c_str());
+ file << strprintf("# * Best block at time of backup was %i (%s),\n", nBestHeight, hashBestChain.ToString().c_str());
+ file << strprintf("# mined on %s\n", EncodeDumpTime(pindexBest->nTime).c_str());
+ file << "\n";
+
+ for (std::vector<std::pair<int64_t, CBitcoinAddress> >::const_iterator it = vAddresses.begin(); it != vAddresses.end(); it++) {
+ const CBitcoinAddress &addr = it->second;
+ std::string strTime = EncodeDumpTime(it->first);
+ std::string strAddr = addr.ToString();
+
+ if (addr.IsPair()) {
+ // Pubkey pair address
+ CMalleableKeyView keyView;
+ CMalleablePubKey mPubKey(addr.GetData());
+ if (!pwallet->GetMalleableView(mPubKey, keyView))
+ 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());
+ }
+ else {
+ // Pubkey hash address
+ CKeyID keyid;
+ addr.GetKeyID(keyid);
+ bool IsCompressed;
+ CKey key;
+ 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());
+ else if (setKeyPool.count(keyid))
+ file << strprintf(" %s reserve=1 # addr=%s\n", strTime.c_str(), strAddr.c_str());
+ else
+ file << strprintf(" %s change=1 # addr=%s\n", strTime.c_str(), strAddr.c_str());
+ }
+ }
+
+ file << "\n";
+ file << "# End of dump\n";
+ file.close();
+ return true;
+}
bool ImportWallet(CWallet *pwallet, const string& strLocation)
{
continue;
std::vector<std::string> vstr;
- boost::split(vstr, line, boost::is_any_of(" "));
+ istringstream iss(line);
+ copy(istream_iterator<string>(iss), istream_iterator<string>(), back_inserter(vstr));
if (vstr.size() < 2)
continue;
CBitcoinSecret vchSecret;