From 45baf0ef8e2e1017447dbdbce35a1d54dc457f90 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Sat, 13 Feb 2016 01:46:40 +0000 Subject: [PATCH] Make it possible to unconditionally RBF with mempoolreplacement=fee,-optin --- src/init.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index 1308a73c65..7b1765397f 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -649,7 +649,7 @@ void SetupServerArgs(ArgsManager& argsman) MAX_OP_RETURN_RELAY), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); argsman.AddArg("-mempoolfullrbf", strprintf("Accept transaction replace-by-fee without requiring replaceability signaling (default: %u)", DEFAULT_MEMPOOL_FULL_RBF), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); - argsman.AddArg("-mempoolreplacement", strprintf("Enable transaction replacement in the memory pool (default: %u)", DEFAULT_ENABLE_REPLACEMENT), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); + argsman.AddArg("-mempoolreplacement", strprintf("Enable transaction replacement in the memory pool (\"fee,-optin\" = ignore opt-out flag, default: %u)", DEFAULT_ENABLE_REPLACEMENT), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); argsman.AddArg("-permitbaremultisig", strprintf("Relay transactions creating non-P2SH multisig outputs (default: %u)", DEFAULT_PERMIT_BAREMULTISIG), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); argsman.AddArg("-minrelaytxfee=", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)", @@ -894,6 +894,8 @@ bool AppInitBasicSetup(const ArgsManager& args, std::atomic& exit_status) return true; } +static bool gReplacementHonourOptOut; // FIXME: Get rid of this + bool AppInitParameterInteraction(const ArgsManager& args) { const CChainParams& chainparams = Params(); @@ -1060,11 +1062,23 @@ bool AppInitParameterInteraction(const ArgsManager& args) } gEnableReplacement = args.GetBoolArg("-mempoolreplacement", DEFAULT_ENABLE_REPLACEMENT); + gReplacementHonourOptOut = !args.GetBoolArg("-mempoolfullrbf", DEFAULT_MEMPOOL_FULL_RBF); if ((!gEnableReplacement) && args.IsArgSet("-mempoolreplacement")) { // Minimal effort at forwards compatibility std::string replacement_opt = args.GetArg("-mempoolreplacement", ""); // default is impossible - std::vector replacement_modes = util::SplitString(replacement_opt, ","); + std::vector replacement_modes = util::SplitString(replacement_opt, ",+"); gEnableReplacement = (std::find(replacement_modes.begin(), replacement_modes.end(), "fee") != replacement_modes.end()); + if (gEnableReplacement) { + for (auto& opt : replacement_modes) { + if (opt == "optin") { + gReplacementHonourOptOut = true; + } else if (opt == "-optin") { + gReplacementHonourOptOut = false; + } + } + } else { + gReplacementHonourOptOut = true; + } } // Also report errors from parsing before daemonization @@ -1540,6 +1554,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) CTxMemPool::Options mempool_opts{ .check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0, + .full_rbf = !gReplacementHonourOptOut, .signals = &validation_signals, }; auto result{ApplyArgsManOptions(args, chainparams, mempool_opts)};