Satoshi MailBeta Open in Satoshi Mail

added some DoS limits, removed safe mode

Commit by Satoshi Nakamoto (s_nakamoto) on 12 December 2010 · SVN r199 · release v0.3.19 · 3 files, +37 −40

Open in Satoshi Mail View on GitHub

Files changed

main.cpp
@@ -571,10 +571,15 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi
     if ((int64)nLockTime > INT_MAX)
         return error("AcceptToMemoryPool() : not accepting nLockTime beyond 2038 yet");
 
-    // Rather not work on nonstandard transactions
-    if (!IsStandard() || GetSigOpCount() > 2 || ::GetSerializeSize(*this, SER_NETWORK) < 100)
+    // Safety limits
+    unsigned int nSize = ::GetSerializeSize(*this, SER_NETWORK);
+    if (GetSigOpCount() > 2 || nSize < 100)
         return error("AcceptToMemoryPool() : nonstandard transaction");
 
+    // Rather not work on nonstandard transactions
+    if (!IsStandard())
+        return error("AcceptToMemoryPool() : nonstandard transaction type");
+
     // Do we already have it?
     uint256 hash = GetHash();
     CRITICAL_BLOCK(cs_mapTransactions)
@@ -612,14 +617,36 @@ bool CTransaction::AcceptToMemoryPool(CTxDB& txdb, bool fCheckInputs, bool* pfMi
         }
     }
 
-    // Check against previous transactions
-    map<uint256, CTxIndex> mapUnused;
-    int64 nFees = 0;
-    if (fCheckInputs && !ConnectInputs(txdb, mapUnused, CDiskTxPos(1,1,1), pindexBest, nFees, false, false))
+    if (fCheckInputs)
     {
-        if (pfMissingInputs)
-            *pfMissingInputs = true;
-        return error("AcceptToMemoryPool() : ConnectInputs failed %s", hash.ToString().substr(0,10).c_str());
+        // Check against previous transactions
+        map<uint256, CTxIndex> mapUnused;
+        int64 nFees = 0;
+        if (!ConnectInputs(txdb, mapUnused, CDiskTxPos(1,1,1), pindexBest, nFees, false, false))
+        {
+            if (pfMissingInputs)
+                *pfMissingInputs = true;
+            return error("AcceptToMemoryPool() : ConnectInputs failed %s", hash.ToString().substr(0,10).c_str());
+        }
+
+        // Don't accept it if it can't get into a block
+        if (nFees < GetMinFee(1000))
+            return error("AcceptToMemoryPool() : not enough fees");
+
+        // Limit free transactions per 10 minutes
+        if (nFees < CENT && GetBoolArg("-limitfreerelay"))
+        {
+            static int64 nNextReset;
+            static int64 nFreeCount;
+            if (GetTime() > nNextReset)
+            {
+                nNextReset = GetTime() + 10 * 60;
+                nFreeCount = 0;
+            }
+            if (nFreeCount > 150000 && !IsFromMe())
+                return error("AcceptToMemoryPool() : free transaction rejected by rate limiter");
+            nFreeCount += nSize;
+        }
     }
 
     // Store transaction in memory
rpc.cpp
@@ -1178,31 +1178,6 @@ pair<string, rpcfn_type> pCallTable[] =
 };
 map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0]));
 
-string pAllowInSafeMode[] =
-{
-    "help",
-    "stop",
-    "getblockcount",
-    "getblocknumber",
-    "getconnectioncount",
-    "getdifficulty",
-    "getgenerate",
-    "setgenerate",
-    "gethashespersec",
-    "getinfo",
-    "getnewaddress",
-    "getaccountaddress",
-    "setlabel",
-    "getaccount",
-    "getlabel", // deprecated
-    "getaddressesbyaccount",
-    "getaddressesbylabel", // deprecated
-    "backupwallet",
-    "validateaddress",
-    "getwork",
-};
-set<string> setAllowInSafeMode(pAllowInSafeMode, pAllowInSafeMode + sizeof(pAllowInSafeMode)/sizeof(pAllowInSafeMode[0]));
-
 
 
 
@@ -1640,11 +1615,6 @@ void ThreadRPCServer2(void* parg)
             if (mi == mapCallTable.end())
                 throw JSONRPCError(-32601, "Method not found");
 
-            // Observe safe mode
-            string strWarning = GetWarnings("rpc");
-            if (strWarning != "" && !GetBoolArg("-disablesafemode") && !setAllowInSafeMode.count(strMethod))
-                throw JSONRPCError(-2, string("Safe mode: ") + strWarning);
-
             try
             {
                 // Execute
serialize.h
@@ -25,7 +25,7 @@ class CDataStream;
 class CAutoFile;
 static const unsigned int MAX_SIZE = 0x02000000;
 
-static const int VERSION = 31800;
+static const int VERSION = 31801;
 static const char* pszSubVer = "";