Browse Source

Merge branch 'limitfree' of /Users/gavin/src/integration_btc

0.8
Gavin Andresen 14 years ago
parent
commit
2abd56f428
  1. 34
      main.cpp

34
main.cpp

@ -742,19 +742,29 @@ 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 minutes // Continuously rate-limit free transactions
if (nFees < CENT && GetBoolArg("-limitfreerelay")) // This mitigates 'penny-flooding' -- sending thousands of free transactions just to
{ // be annoying or make other's transactions take longer to confirm.
static int64 nNextReset; if (nFees < CENT)
static int64 nFreeCount; {
if (GetTime() > nNextReset) static CCriticalSection cs;
{ static double dFreeCount;
nNextReset = GetTime() + 10 * 60; static int64 nLastTime;
nFreeCount = 0; int64 nNow = GetTime();
CRITICAL_BLOCK(cs)
{
// Use an exponentially decaying ~10-minute window:
dFreeCount *= pow(1.0 - 1.0/600.0, (double)(nNow - nLastTime));
nLastTime = nNow;
// -limitfreerelay unit is thousand-bytes-per-minute
// 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");
if (fDebug)
printf("Rate limit dFreeCount: %g => %g\n", dFreeCount, dFreeCount+nSize);
dFreeCount += nSize;
} }
if (nFreeCount > 150000 && !IsFromMe())
return error("AcceptToMemoryPool() : free transaction rejected by rate limiter");
nFreeCount += nSize;
} }
} }

Loading…
Cancel
Save