add -maxrelaytxfee option

This commit is contained in:
Léo Haf 2025-04-23 18:03:36 +02:00
parent 5f8256608f
commit 76dde29065
Signed by: Retropex
GPG Key ID: F5073C4F4882FFFC
7 changed files with 27 additions and 0 deletions

View File

@ -703,6 +703,8 @@ void SetupServerArgs(ArgsManager& argsman)
OptionsCategory::NODE_RELAY); OptionsCategory::NODE_RELAY);
argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)", argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
CURRENCY_UNIT, FormatMoney(DEFAULT_MIN_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); CURRENCY_UNIT, FormatMoney(DEFAULT_MIN_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
argsman.AddArg("-maxrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) bigger than this are considered zero fee for relaying, mining and transaction creation (set to 0 to disable) (default: %s)",
CURRENCY_UNIT, DEFAULT_MAX_RELAY_TX_FEE), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
argsman.AddArg("-rejectparasites", strprintf("Refuse to relay or mine parasitic overlay protocols (default: %u)", DEFAULT_REJECT_PARASITES), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); argsman.AddArg("-rejectparasites", strprintf("Refuse to relay or mine parasitic overlay protocols (default: %u)", DEFAULT_REJECT_PARASITES), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
argsman.AddArg("-rejecttokens", argsman.AddArg("-rejecttokens",
strprintf("Refuse to relay or mine transactions involving non-bitcoin tokens (default: %u)", strprintf("Refuse to relay or mine transactions involving non-bitcoin tokens (default: %u)",

View File

@ -295,6 +295,9 @@ public:
//! Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay. //! Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay.
virtual CFeeRate relayIncrementalFee() = 0; virtual CFeeRate relayIncrementalFee() = 0;
//! Relay current maximum fee.
virtual CFeeRate relayMaxFee() = 0;
//! Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend. //! Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend.
virtual CFeeRate relayDustFee() = 0; virtual CFeeRate relayDustFee() = 0;

View File

@ -56,6 +56,7 @@ struct MemPoolOptions {
CFeeRate incremental_relay_feerate{DEFAULT_INCREMENTAL_RELAY_FEE}; CFeeRate incremental_relay_feerate{DEFAULT_INCREMENTAL_RELAY_FEE};
/** A fee rate smaller than this is considered zero fee (for relaying, mining and transaction creation) */ /** A fee rate smaller than this is considered zero fee (for relaying, mining and transaction creation) */
CFeeRate min_relay_feerate{DEFAULT_MIN_RELAY_TX_FEE}; CFeeRate min_relay_feerate{DEFAULT_MIN_RELAY_TX_FEE};
CFeeRate max_relay_feerate{DEFAULT_MAX_RELAY_TX_FEE};
CFeeRate dust_relay_feerate{DUST_RELAY_TX_FEE}; CFeeRate dust_relay_feerate{DUST_RELAY_TX_FEE};
CFeeRate dust_relay_feerate_floor{DUST_RELAY_TX_FEE}; CFeeRate dust_relay_feerate_floor{DUST_RELAY_TX_FEE};
/** Negative for a target number of blocks, positive for target kB into current mempool. */ /** Negative for a target number of blocks, positive for target kB into current mempool. */

View File

@ -779,6 +779,11 @@ public:
if (!m_node.mempool) return CFeeRate{DEFAULT_INCREMENTAL_RELAY_FEE}; if (!m_node.mempool) return CFeeRate{DEFAULT_INCREMENTAL_RELAY_FEE};
return m_node.mempool->m_opts.incremental_relay_feerate; return m_node.mempool->m_opts.incremental_relay_feerate;
} }
CFeeRate relayMaxFee() override
{
if (!m_node.mempool) return CFeeRate{DEFAULT_MAX_RELAY_TX_FEE};
return m_node.mempool->m_opts.max_relay_feerate;
}
CFeeRate relayDustFee() override CFeeRate relayDustFee() override
{ {
if (!m_node.mempool) return CFeeRate{DUST_RELAY_TX_FEE}; if (!m_node.mempool) return CFeeRate{DUST_RELAY_TX_FEE};

View File

@ -122,6 +122,14 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP
LogPrintf("Increasing minrelaytxfee to %s to match incrementalrelayfee\n", mempool_opts.min_relay_feerate.ToString()); LogPrintf("Increasing minrelaytxfee to %s to match incrementalrelayfee\n", mempool_opts.min_relay_feerate.ToString());
} }
if (argsman.IsArgSet("-maxrelaytxfee")) {
if (std::optional<CAmount> max_relay_feerate = ParseMoney(argsman.GetArg("-maxrelaytxfee", ""))) {
mempool_opts.max_relay_feerate = CFeeRate{max_relay_feerate.value()};
} else {
return util::Error{AmountErrMsg("maxrelayfee", argsman.GetArg("-maxrelaytxfee", ""))};
}
}
// Feerate used to define dust. Shouldn't be changed lightly as old // Feerate used to define dust. Shouldn't be changed lightly as old
// implementations may inadvertently create non-standard transactions // implementations may inadvertently create non-standard transactions
if (argsman.IsArgSet("-dustrelayfee")) { if (argsman.IsArgSet("-dustrelayfee")) {

View File

@ -81,6 +81,8 @@ static const int DEFAULT_DUST_RELAY_MULTIPLIER{3'000};
static const std::string DEFAULT_SPKREUSE{"allow"}; static const std::string DEFAULT_SPKREUSE{"allow"};
/** Default for -minrelaytxfee, minimum relay fee for transactions */ /** Default for -minrelaytxfee, minimum relay fee for transactions */
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE{1000}; static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE{1000};
/** Default for -maxrelaytxfee, minimum relay fee for transactions */
static constexpr unsigned int DEFAULT_MAX_RELAY_TX_FEE{0};
/** Default for -limitancestorcount, max number of in-mempool ancestors */ /** Default for -limitancestorcount, max number of in-mempool ancestors */
static constexpr unsigned int DEFAULT_ANCESTOR_LIMIT{25}; static constexpr unsigned int DEFAULT_ANCESTOR_LIMIT{25};
/** Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors */ /** Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors */

View File

@ -1086,6 +1086,12 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// feerate later. // feerate later.
if (!args.m_package_feerates && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state, args.m_ignore_rejects)) return false; if (!args.m_package_feerates && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state, args.m_ignore_rejects)) return false;
if ((ws.m_ptx->version != TRUC_VERSION || m_pool.m_opts.truc_policy != TRUCPolicy::Enforce) && ws.m_modified_fees > m_pool.m_opts.max_relay_feerate.GetFee(ws.m_vsize) && m_pool.m_opts.max_relay_feerate != CFeeRate{0}) {
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "max relay fee met",
strprintf("%d < %d", ws.m_modified_fees, m_pool.m_opts.max_relay_feerate.GetFee(ws.m_vsize)));
}
std::set<Txid> conflicts_as_a_set; std::set<Txid> conflicts_as_a_set;
std::transform(ws.m_conflicts_incl_policy.begin(), ws.m_conflicts_incl_policy.end(), std::transform(ws.m_conflicts_incl_policy.begin(), ws.m_conflicts_incl_policy.end(),
std::inserter(conflicts_as_a_set, conflicts_as_a_set.end()), std::inserter(conflicts_as_a_set, conflicts_as_a_set.end()),