simplification: removed most of CreateNewBlock
[electrum-server.git] / patches / bitcoin-0.6.2.diff
index 2c3821a..b55e8c8 100644 (file)
@@ -55,51 +55,182 @@ index 15bcf1d..1ace361 100644
  
  CRPCTable::CRPCTable()
 diff --git a/src/main.cpp b/src/main.cpp
-index 427e435..35da486 100644
+index 427e435..35a0aea 100644
 --- a/src/main.cpp
 +++ b/src/main.cpp
-@@ -3160,6 +3160,10 @@ CBlock* CreateNewBlock(CReserveKey& reservekey)
-             if (tx.IsCoinBase() || !tx.IsFinal())
-                 continue;
+@@ -3134,156 +3134,28 @@ CBlock* CreateNewBlock(CReserveKey& reservekey)
+     if (!pblock.get())
+         return NULL;
  
-+          if (tx.get_electrum_flag())
-+            continue;
-+          tx.set_electrum_flag(true);
-+
-             COrphan* porphan = NULL;
-             double dPriority = 0;
-             BOOST_FOREACH(const CTxIn& txin, tx.vin)
-@@ -3222,18 +3226,21 @@ CBlock* CreateNewBlock(CReserveKey& reservekey)
+-    // Create coinbase tx
+-    CTransaction txNew;
+-    txNew.vin.resize(1);
+-    txNew.vin[0].prevout.SetNull();
+-    txNew.vout.resize(1);
+-    txNew.vout[0].scriptPubKey << reservekey.GetReservedKey() << OP_CHECKSIG;
+-
+-    // Add our coinbase tx as first transaction
+-    pblock->vtx.push_back(txNew);
+-
+     // Collect memory pool transactions into the block
+-    int64 nFees = 0;
+     {
+         LOCK2(cs_main, mempool.cs);
+         CTxDB txdb("r");
  
-             // Size limits
-             unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
+-        // Priority order to process transactions
+-        list<COrphan> vOrphan; // list memory doesn't move
+-        map<uint256, vector<COrphan*> > mapDependers;
+-        multimap<double, CTransaction*> mapPriority;
+-        for (map<uint256, CTransaction>::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi)
+-        {
+-            CTransaction& tx = (*mi).second;
+-            if (tx.IsCoinBase() || !tx.IsFinal())
+-                continue;
+-
+-            COrphan* porphan = NULL;
+-            double dPriority = 0;
+-            BOOST_FOREACH(const CTxIn& txin, tx.vin)
+-            {
+-                // Read prev transaction
+-                CTransaction txPrev;
+-                CTxIndex txindex;
+-                if (!txPrev.ReadFromDisk(txdb, txin.prevout, txindex))
+-                {
+-                    // Has to wait for dependencies
+-                    if (!porphan)
+-                    {
+-                        // Use list for automatic deletion
+-                        vOrphan.push_back(COrphan(&tx));
+-                        porphan = &vOrphan.back();
+-                    }
+-                    mapDependers[txin.prevout.hash].push_back(porphan);
+-                    porphan->setDependsOn.insert(txin.prevout.hash);
+-                    continue;
+-                }
+-                int64 nValueIn = txPrev.vout[txin.prevout.n].nValue;
+-
+-                // Read block header
+-                int nConf = txindex.GetDepthInMainChain();
+-
+-                dPriority += (double)nValueIn * nConf;
+-
+-                if (fDebug && GetBoolArg("-printpriority"))
+-                    printf("priority     nValueIn=%-12I64d nConf=%-5d dPriority=%-20.1f\n", nValueIn, nConf, dPriority);
+-            }
+-
+-            // Priority is sum(valuein * age) / txsize
+-            dPriority /= ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
+-
+-            if (porphan)
+-                porphan->dPriority = dPriority;
+-            else
+-                mapPriority.insert(make_pair(-dPriority, &(*mi).second));
+-
+-            if (fDebug && GetBoolArg("-printpriority"))
+-            {
+-                printf("priority %-20.1f %s\n%s", dPriority, tx.GetHash().ToString().substr(0,10).c_str(), tx.ToString().c_str());
+-                if (porphan)
+-                    porphan->print();
+-                printf("\n");
+-            }
+-        }
+-
+-        // Collect transactions into block
+-        map<uint256, CTxIndex> mapTestPool;
+-        uint64 nBlockSize = 1000;
+         uint64 nBlockTx = 0;
+-        int nBlockSigOps = 100;
+-        while (!mapPriority.empty())
++        for (map<uint256, CTransaction>::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi)
+         {
+-            // Take highest priority transaction off priority queue
+-            double dPriority = -(*mapPriority.begin()).first;
+-            CTransaction& tx = *(*mapPriority.begin()).second;
+-            mapPriority.erase(mapPriority.begin());
+-
+-            // Size limits
+-            unsigned int nTxSize = ::GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION);
 -            if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
 -                continue;
-+            //if (nBlockSize + nTxSize >= MAX_BLOCK_SIZE_GEN)
-+            //    continue;
+-
+-            // Legacy limits on sigOps:
+-            unsigned int nTxSigOps = tx.GetLegacySigOpCount();
+-            if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
+-                continue;
+-
+-            // Transaction fee required depends on block size
+-            bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority));
+-            int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, GMF_BLOCK);
+-
+-            // Connecting shouldn't fail due to dependency on other memory pool transactions
+-            // because we're already processing them in order of dependency
+-            map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
+-            MapPrevTx mapInputs;
+-            bool fInvalid;
+-            if (!tx.FetchInputs(txdb, mapTestPoolTmp, false, true, mapInputs, fInvalid))
+-                continue;
++        CTransaction& tx = (*mi).second;
++        if (tx.IsCoinBase() || !tx.IsFinal())
++          continue;
  
