require some minimal priority for free transactions to slow down transaction spam
authors_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Fri, 19 Nov 2010 23:37:05 +0000 (23:37 +0000)
committers_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
Fri, 19 Nov 2010 23:37:05 +0000 (23:37 +0000)
git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@185 1a98c847-1fd6-4fd8-948a-caf3550aa51b

main.cpp
main.h
serialize.h

index 6848342..8e32ee7 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -3197,6 +3197,7 @@ void BitcoinMiner()
             while (!mapPriority.empty())
             {
                 // Take highest priority transaction off priority queue
+                double dPriority = (*mapPriority.begin()).first;
                 CTransaction& tx = *(*mapPriority.begin()).second;
                 mapPriority.erase(mapPriority.begin());
 
@@ -3208,8 +3209,9 @@ void BitcoinMiner()
                 if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
                     continue;
 
-                // Transaction fee based on block size
-                int64 nMinFee = tx.GetMinFee(nBlockSize);
+                // Transaction fee required depends on block size
+                bool fAllowFree = (nBlockSize + nTxSize < 4000 || dPriority > COIN * 144 / 250);
+                int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree);
 
                 // Connecting shouldn't fail due to dependency on other memory pool transactions
                 // because we're already processing them in order of dependency
diff --git a/main.h b/main.h
index d573410..cc150e6 100644 (file)
--- a/main.h
+++ b/main.h
@@ -528,21 +528,24 @@ public:
         return nValueOut;
     }
 
-    int64 GetMinFee(unsigned int nBlockSize=1) const
+    int64 GetMinFee(unsigned int nBlockSize=1, bool fAllowFree=true) const
     {
         // Base fee is 1 cent per kilobyte
         unsigned int nBytes = ::GetSerializeSize(*this, SER_NETWORK);
         unsigned int nNewBlockSize = nBlockSize + nBytes;
         int64 nMinFee = (1 + (int64)nBytes / 1000) * CENT;
 
-        // Transactions under 25K are free as long as block size is under 40K
-        // (about 11,000bc if made of 50bc inputs)
-        if (nBytes < 25000 && nNewBlockSize < 40000)
-            nMinFee = 0;
-
-        // Transactions under 3K are free as long as block size is under 50K
-        if (nBytes < 3000 && nNewBlockSize < 50000)
-            nMinFee = 0;
+        if (fAllowFree)
+        {
+            // Transactions under 25K are free as long as block size is under 40K
+            // (about 11,000bc if made of 50bc inputs)
+            if (nBytes < 25000 && nNewBlockSize < 40000)
+                nMinFee = 0;
+
+            // Transactions under 3K are free as long as block size is under 50K
+            if (nBytes < 3000 && nNewBlockSize < 50000)
+                nMinFee = 0;
+        }
 
         // To limit dust spam, require a 0.01 fee if any output is less than 0.01
         if (nMinFee < CENT)
index 342a039..0fc3366 100644 (file)
@@ -22,7 +22,7 @@ class CDataStream;
 class CAutoFile;
 static const unsigned int MAX_SIZE = 0x02000000;
 
-static const int VERSION = 31502;
+static const int VERSION = 31503;
 static const char* pszSubVer = "";