diff --git a/src/init.cpp b/src/init.cpp index 9ae88369d2..1bd6dbd790 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -644,6 +644,7 @@ void SetupServerArgs(ArgsManager& argsman) argsman.AddArg("-bytespersigop", strprintf("Equivalent bytes per sigop in transactions for relay and mining (default: %u)", DEFAULT_BYTES_PER_SIGOP), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); argsman.AddArg("-bytespersigopstrict", strprintf("Minimum bytes per sigop in transactions we relay and mine (default: %u)", DEFAULT_BYTES_PER_SIGOP_STRICT), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); argsman.AddArg("-datacarrier", strprintf("Relay and mine data carrier transactions (default: %u)", DEFAULT_ACCEPT_DATACARRIER), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); + argsman.AddArg("-datacarrierfullcount", strprintf("Apply datacarriersize limit to all known datacarrier methods (default: %u)", DEFAULT_DATACARRIER_FULLCOUNT), ArgsManager::ALLOW_ANY | (DEFAULT_DATACARRIER_FULLCOUNT ? uint32_t{ArgsManager::DEBUG_ONLY} : 0), OptionsCategory::NODE_RELAY); argsman.AddArg("-datacarriersize", strprintf("Relay and mine transactions whose data-carrying raw scriptPubKey " "is of this size or less (default: %u)", diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h index a548b82070..0a50c58f74 100644 --- a/src/kernel/mempool_options.h +++ b/src/kernel/mempool_options.h @@ -58,6 +58,7 @@ struct MemPoolOptions { * If nullopt, any size is nonstandard. */ std::optional max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? std::optional{MAX_OP_RETURN_RELAY} : std::nullopt}; + bool datacarrier_fullcount{DEFAULT_DATACARRIER_FULLCOUNT}; bool permit_bare_pubkey{DEFAULT_PERMIT_BAREPUBKEY}; bool permit_bare_multisig{DEFAULT_PERMIT_BAREMULTISIG}; bool require_standard{true}; diff --git a/src/node/mempool_args.cpp b/src/node/mempool_args.cpp index ff0b1a794f..9c1b1cc9e3 100644 --- a/src/node/mempool_args.cpp +++ b/src/node/mempool_args.cpp @@ -90,6 +90,7 @@ util::Result ApplyArgsManOptions(const ArgsManager& argsman, const CChainP } else { mempool_opts.max_datacarrier_bytes = std::nullopt; } + mempool_opts.datacarrier_fullcount = argsman.GetBoolArg("-datacarrierfullcount", DEFAULT_DATACARRIER_FULLCOUNT); mempool_opts.require_standard = !argsman.GetBoolArg("-acceptnonstdtxn", DEFAULT_ACCEPT_NON_STD_TXN); if (!chainparams.IsTestChain() && !mempool_opts.require_standard) { diff --git a/src/policy/policy.h b/src/policy/policy.h index 9657df93c8..7cf0f07c67 100644 --- a/src/policy/policy.h +++ b/src/policy/policy.h @@ -79,6 +79,8 @@ static const bool DEFAULT_ACCEPT_DATACARRIER = true; * +2 for the pushdata opcodes. */ static const unsigned int MAX_OP_RETURN_RELAY = 83; +/** Default for -datacarrierfullcount */ +static constexpr bool DEFAULT_DATACARRIER_FULLCOUNT{false}; /** * An extra transaction can be added to a package, as long as it only has one * ancestor and is no larger than this. Not really any reason to make this diff --git a/src/validation.cpp b/src/validation.cpp index 317c1a2fc3..82e7eaee5b 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -967,7 +967,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws) return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, reason); } - if ((!ignore_rejects.count("txn-datacarrier-exceeded")) && DatacarrierBytes(tx, m_view) > m_pool.m_max_datacarrier_bytes.value_or(0)) { + if (m_pool.m_opts.datacarrier_fullcount && (!ignore_rejects.count("txn-datacarrier-exceeded")) && DatacarrierBytes(tx, m_view) > m_pool.m_opts.max_datacarrier_bytes.value_or(0)) { return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "txn-datacarrier-exceeded"); } diff --git a/test/functional/feature_taproot.py b/test/functional/feature_taproot.py index 873797487e..e2267cdd4c 100755 --- a/test/functional/feature_taproot.py +++ b/test/functional/feature_taproot.py @@ -1285,7 +1285,7 @@ class TaprootTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 1 self.setup_clean_chain = True - self.extra_args = [["-par=1"]] + self.extra_args = [["-par=1", "-datacarrierfullcount"]] def block_submit(self, node, txs, msg, err_msg, cb_pubkey=None, fees=0, sigops_weight=0, witness=False, accept=False):