@ -738,19 +738,22 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi
if ( nFees < GetMinFee ( 1000 ) )
if ( nFees < GetMinFee ( 1000 ) )
return error ( " AcceptToMemoryPool() : not enough fees " ) ;
return error ( " AcceptToMemoryPool() : not enough fees " ) ;
// Limit free transactions per 10 minute s
// Continuously rate-limit free transaction s
if ( nFees < CENT & & GetBoolArg ( " -limitfreerelay " ) )
if ( nFees < CENT )
{
{
static int64 nNextReset ;
static double dFreeCount ;
static int64 nFreeCount ;
static int64 nLastTime ;
if ( GetTime ( ) > nNextReset )
int64 nNow = GetTime ( ) ;
{
// Use an exponentially decaying ~10-minute window:
nNextReset = GetTime ( ) + 10 * 60 ;
dFreeCount * = pow ( 1.0 - 1.0 / 600.0 , ( double ) ( nNow - nLastTime ) ) ;
nFreeCount = 0 ;
nLastTime = nNow ;
}
// -limitfreerelay unit is thousand-bytes-per-minute
if ( nFreeCount > 150000 & & ! IsFromMe ( ) )
// At default rate it would take over a month to fill 1GB
if ( dFreeCount > GetArg ( " -limitfreerelay " , 15 ) * 10 * 1000 & & ! IsFromMe ( ) )
return error ( " AcceptToMemoryPool() : free transaction rejected by rate limiter " ) ;
return error ( " AcceptToMemoryPool() : free transaction rejected by rate limiter " ) ;
nFreeCount + = nSize ;
if ( fDebug )
printf ( " Rate limit dFreeCount: %g => %g \n " , dFreeCount , dFreeCount + nSize ) ;
dFreeCount + = nSize ;
}
}
}
}