-             // Legacy limits on sigOps:
-             unsigned int nTxSigOps = tx.GetLegacySigOpCount();
+-            int64 nTxFees = tx.GetValueIn(mapInputs)-tx.GetValueOut();
+-            if (nTxFees < nMinFee)
+-                continue;
+-
+-            nTxSigOps += tx.GetP2SHSigOpCount(mapInputs);
 -            if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
 -                continue;
-+            //if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
-+            //    continue;
+-
+-            if (!tx.ConnectInputs(mapInputs, mapTestPoolTmp, CDiskTxPos(1,1,1), pindexPrev, false, true))
+-                continue;
+-            mapTestPoolTmp[tx.GetHash()] = CTxIndex(CDiskTxPos(1,1,1), tx.vout.size());
+-            swap(mapTestPool, mapTestPoolTmp);
+-
+-            // Added
+-            pblock->vtx.push_back(tx);
+-            nBlockSize += nTxSize;
+-            ++nBlockTx;
+-            nBlockSigOps += nTxSigOps;
+-            nFees += nTxFees;
+-
+-            // Add transactions that depend on this one to the priority queue
+-            uint256 hash = tx.GetHash();
+-            if (mapDependers.count(hash))
+-            {
+-                BOOST_FOREACH(COrphan* porphan, mapDependers[hash])
+-                {
+-                    if (!porphan->setDependsOn.empty())
+-                    {
+-                        porphan->setDependsOn.erase(hash);
+-                        if (porphan->setDependsOn.empty())
+-                            mapPriority.insert(make_pair(-porphan->dPriority, porphan->ptx));
+-                    }
+-                }
+-            }
++        if (!tx.get_electrum_flag())
++          {
++              tx.set_electrum_flag(true);
++              pblock->vtx.push_back(tx);
++              ++nBlockTx;
++          }
+         }
  
-             // Transaction fee required depends on block size
-             bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority));
-             int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, GMF_BLOCK);
+-        nLastBlockTx = nBlockTx;
+-        nLastBlockSize = nBlockSize;
+-        printf("CreateNewBlock(): total size %lu\n", nBlockSize);
+-
++        printf("CreateNewBlock(): transactions: %lu\n", nBlockTx);
+     }
+-    pblock->vtx[0].vout[0].nValue = GetBlockValue(pindexPrev->nHeight+1, nFees);
  
-+            // Electrum server: do not check fees
-+            nMinFee = 0;
-+
-             // Connecting shouldn't fail due to dependency on other memory pool transactions
-             // because we're already processing them in order of dependency
-             map<uint256, CTxIndex> mapTestPoolTmp(mapTestPool);
+     // Fill in header
+     pblock->hashPrevBlock  = pindexPrev->GetBlockHash();
 diff --git a/src/main.h b/src/main.h
-index 262e77e..fb79232 100644
+index 262e77e..4cc9319 100644
 --- a/src/main.h
 +++ b/src/main.h
-@@ -395,9 +395,20 @@ public:
+@@ -395,6 +395,16 @@ public:
      mutable int nDoS;
      bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
  
@@ -116,7 +247,11 @@ index 262e77e..fb79232 100644
      CTransaction()
      {
          SetNull();
+@@ -416,6 +426,7 @@ public:
+         vout.clear();
+         nLockTime = 0;
+         nDoS = 0;  // Denial-of-service prevention
 +      set_electrum_flag(false);
      }
  
-     IMPLEMENT_SERIALIZE
+     bool IsNull() const