From ab6374c07942a97c6cb17986216c36c1749168c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Dec 2018 06:09:59 -1100 Subject: [PATCH 1/4] Restore mempool, instead of adding back --- src/main.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 6c33feb08..bc8455279 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -103,7 +103,6 @@ unsigned int expiryDelta = DEFAULT_TX_EXPIRY_DELTA; CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE); CTxMemPool mempool(::minRelayTxFee); -CTxMemPool tmpmempool(::minRelayTxFee); struct COrphanTx { CTransaction tx; @@ -4675,12 +4674,15 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C // Check transactions CTransaction sTx; CTransaction *ptx = NULL; + CTxMemPool savedmempool(::minRelayTxFee); if ( ASSETCHAINS_CC != 0 ) // CC contracts might refer to transactions in the current block, from a CC spend within the same block and out of order { int32_t i,j,rejects=0,lastrejects=0; //fprintf(stderr,"put block's tx into mempool\n"); // Copy all non Z-txs in mempool to temporary mempool because there can be tx in local mempool that make the block invalid. LOCK(mempool.cs); + CTxMemPool tmpmempool(::minRelayTxFee); + savedmempool = mempool; list transactionsToRemove; BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) { const CTransaction &tx = e.GetTx(); @@ -4764,9 +4766,9 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { // here we add back all txs from the temp mempool to the main mempool. // which removes any tx locally that were invalid after the block arrives. - int invalidtxs = 0; + //int invalidtxs = 0; LOCK(mempool.cs); - BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { + /*BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { CTransaction tx = e.GetTx(); CValidationState state; bool fMissingInputs,fOverrideFees = false; @@ -4777,7 +4779,8 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C if ( 0 && invalidtxs > 0 ) fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); // empty the temp mempool for next time. - tmpmempool.clear(); + tmpmempool.clear();*/ + mempool = savedmempool; } return true; } From 0d02463df6a92c5d43f6536340a0eb71eb6fd938 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Dec 2018 06:20:52 -1100 Subject: [PATCH 2/4] Iteratively add back to mempool --- src/main.cpp | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index bc8455279..15023734d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -103,6 +103,7 @@ unsigned int expiryDelta = DEFAULT_TX_EXPIRY_DELTA; CFeeRate minRelayTxFee = CFeeRate(DEFAULT_MIN_RELAY_TX_FEE); CTxMemPool mempool(::minRelayTxFee); +CTxMemPool tmpmempool(::minRelayTxFee); struct COrphanTx { CTransaction tx; @@ -4674,15 +4675,12 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C // Check transactions CTransaction sTx; CTransaction *ptx = NULL; - CTxMemPool savedmempool(::minRelayTxFee); if ( ASSETCHAINS_CC != 0 ) // CC contracts might refer to transactions in the current block, from a CC spend within the same block and out of order { int32_t i,j,rejects=0,lastrejects=0; //fprintf(stderr,"put block's tx into mempool\n"); // Copy all non Z-txs in mempool to temporary mempool because there can be tx in local mempool that make the block invalid. LOCK(mempool.cs); - CTxMemPool tmpmempool(::minRelayTxFee); - savedmempool = mempool; list transactionsToRemove; BOOST_FOREACH(const CTxMemPoolEntry& e, mempool.mapTx) { const CTransaction &tx = e.GetTx(); @@ -4697,6 +4695,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C mempool.remove(tx, removed, false); } // add all the txs in the block to the empty mempool. + // CC validation shouldnt (cant) depend on the state of mempool! while ( 1 ) { for (i=0; i removed; LOCK(mempool.cs); - /*BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) { - CTransaction tx = e.GetTx(); - CValidationState state; bool fMissingInputs,fOverrideFees = false; - - if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees) == false ) - invalidtxs++; - //else fprintf(stderr, "added mempool tx back to mempool\n"); + while ( 1 ) + { + numiters++; + numadded = 0; + BOOST_FOREACH(const CTxMemPoolEntry& e, tmpmempool.mapTx) + { + CTransaction tx = e.GetTx(); + if (AcceptToMemoryPool(mempool, state, tx, false, &fMissingInputs, !fOverrideFees) == true ) + { + numadded++; + tmpmempool.remove(tx, removed, false); + } + } + if ( numadded == 0 ) + break; } - if ( 0 && invalidtxs > 0 ) - fprintf(stderr, "number of invalid txs: %d\n",invalidtxs ); + if ( numadded > 0 ) + fprintf(stderr, "CC mempool add: numiters.%d numadded.%d remains.%d\n",numiters,numadded,(int32_t)tmpmempool.size()); // empty the temp mempool for next time. - tmpmempool.clear();*/ - mempool = savedmempool; + tmpmempool.clear(); } return true; } From dc63bc8d260c8c2d405005b0c029c99082b00bfb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Dec 2018 06:21:55 -1100 Subject: [PATCH 3/4] Numbers --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 15023734d..01857e8b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4765,7 +4765,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C { // here we add back all txs from the temp mempool to the main mempool. // which removes any tx locally that were invalid after the block arrives. - int numadded,numadded = 0; + int numadded,numiters = 0; CValidationState state; bool fMissingInputs,fOverrideFees = false; list removed; LOCK(mempool.cs); From b90b38255634369b1201d4c7d1e924b80bc732ad Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Dec 2018 06:39:20 -1100 Subject: [PATCH 4/4] -print --- src/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 01857e8b8..788ee95b0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4785,7 +4785,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C if ( numadded == 0 ) break; } - if ( numadded > 0 ) + if ( 0 && numadded > 0 ) fprintf(stderr, "CC mempool add: numiters.%d numadded.%d remains.%d\n",numiters,numadded,(int32_t)tmpmempool.size()); // empty the temp mempool for next time. tmpmempool.clear();