Merge #15620: rpc: Uncouple non-wallet rpcs from maxTxFee global
fa1ad200d3
doc: Add release notes for 15620 (MarcoFalke)fa96d76421
rpc: Uncouple rpcs from maxTxFee global (MarcoFalke)fa965e03c7
rpc: Use IsValidNumArgs over hardcoded size checks (MarcoFalke) Pull request description: This makes the rpcs a bit more stateless by falling back to their own default max fee instead of the global maxTxFee. A follow up pull request will move `-maxtxfee` to the wallet. See also related discussions: * `-maxtxfee` should not be used by both node and wallet #15355 * [RFC] Long term plan for wallet command-line args #13044 ACKs for commit fa1ad2: jnewbery: utACKfa1ad200d3
Empact: utACKfa1ad200d3
jnewbery: utACKfa1ad200d3
promag: utACKfa1ad20
. Tree-SHA512: c9cf0b54cd30ff3ab0d090b072cc38fcbb2840bc6ad9a9711995333bc927d2500aece6b5a60e061666eca5ed72b70aa318d21e51eb15ee0106b41f5b6e4e1adf
This commit is contained in:
commit
656a15e539
3 changed files with 34 additions and 13 deletions
13
doc/release-notes-15620.md
Normal file
13
doc/release-notes-15620.md
Normal file
|
@ -0,0 +1,13 @@
|
|||
Updated RPCs
|
||||
------------
|
||||
|
||||
* The -maxtxfee setting no longer has any effect on non-wallet RPCs.
|
||||
|
||||
The `sendrawtransaction` and `testmempoolaccept` RPC methods previously
|
||||
accepted an `allowhighfees` parameter to fail the mempool acceptance in case
|
||||
the transaction's fee would exceed the value of the command line argument
|
||||
`-maxtxfee`. To uncouple the RPCs from the global option, they now have a
|
||||
hardcoded default for the maximum transaction fee, that can be changed for
|
||||
both RPCs on a per-call basis with the `maxfeerate` parameter. The
|
||||
`allowhighfees` boolean option has been removed and replaced by the
|
||||
`maxfeerate` numeric option.
|
|
@ -500,7 +500,7 @@ void SetupServerArgs()
|
|||
gArgs.AddArg("-mocktime=<n>", "Replace actual time with <n> seconds since epoch (default: 0)", true, OptionsCategory::DEBUG_TEST);
|
||||
gArgs.AddArg("-maxsigcachesize=<n>", strprintf("Limit sum of signature cache and script execution cache sizes to <n> MiB (default: %u)", DEFAULT_MAX_SIG_CACHE_SIZE), true, OptionsCategory::DEBUG_TEST);
|
||||
gArgs.AddArg("-maxtipage=<n>", strprintf("Maximum tip age in seconds to consider node in initial block download (default: %u)", DEFAULT_MAX_TIP_AGE), true, OptionsCategory::DEBUG_TEST);
|
||||
gArgs.AddArg("-maxtxfee=<amt>", strprintf("Maximum total fees (in %s) to use in a single wallet transaction or raw transaction; setting this too low may abort large transactions (default: %s)",
|
||||
gArgs.AddArg("-maxtxfee=<amt>", strprintf("Maximum total fees (in %s) to use in a single wallet transaction; setting this too low may abort large transactions (default: %s)", // TODO move setting to wallet
|
||||
CURRENCY_UNIT, FormatMoney(DEFAULT_TRANSACTION_MAXFEE)), false, OptionsCategory::DEBUG_TEST);
|
||||
gArgs.AddArg("-printpriority", strprintf("Log transaction fee per kB when mining blocks (default: %u)", DEFAULT_PRINTPRIORITY), true, OptionsCategory::DEBUG_TEST);
|
||||
gArgs.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -daemon. To disable logging to file, set -nodebuglogfile)", false, OptionsCategory::DEBUG_TEST);
|
||||
|
|
|
@ -40,6 +40,11 @@
|
|||
|
||||
#include <univalue.h>
|
||||
|
||||
/** High fee for sendrawtransaction and testmempoolaccept.
|
||||
* By default, transaction with a fee higher than this will be rejected by the
|
||||
* RPCs. This can be overriden with the maxfeerate argument.
|
||||
*/
|
||||
constexpr static CAmount DEFAULT_MAX_RAW_TX_FEE{COIN / 10};
|
||||
|
||||
static void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue& entry)
|
||||
{
|
||||
|
@ -1023,14 +1028,12 @@ static UniValue signrawtransactionwithkey(const JSONRPCRequest& request)
|
|||
|
||||
static UniValue sendrawtransaction(const JSONRPCRequest& request)
|
||||
{
|
||||
if (request.fHelp || request.params.size() < 1 || request.params.size() > 2)
|
||||
throw std::runtime_error(
|
||||
RPCHelpMan{"sendrawtransaction",
|
||||
const RPCHelpMan help{"sendrawtransaction",
|
||||
"\nSubmits raw transaction (serialized, hex-encoded) to local node and network.\n"
|
||||
"\nAlso see createrawtransaction and signrawtransactionwithkey calls.\n",
|
||||
{
|
||||
{"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of the raw transaction"},
|
||||
{"maxfeerate", RPCArg::Type::AMOUNT, /* default */ FormatMoney(maxTxFee), "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kB\n"},
|
||||
{"maxfeerate", RPCArg::Type::AMOUNT, /* default */ FormatMoney(DEFAULT_MAX_RAW_TX_FEE), "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kB\n"},
|
||||
},
|
||||
RPCResult{
|
||||
"\"hex\" (string) The transaction hash in hex\n"
|
||||
|
@ -1045,7 +1048,11 @@ static UniValue sendrawtransaction(const JSONRPCRequest& request)
|
|||
"\nAs a JSON-RPC call\n"
|
||||
+ HelpExampleRpc("sendrawtransaction", "\"signedhex\"")
|
||||
},
|
||||
}.ToString());
|
||||
};
|
||||
|
||||
if (request.fHelp || !help.IsValidNumArgs(request.params.size())) {
|
||||
throw std::runtime_error(help.ToString());
|
||||
}
|
||||
|
||||
RPCTypeCheck(request.params, {
|
||||
UniValue::VSTR,
|
||||
|
@ -1058,7 +1065,7 @@ static UniValue sendrawtransaction(const JSONRPCRequest& request)
|
|||
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
|
||||
CTransactionRef tx(MakeTransactionRef(std::move(mtx)));
|
||||
|
||||
CAmount max_raw_tx_fee = maxTxFee;
|
||||
CAmount max_raw_tx_fee = DEFAULT_MAX_RAW_TX_FEE;
|
||||
// TODO: temporary migration code for old clients. Remove in v0.20
|
||||
if (request.params[1].isBool()) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Second argument must be numeric (maxfeerate) and no longer supports a boolean. To allow a transaction with high fees, set maxfeerate to 0.");
|
||||
|
@ -1085,9 +1092,7 @@ static UniValue sendrawtransaction(const JSONRPCRequest& request)
|
|||
|
||||
static UniValue testmempoolaccept(const JSONRPCRequest& request)
|
||||
{
|
||||
if (request.fHelp || request.params.size() < 1 || request.params.size() > 2) {
|
||||
throw std::runtime_error(
|
||||
RPCHelpMan{"testmempoolaccept",
|
||||
const RPCHelpMan help{"testmempoolaccept",
|
||||
"\nReturns result of mempool acceptance tests indicating if raw transaction (serialized, hex-encoded) would be accepted by mempool.\n"
|
||||
"\nThis checks if the transaction violates the consensus or policy rules.\n"
|
||||
"\nSee sendrawtransaction call.\n",
|
||||
|
@ -1098,7 +1103,7 @@ static UniValue testmempoolaccept(const JSONRPCRequest& request)
|
|||
{"rawtx", RPCArg::Type::STR_HEX, RPCArg::Optional::OMITTED, ""},
|
||||
},
|
||||
},
|
||||
{"maxfeerate", RPCArg::Type::AMOUNT, /* default */ FormatMoney(maxTxFee), "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kB\n"},
|
||||
{"maxfeerate", RPCArg::Type::AMOUNT, /* default */ FormatMoney(DEFAULT_MAX_RAW_TX_FEE), "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kB\n"},
|
||||
},
|
||||
RPCResult{
|
||||
"[ (array) The result of the mempool acceptance test for each raw transaction in the input array.\n"
|
||||
|
@ -1120,7 +1125,10 @@ static UniValue testmempoolaccept(const JSONRPCRequest& request)
|
|||
"\nAs a JSON-RPC call\n"
|
||||
+ HelpExampleRpc("testmempoolaccept", "[\"signedhex\"]")
|
||||
},
|
||||
}.ToString());
|
||||
};
|
||||
|
||||
if (request.fHelp || !help.IsValidNumArgs(request.params.size())) {
|
||||
throw std::runtime_error(help.ToString());
|
||||
}
|
||||
|
||||
RPCTypeCheck(request.params, {
|
||||
|
@ -1139,7 +1147,7 @@ static UniValue testmempoolaccept(const JSONRPCRequest& request)
|
|||
CTransactionRef tx(MakeTransactionRef(std::move(mtx)));
|
||||
const uint256& tx_hash = tx->GetHash();
|
||||
|
||||
CAmount max_raw_tx_fee = maxTxFee;
|
||||
CAmount max_raw_tx_fee = DEFAULT_MAX_RAW_TX_FEE;
|
||||
// TODO: temporary migration code for old clients. Remove in v0.20
|
||||
if (request.params[1].isBool()) {
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Second argument must be numeric (maxfeerate) and no longer supports a boolean. To allow a transaction with high fees, set maxfeerate to 0.");
|
||||
|
|
Loading…
Reference in a new issue