X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fwalletdb.cpp;h=1a90f74f3e901beb17db423789a61b87f0bea664;hb=727ca3e7b4bcec6d7a3aae1485c84a35ac9df93e;hp=2fe59ce54b911bda8d8af6250d7d0e757efefff9;hpb=edc83f6417f70f35539776cce6cdceb9d896a41b;p=novacoin.git diff --git a/src/walletdb.cpp b/src/walletdb.cpp index 2fe59ce..1a90f74 100644 --- a/src/walletdb.cpp +++ b/src/walletdb.cpp @@ -304,31 +304,31 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, } 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 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; } } @@ -497,7 +497,7 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue, 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) @@ -784,75 +784,76 @@ bool BackupWallet(const CWallet& wallet, const string& strDest) bool DumpWallet(CWallet* pwallet, const string& strDest) { + if (!pwallet->fFileBacked) + return false; - if (!pwallet->fFileBacked) - return false; - while (!fShutdown) - { - // Populate maps - std::map mapKeyBirth; - std::set setKeyPool; - pwallet->GetKeyBirthTimes(mapKeyBirth); - pwallet->GetAllReserveKeys(setKeyPool); - - // sort time/key pairs - std::vector > vKeyBirth; - for (std::map::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 mapAddresses; + std::set 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 >::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 > vAddresses; + for (std::map::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 >::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(); + 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) { @@ -879,7 +880,8 @@ bool ImportWallet(CWallet *pwallet, const string& strLocation) continue; std::vector vstr; - boost::split(vstr, line, boost::is_any_of(" ")); + istringstream iss(line); + copy(istream_iterator(iss), istream_iterator(), back_inserter(vstr)); if (vstr.size() < 2) continue; CBitcoinSecret vchSecret;