@ -2564,6 +2564,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
else if ( strCommand = = " tx " )
else if ( strCommand = = " tx " )
{
{
vector < uint256 > vWorkQueue ;
vector < uint256 > vWorkQueue ;
vector < uint256 > vEraseQueue ;
CDataStream vMsg ( vRecv ) ;
CDataStream vMsg ( vRecv ) ;
CTxDB txdb ( " r " ) ;
CTxDB txdb ( " r " ) ;
CTransaction tx ;
CTransaction tx ;
@ -2579,6 +2580,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
RelayMessage ( inv , vMsg ) ;
RelayMessage ( inv , vMsg ) ;
mapAlreadyAskedFor . erase ( inv ) ;
mapAlreadyAskedFor . erase ( inv ) ;
vWorkQueue . push_back ( inv . hash ) ;
vWorkQueue . push_back ( inv . hash ) ;
vEraseQueue . push_back ( inv . hash ) ;
// Recursively process any orphan transactions that depended on this one
// Recursively process any orphan transactions that depended on this one
for ( unsigned int i = 0 ; i < vWorkQueue . size ( ) ; i + + )
for ( unsigned int i = 0 ; i < vWorkQueue . size ( ) ; i + + )
@ -2592,19 +2594,27 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
CTransaction tx ;
CTransaction tx ;
CDataStream ( vMsg ) > > tx ;
CDataStream ( vMsg ) > > tx ;
CInv inv ( MSG_TX , tx . GetHash ( ) ) ;
CInv inv ( MSG_TX , tx . GetHash ( ) ) ;
bool fMissingInputs2 = false ;
if ( tx . AcceptToMemoryPool ( txdb , true ) )
if ( tx . AcceptToMemoryPool ( txdb , true , & fMissingInputs2 ) )
{
{
printf ( " accepted orphan tx %s \n " , inv . hash . ToString ( ) . substr ( 0 , 10 ) . c_str ( ) ) ;
printf ( " accepted orphan tx %s \n " , inv . hash . ToString ( ) . substr ( 0 , 10 ) . c_str ( ) ) ;
SyncWithWallets ( tx , NULL , true ) ;
SyncWithWallets ( tx , NULL , true ) ;
RelayMessage ( inv , vMsg ) ;
RelayMessage ( inv , vMsg ) ;
mapAlreadyAskedFor . erase ( inv ) ;
mapAlreadyAskedFor . erase ( inv ) ;
vWorkQueue . push_back ( inv . hash ) ;
vWorkQueue . push_back ( inv . hash ) ;
vEraseQueue . push_back ( inv . hash ) ;
}
else if ( ! fMissingInputs2 )
{
// invalid orphan
vEraseQueue . push_back ( inv . hash ) ;
printf ( " removed invalid orphan tx %s \n " , inv . hash . ToString ( ) . substr ( 0 , 10 ) . c_str ( ) ) ;
}
}
}
}
}
}
BOOST_FOREACH ( uint256 hash , vWorkQueue )
BOOST_FOREACH ( uint256 hash , vErase Queue )
EraseOrphanTx ( hash ) ;
EraseOrphanTx ( hash ) ;
}
}
else if ( fMissingInputs )
else if ( fMissingInputs )