@ -2829,7 +2829,7 @@ void wallet2::remove_obsolete_pool_txs(const std::vector<crypto::hash> &tx_hashe
}
//----------------------------------------------------------------------------------------------------
void wallet2 : : update_pool_state ( bool refreshed )
void wallet2 : : update_pool_state ( std : : vector < std : : pair < cryptonote : : transaction , bool > > & process_txs , bool refreshed )
{
MTRACE ( " update_pool_state start " ) ;
@ -3019,13 +3019,7 @@ void wallet2::update_pool_state(bool refreshed)
[ tx_hash ] ( const std : : pair < crypto : : hash , bool > & e ) { return e . first = = tx_hash ; } ) ;
if ( i ! = txids . end ( ) )
{
process_new_transaction ( tx_hash , tx , std : : vector < uint64_t > ( ) , 0 , 0 , time ( NULL ) , false , true , tx_entry . double_spend_seen , { } ) ;
m_scanned_pool_txs [ 0 ] . insert ( tx_hash ) ;
if ( m_scanned_pool_txs [ 0 ] . size ( ) > 5000 )
{
std : : swap ( m_scanned_pool_txs [ 0 ] , m_scanned_pool_txs [ 1 ] ) ;
m_scanned_pool_txs [ 0 ] . clear ( ) ;
}
process_txs . push_back ( std : : make_pair ( tx , tx_entry . double_spend_seen ) ) ;
}
else
{
@ -3056,6 +3050,24 @@ void wallet2::update_pool_state(bool refreshed)
MTRACE ( " update_pool_state end " ) ;
}
//----------------------------------------------------------------------------------------------------
void wallet2 : : process_pool_state ( const std : : vector < std : : pair < cryptonote : : transaction , bool > > & txs )
{
const time_t now = time ( NULL ) ;
for ( const auto & e : txs )
{
const cryptonote : : transaction & tx = e . first ;
const bool double_spend_seen = e . second ;
const crypto : : hash tx_hash = get_transaction_hash ( tx ) ;
process_new_transaction ( tx_hash , tx , std : : vector < uint64_t > ( ) , 0 , 0 , now , false , true , double_spend_seen , { } ) ;
m_scanned_pool_txs [ 0 ] . insert ( tx_hash ) ;
if ( m_scanned_pool_txs [ 0 ] . size ( ) > 5000 )
{
std : : swap ( m_scanned_pool_txs [ 0 ] , m_scanned_pool_txs [ 1 ] ) ;
m_scanned_pool_txs [ 0 ] . clear ( ) ;
}
}
}
//----------------------------------------------------------------------------------------------------
void wallet2 : : fast_refresh ( uint64_t stop_height , uint64_t & blocks_start_height , std : : list < crypto : : hash > & short_chain_history , bool force )
{
std : : vector < crypto : : hash > hashes ;
@ -3259,6 +3271,14 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
} ) ;
auto scope_exit_handler_hwdev = epee : : misc_utils : : create_scope_leave_handler ( [ & ] ( ) { hwdev . computing_key_images ( false ) ; } ) ;
// get updated pool state first, but do not process those txes just yet,
// since that might cause a password prompt, which would introduce a data
// leak allowing a passive adversary with traffic analysis capability to
// infer when we get an incoming output
std : : vector < std : : pair < cryptonote : : transaction , bool > > process_pool_txs ;
update_pool_state ( process_pool_txs , refreshed ) ;
bool first = true , last = false ;
while ( m_run . load ( std : : memory_order_relaxed ) )
{
@ -3389,8 +3409,8 @@ void wallet2::refresh(bool trusted_daemon, uint64_t start_height, uint64_t & blo
try
{
// If stop() is called we don't need to check pending transactions
if ( check_pool & & m_run . load ( std : : memory_order_relaxed ) )
update_pool_state( refreshed ) ;
if ( check_pool & & m_run . load ( std : : memory_order_relaxed ) & & ! process_pool_txs . empty ( ) )
process_pool_state( process_pool_txs ) ;
}
catch ( . . . )
{