Mercurial > hg > bitcoin
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