|
|
@ -1612,7 +1612,7 @@ void CWalletTx::GetAmounts(std::list<COutputEntry>& listReceived, |
|
|
|
* @return Earliest timestamp that could be successfully scanned from. Timestamp |
|
|
|
* @return Earliest timestamp that could be successfully scanned from. Timestamp |
|
|
|
* returned will be higher than startTime if relevant blocks could not be read. |
|
|
|
* returned will be higher than startTime if relevant blocks could not be read. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
int64_t CWallet::RescanFromTime(int64_t startTime, bool update) |
|
|
|
int64_t CWallet::RescanFromTime(int64_t startTime, const WalletRescanReserver& reserver, bool update) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Find starting block. May be null if nCreateTime is greater than the
|
|
|
|
// Find starting block. May be null if nCreateTime is greater than the
|
|
|
|
// highest blockchain timestamp, in which case there is nothing that needs
|
|
|
|
// highest blockchain timestamp, in which case there is nothing that needs
|
|
|
@ -1625,7 +1625,7 @@ int64_t CWallet::RescanFromTime(int64_t startTime, bool update) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (startBlock) { |
|
|
|
if (startBlock) { |
|
|
|
const CBlockIndex* const failedBlock = ScanForWalletTransactions(startBlock, nullptr, update); |
|
|
|
const CBlockIndex* const failedBlock = ScanForWalletTransactions(startBlock, nullptr, reserver, update); |
|
|
|
if (failedBlock) { |
|
|
|
if (failedBlock) { |
|
|
|
return failedBlock->GetBlockTimeMax() + TIMESTAMP_WINDOW + 1; |
|
|
|
return failedBlock->GetBlockTimeMax() + TIMESTAMP_WINDOW + 1; |
|
|
|
} |
|
|
|
} |
|
|
@ -1649,11 +1649,12 @@ int64_t CWallet::RescanFromTime(int64_t startTime, bool update) |
|
|
|
* the main chain after to the addition of any new keys you want to detect |
|
|
|
* the main chain after to the addition of any new keys you want to detect |
|
|
|
* transactions for. |
|
|
|
* transactions for. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlockIndex* pindexStop, bool fUpdate) |
|
|
|
CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlockIndex* pindexStop, const WalletRescanReserver &reserver, bool fUpdate) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int64_t nNow = GetTime(); |
|
|
|
int64_t nNow = GetTime(); |
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
const CChainParams& chainParams = Params(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assert(reserver.isReserved()); |
|
|
|
if (pindexStop) { |
|
|
|
if (pindexStop) { |
|
|
|
assert(pindexStop->nHeight >= pindexStart->nHeight); |
|
|
|
assert(pindexStop->nHeight >= pindexStart->nHeight); |
|
|
|
} |
|
|
|
} |
|
|
@ -1662,8 +1663,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock |
|
|
|
CBlockIndex* ret = nullptr; |
|
|
|
CBlockIndex* ret = nullptr; |
|
|
|
{ |
|
|
|
{ |
|
|
|
fAbortRescan = false; |
|
|
|
fAbortRescan = false; |
|
|
|
fScanningWallet = true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ShowProgress(_("Rescanning..."), 0); // show rescan progress in GUI as dialog or on splashscreen, if -rescan on startup
|
|
|
|
ShowProgress(_("Rescanning..."), 0); // show rescan progress in GUI as dialog or on splashscreen, if -rescan on startup
|
|
|
|
CBlockIndex* tip = nullptr; |
|
|
|
CBlockIndex* tip = nullptr; |
|
|
|
double dProgressStart; |
|
|
|
double dProgressStart; |
|
|
@ -1727,8 +1726,6 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock |
|
|
|
LogPrintf("Rescan aborted at block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex)); |
|
|
|
LogPrintf("Rescan aborted at block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex)); |
|
|
|
} |
|
|
|
} |
|
|
|
ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI
|
|
|
|
ShowProgress(_("Rescanning..."), 100); // hide progress dialog in GUI
|
|
|
|
|
|
|
|
|
|
|
|
fScanningWallet = false; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
return ret; |
|
|
|
return ret; |
|
|
|
} |
|
|
|
} |
|
|
@ -4039,7 +4036,14 @@ CWallet* CWallet::CreateWalletFromFile(const std::string walletFile) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
nStart = GetTimeMillis(); |
|
|
|
nStart = GetTimeMillis(); |
|
|
|
walletInstance->ScanForWalletTransactions(pindexRescan, nullptr, true); |
|
|
|
{ |
|
|
|
|
|
|
|
WalletRescanReserver reserver(walletInstance); |
|
|
|
|
|
|
|
if (!reserver.reserve()) { |
|
|
|
|
|
|
|
InitError(_("Failed to rescan the wallet during initialization")); |
|
|
|
|
|
|
|
return nullptr; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
walletInstance->ScanForWalletTransactions(pindexRescan, nullptr, reserver, true); |
|
|
|
|
|
|
|
} |
|
|
|
LogPrintf(" rescan %15dms\n", GetTimeMillis() - nStart); |
|
|
|
LogPrintf(" rescan %15dms\n", GetTimeMillis() - nStart); |
|
|
|
walletInstance->SetBestChain(chainActive.GetLocator()); |
|
|
|
walletInstance->SetBestChain(chainActive.GetLocator()); |
|
|
|
walletInstance->dbw->IncrementUpdateCounter(); |
|
|
|
walletInstance->dbw->IncrementUpdateCounter(); |
|
|
|