mirror of
https://github.com/cygnusxi/CurecoinSource.git
synced 2025-07-27 07:34:41 +02:00
Add zap tx function
This commit is contained in:
parent
03b18b4f42
commit
d2e3cf49b9
18
src/init.cpp
18
src/init.cpp
@ -282,6 +282,7 @@ std::string HelpMessage()
|
||||
" -upgradewallet " + _("Upgrade wallet to latest format") + "\n" +
|
||||
" -keypool=<n> " + _("Set key pool size to <n> (default: 100)") + "\n" +
|
||||
" -rescan " + _("Rescan the block chain for missing wallet transactions") + "\n" +
|
||||
" -zapwallettxes " + _("Clear list of wallet transactions (diagnostic tool; implies -rescan)") + "\n" +
|
||||
" -salvagewallet " + _("Attempt to recover private keys from a corrupt wallet.dat") + "\n" +
|
||||
" -checkblocks=<n> " + _("How many blocks to check at startup (default: 2500, 0 = all)") + "\n" +
|
||||
" -checklevel=<n> " + _("How thorough the block verification is (0-6, default: 1)") + "\n" +
|
||||
@ -388,6 +389,12 @@ bool AppInit2()
|
||||
SoftSetBoolArg("-rescan", true);
|
||||
}
|
||||
|
||||
// -zapwallettx implies a rescan
|
||||
if (GetBoolArg("-zapwallettxes", false)) {
|
||||
if (SoftSetBoolArg("-rescan", true))
|
||||
{ /* LogPrintf("AppInit2 : parameter interaction: -zapwallettxes=1 -> setting -rescan=1\n"); */ }
|
||||
}
|
||||
|
||||
// ********************************************************* Step 3: parameter-to-internal-flags
|
||||
|
||||
fDebug = GetBoolArg("-debug");
|
||||
@ -720,6 +727,17 @@ bool AppInit2()
|
||||
}
|
||||
|
||||
// ********************************************************* Step 8: load wallet
|
||||
if (GetBoolArg("-zapwallettxes", false)) {
|
||||
uiInterface.InitMessage(_("Zapping all transactions from wallet..."));
|
||||
pwalletMain = new CWallet("wallet.dat");
|
||||
DBErrors nZapWalletRet = pwalletMain->ZapWalletTx();
|
||||
if (nZapWalletRet != DB_LOAD_OK) {
|
||||
uiInterface.InitMessage(_("Error loading wallet.dat: Wallet corrupted"));
|
||||
return false;
|
||||
}
|
||||
delete pwalletMain;
|
||||
pwalletMain = NULL;
|
||||
}
|
||||
|
||||
uiInterface.InitMessage(_("<font style='color: black'>Loading wallet...</font>"));
|
||||
printf("Loading wallet...\n");
|
||||
|
@ -1799,6 +1799,28 @@ DBErrors CWallet::LoadWallet(bool& fFirstRunRet)
|
||||
return DB_LOAD_OK;
|
||||
}
|
||||
|
||||
DBErrors CWallet::ZapWalletTx()
|
||||
{
|
||||
if (!fFileBacked)
|
||||
return DB_LOAD_OK;
|
||||
DBErrors nZapWalletTxRet = CWalletDB(strWalletFile,"cr+").ZapWalletTx(this);
|
||||
if (nZapWalletTxRet == DB_NEED_REWRITE)
|
||||
{
|
||||
if (CDB::Rewrite(strWalletFile, "\x04pool"))
|
||||
{
|
||||
LOCK(cs_wallet);
|
||||
setKeyPool.clear();
|
||||
// Note: can't top-up keypool here, because wallet is locked.
|
||||
// User will be prompted to unlock wallet the next operation
|
||||
// the requires a new key.
|
||||
}
|
||||
}
|
||||
|
||||
if (nZapWalletTxRet != DB_LOAD_OK)
|
||||
return nZapWalletTxRet;
|
||||
|
||||
return DB_LOAD_OK;
|
||||
}
|
||||
|
||||
bool CWallet::SetAddressBookName(const CTxDestination& address, const string& strName)
|
||||
{
|
||||
|
@ -272,6 +272,8 @@ public:
|
||||
|
||||
DBErrors LoadWallet(bool& fFirstRunRet);
|
||||
|
||||
DBErrors ZapWalletTx();
|
||||
|
||||
bool SetAddressBookName(const CTxDestination& address, const std::string& strName);
|
||||
|
||||
bool DelAddressBookName(const CTxDestination& address);
|
||||
|
@ -482,6 +482,83 @@ 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)
|
||||
{
|
||||
// LogPrintf("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)
|
||||
{
|
||||
// LogPrintf("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;
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -156,6 +156,8 @@ public:
|
||||
|
||||
DBErrors ReorderTransactions(CWallet*);
|
||||
DBErrors LoadWallet(CWallet* pwallet);
|
||||
DBErrors FindWalletTx(CWallet* pwallet, std::vector<uint256>& vTxHash);
|
||||
DBErrors ZapWalletTx(CWallet* pwallet);
|
||||
static bool Recover(CDBEnv& dbenv, std::string filename, bool fOnlyKeys);
|
||||
static bool Recover(CDBEnv& dbenv, std::string filename);
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user