#include "walletdb.h"
#include "wallet.h"
+#include "base58.h"
#include <iostream>
#include <fstream>
// Taking advantage of the fact that pair serialization
// is just the two items serialized one after the other
ssKey >> strType;
+
if (strType == "name")
{
string strAddress;
// so set the wallet birthday to the beginning of time.
pwallet->nTimeFirstKey = 1;
}
+ else if (strType == "malpair")
+ {
+ string strKeyView;
+
+ CSecret vchSecret;
+ ssKey >> strKeyView;
+ ssValue >> vchSecret;
+
+ CMalleableKeyView keyView(strKeyView);
+ if (!pwallet->LoadMalleableKey(keyView, vchSecret))
+ {
+ strErr = "Error reading wallet database: LoadMalleableKey failed";
+ return false;
+ }
+ }
+ else if (strType == "malcpair")
+ {
+ string strKeyView;
+
+ std::vector<unsigned char> vchCryptedSecret;
+ ssKey >> strKeyView;
+ ssValue >> vchCryptedSecret;
+
+ CMalleableKeyView keyView(strKeyView);
+ if (!pwallet->LoadCryptedMalleableKey(keyView, vchCryptedSecret))
+ {
+ strErr = "Error reading wallet database: LoadCryptedMalleableKey failed";
+ return false;
+ }
+ }
else if (strType == "key" || strType == "wkey")
{
vector<unsigned char> vchPubKey;
ssKey >> nID;
CMasterKey kMasterKey;
ssValue >> kMasterKey;
+
if(pwallet->mapMasterKeys.count(nID) != 0)
{
strErr = strprintf("Error reading wallet database: duplicate CMasterKey id %u", nID);
}
wss.fIsEncrypted = true;
}
+ else if (strType == "malmeta")
+ {
+ string strKeyView;
+ ssKey >> strKeyView;
+
+ CMalleableKeyView keyView;
+ keyView.SetString(strKeyView);
+
+ CKeyMetadata keyMeta;
+ ssValue >> keyMeta;
+ wss.nKeyMeta++;
+
+ pwallet->LoadMalleableKeyMetadata(keyView, keyMeta);
+ }
else if (strType == "keymeta")
{
CPubKey vchPubKey;
static bool IsKeyType(string strType)
{
return (strType== "key" || strType == "wkey" ||
- strType == "mkey" || strType == "ckey");
+ strType == "mkey" || strType == "ckey" || strType == "malpair" || strType == "malcpair");
}
DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
return result;
}
+DBErrors CWalletDB::FindWalletTx(CWallet* pwallet, vector<uint256>& vTxHash)
+{
+ pwallet->vchDefaultKey = CPubKey();
+ CWalletScanState wss;
+ bool fNoncriticalErrors = false;
+ DBErrors result = DB_LOAD_OK;
+
+ try {
+ LOCK(pwallet->cs_wallet);
+ int nMinVersion = 0;
+ if (Read((string)"minversion", nMinVersion))
+ {
+ if (nMinVersion > CLIENT_VERSION)
+ return DB_TOO_NEW;
+ pwallet->LoadMinVersion(nMinVersion);
+ }
+
+ // Get cursor
+ Dbc* pcursor = GetCursor();
+ if (!pcursor)
+ {
+ printf("Error getting wallet database cursor\n");
+ return DB_CORRUPT;
+ }
+
+ while (true)
+ {
+ // Read next record
+ CDataStream ssKey(SER_DISK, CLIENT_VERSION);
+ CDataStream ssValue(SER_DISK, CLIENT_VERSION);
+ int ret = ReadAtCursor(pcursor, ssKey, ssValue);
+ if (ret == DB_NOTFOUND)
+ break;
+ else if (ret != 0)
+ {
+ printf("Error reading next record from wallet database\n");
+ return DB_CORRUPT;
+ }
+
+ string strType;
+ ssKey >> strType;
+ if (strType == "tx") {
+ uint256 hash;
+ ssKey >> hash;
+
+ vTxHash.push_back(hash);
+ }
+ }
+ pcursor->close();
+ }
+ catch (boost::thread_interrupted) {
+ throw;
+ }
+ catch (...) {
+ result = DB_CORRUPT;
+ }
+
+ if (fNoncriticalErrors && result == DB_LOAD_OK)
+ result = DB_NONCRITICAL_ERROR;
+
+ return result;
+}
+
+DBErrors CWalletDB::ZapWalletTx(CWallet* pwallet)
+{
+ // build list of wallet TXs
+ vector<uint256> vTxHash;
+ DBErrors err = FindWalletTx(pwallet, vTxHash);
+ if (err != DB_LOAD_OK)
+ return err;
+
+ // erase each wallet TX
+ BOOST_FOREACH (uint256& hash, vTxHash) {
+ if (!EraseTx(hash))
+ return DB_CORRUPT;
+ }
+
+ return DB_LOAD_OK;
+}
+
void ThreadFlushWalletDB(void* parg)
{
// Make this thread recognisable as the wallet flushing thread
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;