diff --git a/src/init.cpp b/src/init.cpp index 1d2d3a9721..70985a489f 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1153,8 +1153,16 @@ bool AppInitParameterInteraction() // Minimal effort at forwards compatibility std::string strReplacementModeList = gArgs.GetArg("-mempoolreplacement", ""); // default is impossible std::vector vstrReplacementModes; - boost::split(vstrReplacementModes, strReplacementModeList, boost::is_any_of(",")); + boost::split(vstrReplacementModes, strReplacementModeList, boost::is_any_of(",+")); fEnableReplacement = (std::find(vstrReplacementModes.begin(), vstrReplacementModes.end(), "fee") != vstrReplacementModes.end()); + if (fEnableReplacement) { + fReplacementHonourOptOut = (std::find(vstrReplacementModes.begin(), vstrReplacementModes.end(), "-optin") == vstrReplacementModes.end()); + if (!fReplacementHonourOptOut) { + nLocalServices = ServiceFlags(nLocalServices | NODE_REPLACE_BY_FEE); + } + } else { + fReplacementHonourOptOut = true; + } } return true; diff --git a/src/validation.cpp b/src/validation.cpp index d7bd48d4ab..918588ebbb 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -233,6 +233,7 @@ size_t nCoinCacheUsage = 5000 * 300; uint64_t nPruneTarget = 0; int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE; bool fEnableReplacement = DEFAULT_ENABLE_REPLACEMENT; +bool fReplacementHonourOptOut = DEFAULT_REPLACEMENT_HONOUR_OPTOUT; uint256 hashAssumeValid; arith_uint256 nMinimumChainWork; @@ -623,6 +624,7 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool bool fReplacementOptOut = true; if (fEnableReplacement) { + if (fReplacementHonourOptOut) { for (const CTxIn &_txin : ptxConflicting->vin) { if (_txin.nSequence <= MAX_BIP125_RBF_SEQUENCE) @@ -631,6 +633,9 @@ static bool AcceptToMemoryPoolWorker(const CChainParams& chainparams, CTxMemPool break; } } + } else { + fReplacementOptOut = false; + } } if (fReplacementOptOut) { return state.Invalid(false, REJECT_DUPLICATE, "txn-mempool-conflict"); diff --git a/src/validation.h b/src/validation.h index 4965ff152a..25f9692fa0 100644 --- a/src/validation.h +++ b/src/validation.h @@ -122,6 +122,7 @@ static const unsigned int DEFAULT_BANSCORE_THRESHOLD = 100; static const bool DEFAULT_PERSIST_MEMPOOL = true; /** Default for -mempoolreplacement */ static const bool DEFAULT_ENABLE_REPLACEMENT = true; +static const bool DEFAULT_REPLACEMENT_HONOUR_OPTOUT = true; /** Default for using fee filter */ static const bool DEFAULT_FEEFILTER = true; @@ -169,6 +170,7 @@ extern CAmount maxTxFee; /** If the tip is older than this (in seconds), the node is considered to be in initial block download. */ extern int64_t nMaxTipAge; extern bool fEnableReplacement; +extern bool fReplacementHonourOptOut; /** Block hash whose ancestors we will assume to have valid scripts without checking them. */ extern uint256 hashAssumeValid;