aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2010-12-12 16:03:42 -0500
committerGavin Andresen <gavinandresen@gmail.com>2010-12-12 16:03:42 -0500
commit9c17a685bdd69f60c3140f6d502696c880254893 (patch)
tree7d43675cfe4c300eadc024c6a023785a596cc396
parentd12e53ea090ba49a82ff4f79782af809d21cf280 (diff)
parent986b5e257e2bb9d7aaed5111ca335732f8808b2d (diff)
downloadbitcoin-9c17a685bdd69f60c3140f6d502696c880254893.tar.xz
Merge remote branch 'refs/remotes/svn/trunk' into svn
-rw-r--r--main.cpp46
-rw-r--r--main.h10
-rw-r--r--serialize.h2
3 files changed, 41 insertions, 17 deletions
diff --git a/main.cpp b/main.cpp
index 10d482d898..1d9b35b534 100644
--- a/main.cpp
+++ b/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
@@ -1926,7 +1953,6 @@ string GetWarnings(string strFor)
{
nPriority = alert.nPriority;
strStatusBar = alert.strStatusBar;
- strRPC = alert.strRPCError;
}
}
}
diff --git a/main.h b/main.h
index 0b950e8074..088e2860c3 100644
--- a/main.h
+++ b/main.h
@@ -1754,7 +1754,7 @@ public:
// Actions
string strComment;
string strStatusBar;
- string strRPCError;
+ string strReserved;
IMPLEMENT_SERIALIZE
(
@@ -1772,7 +1772,7 @@ public:
READWRITE(strComment);
READWRITE(strStatusBar);
- READWRITE(strRPCError);
+ READWRITE(strReserved);
)
void SetNull()
@@ -1790,7 +1790,7 @@ public:
strComment.clear();
strStatusBar.clear();
- strRPCError.clear();
+ strReserved.clear();
}
string ToString() const
@@ -1815,7 +1815,6 @@ public:
" nPriority = %d\n"
" strComment = \"%s\"\n"
" strStatusBar = \"%s\"\n"
- " strRPCError = \"%s\"\n"
")\n",
nVersion,
nRelayUntil,
@@ -1828,8 +1827,7 @@ public:
strSetSubVer.c_str(),
nPriority,
strComment.c_str(),
- strStatusBar.c_str(),
- strRPCError.c_str());
+ strStatusBar.c_str());
}
void print() const
diff --git a/serialize.h b/serialize.h
index 4e90b76c03..ad9fb9faae 100644
--- a/serialize.h
+++ b/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 = "";