Skip to content

Commit 76dde29

Browse files
committed
add -maxrelaytxfee option
1 parent 5f82566 commit 76dde29

File tree

7 files changed

+27
-0
lines changed

7 files changed

+27
-0
lines changed

src/init.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,8 @@ void SetupServerArgs(ArgsManager& argsman)
703703
OptionsCategory::NODE_RELAY);
704704
argsman.AddArg("-minrelaytxfee=<amt>", strprintf("Fees (in %s/kvB) smaller than this are considered zero fee for relaying, mining and transaction creation (default: %s)",
705705
CURRENCY_UNIT, FormatMoney(DEFAULT_MIN_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
706+
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)",
707+
CURRENCY_UNIT, DEFAULT_MAX_RELAY_TX_FEE), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
706708
argsman.AddArg("-rejectparasites", strprintf("Refuse to relay or mine parasitic overlay protocols (default: %u)", DEFAULT_REJECT_PARASITES), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
707709
argsman.AddArg("-rejecttokens",
708710
strprintf("Refuse to relay or mine transactions involving non-bitcoin tokens (default: %u)",

src/interfaces/chain.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,9 @@ class Chain
295295
//! Relay incremental fee setting (-incrementalrelayfee), reflecting cost of relay.
296296
virtual CFeeRate relayIncrementalFee() = 0;
297297

298+
//! Relay current maximum fee.
299+
virtual CFeeRate relayMaxFee() = 0;
300+
298301
//! Relay dust fee setting (-dustrelayfee), reflecting lowest rate it's economical to spend.
299302
virtual CFeeRate relayDustFee() = 0;
300303

src/kernel/mempool_options.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ struct MemPoolOptions {
5656
CFeeRate incremental_relay_feerate{DEFAULT_INCREMENTAL_RELAY_FEE};
5757
/** A fee rate smaller than this is considered zero fee (for relaying, mining and transaction creation) */
5858
CFeeRate min_relay_feerate{DEFAULT_MIN_RELAY_TX_FEE};
59+
CFeeRate max_relay_feerate{DEFAULT_MAX_RELAY_TX_FEE};
5960
CFeeRate dust_relay_feerate{DUST_RELAY_TX_FEE};
6061
CFeeRate dust_relay_feerate_floor{DUST_RELAY_TX_FEE};
6162
/** Negative for a target number of blocks, positive for target kB into current mempool. */

src/node/interfaces.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,11 @@ class ChainImpl : public Chain
779779
if (!m_node.mempool) return CFeeRate{DEFAULT_INCREMENTAL_RELAY_FEE};
780780
return m_node.mempool->m_opts.incremental_relay_feerate;
781781
}
782+
CFeeRate relayMaxFee() override
783+
{
784+
if (!m_node.mempool) return CFeeRate{DEFAULT_MAX_RELAY_TX_FEE};
785+
return m_node.mempool->m_opts.max_relay_feerate;
786+
}
782787
CFeeRate relayDustFee() override
783788
{
784789
if (!m_node.mempool) return CFeeRate{DUST_RELAY_TX_FEE};

src/node/mempool_args.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP
122122
LogPrintf("Increasing minrelaytxfee to %s to match incrementalrelayfee\n", mempool_opts.min_relay_feerate.ToString());
123123
}
124124

125+
if (argsman.IsArgSet("-maxrelaytxfee")) {
126+
if (std::optional<CAmount> max_relay_feerate = ParseMoney(argsman.GetArg("-maxrelaytxfee", ""))) {
127+
mempool_opts.max_relay_feerate = CFeeRate{max_relay_feerate.value()};
128+
} else {
129+
return util::Error{AmountErrMsg("maxrelayfee", argsman.GetArg("-maxrelaytxfee", ""))};
130+
}
131+
}
132+
125133
// Feerate used to define dust. Shouldn't be changed lightly as old
126134
// implementations may inadvertently create non-standard transactions
127135
if (argsman.IsArgSet("-dustrelayfee")) {

src/policy/policy.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ static const int DEFAULT_DUST_RELAY_MULTIPLIER{3'000};
8181
static const std::string DEFAULT_SPKREUSE{"allow"};
8282
/** Default for -minrelaytxfee, minimum relay fee for transactions */
8383
static constexpr unsigned int DEFAULT_MIN_RELAY_TX_FEE{1000};
84+
/** Default for -maxrelaytxfee, minimum relay fee for transactions */
85+
static constexpr unsigned int DEFAULT_MAX_RELAY_TX_FEE{0};
8486
/** Default for -limitancestorcount, max number of in-mempool ancestors */
8587
static constexpr unsigned int DEFAULT_ANCESTOR_LIMIT{25};
8688
/** Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors */

src/validation.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,6 +1086,12 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
10861086
// feerate later.
10871087
if (!args.m_package_feerates && !CheckFeeRate(ws.m_vsize, ws.m_modified_fees, state, args.m_ignore_rejects)) return false;
10881088

1089+
1090+
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}) {
1091+
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "max relay fee met",
1092+
strprintf("%d < %d", ws.m_modified_fees, m_pool.m_opts.max_relay_feerate.GetFee(ws.m_vsize)));
1093+
}
1094+
10891095
std::set<Txid> conflicts_as_a_set;
10901096
std::transform(ws.m_conflicts_incl_policy.begin(), ws.m_conflicts_incl_policy.end(),
10911097
std::inserter(conflicts_as_a_set, conflicts_as_a_set.end()),

0 commit comments

Comments
 (0)