@ -39,6 +39,7 @@
using namespace std ;
static uint64_t nAccountingEntryNumber = 0 ;
static list < uint256 > deadTxns ;
//
// CWalletDB
@ -484,8 +485,11 @@ ReadKeyValue(CWallet* pwallet, CDataStream& ssKey, CDataStream& ssValue,
CValidationState state ;
auto verifier = libzcash : : ProofVerifier : : Strict ( ) ;
if ( ! ( CheckTransaction ( 0 , wtx , state , verifier ) & & ( wtx . GetHash ( ) = = hash ) & & state . IsValid ( ) ) )
{
fprintf ( stderr , " Removing corrupt tx from wallet.%s \n " , hash . ToString ( ) . c_str ( ) ) ;
deadTxns . push_back ( hash ) ;
return false ;
}
// Undo serialize changes in 31600
if ( 31404 < = wtx . fTimeReceivedIsTxTime & & wtx . fTimeReceivedIsTxTime < = 31703 )
{
@ -933,12 +937,6 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
{
// Leave other errors alone, if we try to fix them we might make things worse.
fNoncriticalErrors = true ; // ... but do warn the user there is something wrong.
if ( strType = = " tx " )
{
// Rescan if there is a bad transaction record..
//SoftSetBoolArg("-rescan", true);
fprintf ( stderr , " TX corrupted.. aborted rescan! \n " ) ;
}
}
}
if ( ! strErr . empty ( ) )
@ -952,6 +950,16 @@ DBErrors CWalletDB::LoadWallet(CWallet* pwallet)
catch ( . . . ) {
result = DB_CORRUPT ;
}
if ( ! deadTxns . empty ( ) )
{
BOOST_FOREACH ( uint256 & hash , deadTxns ) {
if ( ! EraseTx ( hash ) )
fprintf ( stderr , " could not delete tx.%s \n " , hash . ToString ( ) . c_str ( ) ) ;
}
fprintf ( stderr , " Cleared %i corrupted transactions from wallet. \n " , deadTxns . size ( ) ) ;
deadTxns . clear ( ) ;
}
if ( fNoncriticalErrors & & result = = DB_LOAD_OK )
result = DB_NONCRITICAL_ERROR ;