simplification: removed most of CreateNewBlock
[electrum-server.git] / patches / bitcoin-0.6.2.diff
index 7f4eb52..b55e8c8 100644 (file)
---- main.cpp   2012-06-13 21:40:29.000000000 +0400
-+++ main.cpp.orig      2012-05-08 21:34:24.000000000 +0400
-@@ -3222,21 +3222,18 @@
+diff --git a/src/bitcoinrpc.cpp b/src/bitcoinrpc.cpp
+index 15bcf1d..1ace361 100644
+--- a/src/bitcoinrpc.cpp
++++ b/src/bitcoinrpc.cpp
+@@ -1497,6 +1497,43 @@ Value gettransaction(const Array& params, bool fHelp)
+ }
  
-             // 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;
-+            if (nBlockSigOps + nTxSigOps >= MAX_BLOCK_SIGOPS)
-+                continue;
++Value importtransaction(const Array& params, bool fHelp)
++{
++  string hexdump;
++  if (fHelp || params.size() != 1 || (hexdump=params[0].get_str()).size()&1)
++    throw runtime_error(
++            "importtransaction <hexdata>\n"
++            "Import an offline transaction to announce it into the network");
++
++  std::vector<unsigned char> rawtx;
++  for (int i=0; i<hexdump.size(); i+=2)
++    {
++      int v;
++      if (sscanf(hexdump.substr(i,2).c_str(), "%x", &v)!=1)
++      throw JSONRPCError(-4, "Error in hex data.");
++      rawtx.push_back((unsigned char)v);
++    }
++try
++  {
++    CDataStream ss(rawtx, SER_NETWORK, PROTOCOL_VERSION);
++    CTransaction tx;
++    ss >> tx;
++    CInv inv(MSG_TX, tx.GetHash());
++
++    CTxDB txdb("r");
++    if(! tx.AcceptToMemoryPool(txdb, true)) throw JSONRPCError(-4, "Transaction not accepted to memory pool.");
++    CDataStream msg(rawtx, SER_NETWORK, PROTOCOL_VERSION);
++    RelayMessage(inv, msg);
++    return tx.GetHash().GetHex();
++  }
++ catch (std::exception& e)
++   {
++     throw JSONRPCError(-4, "Exception while parsing the transaction data.");
++   }
++
++}
++
++
+ Value backupwallet(const Array& params, bool fHelp)
+ {
+     if (fHelp || params.size() != 1)
+@@ -2055,6 +2092,7 @@ static const CRPCCommand vRPCCommands[] =
+     { "listsinceblock",         &listsinceblock,         false },
+     { "dumpprivkey",            &dumpprivkey,            false },
+     { "importprivkey",          &importprivkey,          false },
++    { "importtransaction",      &importtransaction,      false },
+ };
  
-             // Transaction fee required depends on block size
-             bool fAllowFree = (nBlockSize + nTxSize < 4000 || CTransaction::AllowFree(dPriority));
-             int64 nMinFee = tx.GetMinFee(nBlockSize, fAllowFree, GMF_BLOCK);
+ CRPCTable::CRPCTable()
+diff --git a/src/main.cpp b/src/main.cpp
+index 427e435..35a0aea 100644
+--- a/src/main.cpp
++++ b/src/main.cpp
+@@ -3134,156 +3134,28 @@ CBlock* CreateNewBlock(CReserveKey& reservekey)
+     if (!pblock.get())
+         return NULL;
  
--            // 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);
-@@ -3295,13 +3292,6 @@
-     pblock->nBits          = GetNextWorkRequired(pindexPrev, pblock.get());
-     pblock->nNonce         = 0;
+-    // 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");
  
+-        // 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;
 -
--    // Electrum: remove from mem pool
--    BOOST_FOREACH(CTransaction& tx, pblock->vtx)
--      mempool.remove(tx);
+-                // Read block header
+-                int nConf = txindex.GetDepthInMainChain();
 -
+-                dPriority += (double)nValueIn * nConf;
 -
-     return pblock.release();
- }
---- bitcoinrpc.cpp     2012-06-13 21:37:34.000000000 +0400
-+++ bitcoinrpc.cpp.orig        2012-05-08 21:34:23.000000000 +0400
-@@ -1496,45 +1496,7 @@
-     return entry;
- }
+-                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;
+-
+-            // 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;
  
--Value importtransaction(const Array& params, bool fHelp)
--{
--  string hexdump;
--  if (fHelp || params.size() != 1 || (hexdump=params[0].get_str()).size()&1)
--    throw runtime_error(
--            "importtransaction <hexdata>\n"
--            "Import an offline transaction to announce it into the network");
--
--  std::vector<unsigned char> rawtx;
--  for (int i=0; i<hexdump.size(); i+=2)
--    {
--      int v;
--      if (sscanf(hexdump.substr(i,2).c_str(), "%x", &v)!=1)
--      throw JSONRPCError(-4, "Error in hex data.");
--      rawtx.push_back((unsigned char)v);
--    }
--try
--  {
--    CDataStream ss(rawtx, SER_NETWORK, PROTOCOL_VERSION);
--    CTransaction tx;
--    ss >> tx;
--    CInv inv(MSG_TX, tx.GetHash());
--
--    CTxDB txdb("r");
--    if(! tx.AcceptToMemoryPool(txdb, true)) throw JSONRPCError(-4, "Transaction not accepted to memory pool.");
--    CDataStream msg(rawtx, SER_NETWORK, PROTOCOL_VERSION);
--    RelayMessage(inv, msg);
--    return tx.GetHash().GetHex();
--  }
-- catch (std::exception& e)
--   {
--     throw JSONRPCError(-4, "Exception while parsing the transaction data.");
--   }
--
--}
+-            int64 nTxFees = tx.GetValueIn(mapInputs)-tx.GetValueOut();
+-            if (nTxFees < nMinFee)
+-                continue;
+-
+-            nTxSigOps += tx.GetP2SHSigOpCount(mapInputs);
+-            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;
++          }
+         }
  
--  
- Value backupwallet(const Array& params, bool fHelp)
- {
-     if (fHelp || params.size() != 1)
-@@ -2093,7 +2055,6 @@
-     { "listsinceblock",         &listsinceblock,         false },
-     { "dumpprivkey",            &dumpprivkey,            false },
-     { "importprivkey",          &importprivkey,          false },
--    { "importtransaction",      &importtransaction,      false },
- };
+-        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);
  
- CRPCTable::CRPCTable()
+     // Fill in header
+     pblock->hashPrevBlock  = pindexPrev->GetBlockHash();
+diff --git a/src/main.h b/src/main.h
+index 262e77e..4cc9319 100644
+--- a/src/main.h
++++ b/src/main.h
+@@ -395,6 +395,16 @@ public:
+     mutable int nDoS;
+     bool DoS(int nDoSIn, bool fIn) const { nDoS += nDoSIn; return fIn; }
++    bool electrum_flag;
++
++    void set_electrum_flag(bool x){
++      electrum_flag = x;
++    }
++
++    bool get_electrum_flag(){
++      return electrum_flag;
++    }
++
+     CTransaction()
+     {
+         SetNull();
+@@ -416,6 +426,7 @@ public:
+         vout.clear();
+         nLockTime = 0;
+         nDoS = 0;  // Denial-of-service prevention
++      set_electrum_flag(false);
+     }
+     bool IsNull() const