changeset 318:87b3b19407e4 draft

added some DoS limits, removed safe mode git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@199 1a98c847-1fd6-4fd8-948a-caf3550aa51b
author s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
date Sun, 12 Dec 2010 18:20:36 +0000
parents 49ad10c2682f
children a2c88a77d6ac
files main.cpp rpc.cpp serialize.h
diffstat 3 files changed, 37 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/main.cpp
+++ b/main.cpp
@@ -571,9 +571,14 @@
     if ((int64)nLockTime > INT_MAX)
         return error("AcceptToMemoryPool() : not accepting nLockTime beyond 2038 yet");
 
+    // 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() || GetSigOpCount() > 2 || ::GetSerializeSize(*this, SER_NETWORK) < 100)
-        return error("AcceptToMemoryPool() : nonstandard transaction");
+    if (!IsStandard())
+        return error("AcceptToMemoryPool() : nonstandard transaction type");
 
     // Do we already have it?
     uint256 hash = GetHash();
@@ -612,14 +617,36 @@
         }
     }
 
-    // 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
--- a/rpc.cpp
+++ b/rpc.cpp
@@ -1178,31 +1178,6 @@
 };
 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 @@
             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
--- a/serialize.h
+++ b/serialize.h
@@ -25,7 +25,7 @@
 class CAutoFile;
 static const unsigned int MAX_SIZE = 0x02000000;
 
-static const int VERSION = 31800;
+static const int VERSION = 31801;
 static const char* pszSubVer = "";