diff --git a/src/main.cpp b/src/main.cpp index 9dae7d323..7f0a3c086 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1509,7 +1509,7 @@ CAmount GetMinRelayFee(const CTransaction& tx, unsigned int nBytes, bool fAllowF } -bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee) +bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransaction &tx, bool fLimitFree,bool* pfMissingInputs, bool fRejectAbsurdFee, int dosLevel) { AssertLockHeld(cs_main); if (pfMissingInputs) @@ -1551,7 +1551,7 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa } // DoS level set to 10 to be more forgiving. // Check transaction contextually against the set of consensus rules which apply in the next block to be mined. - if (!ContextualCheckTransaction(tx, state, nextBlockHeight, 10)) + if (!ContextualCheckTransaction(tx, state, nextBlockHeight, (dosLevel == -1) ? 10 : dosLevel)) { return error("AcceptToMemoryPool: ContextualCheckTransaction failed"); } @@ -3708,14 +3708,16 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { list removed; CValidationState stateDummy; // don't keep staking or invalid transactions - if (tx.IsCoinBase() || ((i == (block.vtx.size() - 1)) && (block.IsVerusPOSBlock() || (komodo_isPoS((CBlock *)&block) != 0))) || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL)) + if (tx.IsCoinBase() || ((i == (block.vtx.size() - 1)) && ((ASSETCHAINS_LWMAPOS && block.IsVerusPOSBlock()) || (ASSETCHAINS_STAKED && komodo_isPoS((CBlock *)&block) != 0))) || !AcceptToMemoryPool(mempool, stateDummy, tx, false, NULL)) { mempool.remove(tx, removed, true); } // if this is a staking tx, and we are on Verus Sapling with nothing at stake solution, // save staking tx as a possible cheat - if ((i == (block.vtx.size() - 1)) && (block.IsVerusPOSBlock())) + if (NetworkUpgradeActive(pindexDelete->GetHeight(), Params().GetConsensus(), Consensus::UPGRADE_SAPLING) && + ASSETCHAINS_LWMAPOS && (i == (block.vtx.size() - 1)) && + (block.IsVerusPOSBlock())) { CTxHolder txh(block.vtx[i], pindexDelete->GetHeight()); cheatList.Add(txh); @@ -3746,7 +3748,7 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { for (int i = 0; i < block.vtx.size(); i++) { CTransaction &tx = block.vtx[i]; - if ((i == (block.vtx.size() - 1)) && (block.IsVerusPOSBlock() || (ASSETCHAINS_STAKED != 0 && (komodo_isPoS((CBlock *)&block) != 0)))) + if ((i == (block.vtx.size() - 1)) && ((ASSETCHAINS_LWMAPOS && block.IsVerusPOSBlock()) || (ASSETCHAINS_STAKED != 0 && (komodo_isPoS((CBlock *)&block) != 0)))) { EraseFromWallets(tx.GetHash()); } @@ -4521,9 +4523,7 @@ bool CheckBlock(int32_t *futureblockp,int32_t height,CBlockIndex *pindex,const C for (i=0; i removed; + mempool.removeConflicts(cheatSpend.value(), removed); + printf("CAUGHT STAKE CHEATER! Adding cheat spend for %.8f at block #%d, coinbase tx\n%s\n", + (double)cheatSpend.value().vout[0].nValue / (double)COIN, nHeight, cheatSpend.value().vin[0].prevout.hash.GetHex().c_str()); + } + + // now add transactions from the mem pool for (CTxMemPool::indexed_transaction_set::iterator mi = mempool.mapTx.begin(); mi != mempool.mapTx.end(); ++mi) { @@ -326,20 +334,6 @@ CBlockTemplate* CreateNewBlock(const CScript& _scriptPubKeyIn, int32_t gpucount, //fprintf(stderr,"CreateNewBlock: komodo_validate_interest failure nHeight.%d nTime.%u vs locktime.%u\n",nHeight,(uint32_t)pblock->nTime,(uint32_t)tx.nLockTime); continue; } - if (cheatSpend) - { - bool skip = false; - for (const CTxIn &txin : tx.vin) - { - if (txin.prevout.hash == cbHash) - { - skip = true; - break; - } - } - if (skip) - continue; - } COrphan* porphan = NULL; double dPriority = 0; diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp index d0dc46957..9b50f7e40 100644 --- a/src/rpc/server.cpp +++ b/src/rpc/server.cpp @@ -361,19 +361,20 @@ static const CRPCCommand vRPCCommands[] = #ifdef ENABLE_WALLET { "rawtransactions", "fundrawtransaction", &fundrawtransaction, false }, #endif - /* auction */ +/* + // auction { "auction", "auctionaddress", &auctionaddress, true }, - /* lotto */ + // lotto { "lotto", "lottoaddress", &lottoaddress, true }, - /* fsm */ + // fsm { "FSM", "FSMaddress", &FSMaddress, true }, { "FSM", "FSMcreate", &FSMcreate, true }, { "FSM", "FSMlist", &FSMlist, true }, { "FSM", "FSMinfo", &FSMinfo, true }, - /* rewards */ + // rewards { "rewards", "rewardslist", &rewardslist, true }, { "rewards", "rewardsinfo", &rewardsinfo, true }, { "rewards", "rewardscreatefunding", &rewardscreatefunding, true }, @@ -382,16 +383,16 @@ static const CRPCCommand vRPCCommands[] = { "rewards", "rewardsunlock", &rewardsunlock, true }, { "rewards", "rewardsaddress", &rewardsaddress, true }, - /* faucet */ + // faucet { "faucet", "faucetinfo", &faucetinfo, true }, { "faucet", "faucetfund", &faucetfund, true }, { "faucet", "faucetget", &faucetget, true }, { "faucet", "faucetaddress", &faucetaddress, true }, - /* MofN */ + // MofN { "MofN", "mofnaddress", &mofnaddress, true }, - /* Channels */ + // Channels { "channels", "channelsaddress", &channelsaddress, true }, { "channels", "channelsinfo", &channelsinfo, true }, { "channels", "channelsopen", &channelsopen, true }, @@ -400,7 +401,7 @@ static const CRPCCommand vRPCCommands[] = { "channels", "channelsstop", &channelsstop, true }, { "channels", "channelsrefund", &channelsrefund, true }, - /* Oracles */ + // Oracles { "oracles", "oraclesaddress", &oraclesaddress, true }, { "oracles", "oracleslist", &oracleslist, true }, { "oracles", "oraclesinfo", &oraclesinfo, true }, @@ -410,19 +411,19 @@ static const CRPCCommand vRPCCommands[] = { "oracles", "oraclesdata", &oraclesdata, true }, { "oracles", "oraclessamples", &oraclessamples, true }, - /* Prices */ + // Prices { "prices", "pricesaddress", &pricesaddress, true }, - /* Pegs */ + // Pegs { "pegs", "pegsaddress", &pegsaddress, true }, - /* Triggers */ + // Triggers { "triggers", "triggersaddress", &triggersaddress, true }, - /* Payments */ + // Payments { "payments", "paymentsaddress", &paymentsaddress, true }, - /* Gateways */ + // Gateways { "gateways", "gatewaysaddress", &gatewaysaddress, true }, { "gateways", "gatewayslist", &gatewayslist, true }, { "gateways", "gatewaysinfo", &gatewaysinfo, true }, @@ -433,7 +434,7 @@ static const CRPCCommand vRPCCommands[] = { "gateways", "gatewayspending", &gatewayspending, true }, { "gateways", "gatewaysmarkdone", &gatewaysmarkdone, true }, - /* dice */ + // dice { "dice", "dicelist", &dicelist, true }, { "dice", "diceinfo", &diceinfo, true }, { "dice", "dicefund", &dicefund, true }, @@ -443,7 +444,7 @@ static const CRPCCommand vRPCCommands[] = { "dice", "dicestatus", &dicestatus, true }, { "dice", "diceaddress", &diceaddress, true }, - /* tokens */ + // tokens { "tokens", "tokeninfo", &tokeninfo, true }, { "tokens", "tokenlist", &tokenlist, true }, { "tokens", "tokenorders", &tokenorders, true }, @@ -459,8 +460,8 @@ static const CRPCCommand vRPCCommands[] = { "tokens", "tokencancelask", &tokencancelask, true }, { "tokens", "tokenfillask", &tokenfillask, true }, //{ "tokens", "tokenfillswap", &tokenfillswap, true }, - -/* Address index */ +*/ + /* Address index */ { "addressindex", "getaddressmempool", &getaddressmempool, true }, { "addressindex", "getaddressutxos", &getaddressutxos, false }, { "addressindex", "getaddressdeltas", &getaddressdeltas, false }, diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 521001c8c..b62754257 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -2755,7 +2755,9 @@ void CWallet::ReacceptWalletTransactions() CWalletTx& wtx = *(item.second); LOCK(mempool.cs); - wtx.AcceptToMemoryPool(false); + CValidationState state; + // attempt to add them, but don't set any DOS level + ::AcceptToMemoryPool(mempool, state, wtx, false, NULL, true, 0); } }