From 6939698bc54a281569a65a26ea85e7b43868fefb Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 18 Mar 2016 22:36:21 -0700 Subject: [PATCH] Disable replacement of peg-in transactions --- src/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main.cpp b/src/main.cpp index 84e446f45a..60cce02d11 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1262,11 +1262,15 @@ bool AcceptToMemoryPoolWorker(CTxMemPool& pool, CValidationState& state, const C if (!view.HaveInputs(tx)) return state.Invalid(false, REJECT_DUPLICATE, "bad-txns-inputs-spent"); + // We disable replacement of peg-ins as they are spendable-by-anyone BOOST_FOREACH(const CTxIn &txin, tx.vin) { CCoins coins; assert(view.GetCoins(txin.prevout.hash, coins)); if (coins.vout[txin.prevout.n].scriptPubKey.IsWithdrawLock() && txin.scriptSig.IsWithdrawProof()) { + if (pool.mapNextTx.count(txin.prevout)) + return state.Invalid(false, REJECT_CONFLICT, "txn-mempool-replace-withdraw"); + pair outpoint = make_pair(coins.vout[txin.prevout.n].scriptPubKey.GetWithdrawLockGenesisHash(), txin.scriptSig.GetWithdrawSpent()); if (view.IsWithdrawSpent(outpoint)) return state.Invalid(false, REJECT_CONFLICT, "withdraw-already-claimed");