Apply -limitdummyscriptdatasize

This commit is contained in:
Luke Dashjr 2023-09-05 00:54:20 +00:00 committed by Léo Haf
parent f30200fb0f
commit cca03b982e
Signed by: Retropex
GPG Key ID: F5073C4F4882FFFC
6 changed files with 30 additions and 0 deletions

View File

@ -641,6 +641,7 @@ void SetupServerArgs(ArgsManager& argsman, bool can_listen_ipc)
"is of this size or less (default: %u)", "is of this size or less (default: %u)",
MAX_OP_RETURN_RELAY), MAX_OP_RETURN_RELAY),
ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY); ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
argsman.AddArg("-limitdummyscriptdatasize", strprintf("Maximum size of dummy script data we relay and mine (default: %u)", MAX_DUMMY_SCRIPT_RELAY), 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, argsman.AddArg("-permitbaremultisig", strprintf("Relay transactions creating non-P2SH multisig outputs (default: %u)", DEFAULT_PERMIT_BAREMULTISIG), ArgsManager::ALLOW_ANY,
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)",

View File

@ -51,6 +51,7 @@ struct MemPoolOptions {
* If nullopt, any size is nonstandard. * If nullopt, any size is nonstandard.
*/ */
std::optional<unsigned> max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? std::optional{MAX_OP_RETURN_RELAY} : std::nullopt}; std::optional<unsigned> max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? std::optional{MAX_OP_RETURN_RELAY} : std::nullopt};
unsigned int max_dummy_script_bytes{MAX_DUMMY_SCRIPT_RELAY};
bool permit_bare_multisig{DEFAULT_PERMIT_BAREMULTISIG}; bool permit_bare_multisig{DEFAULT_PERMIT_BAREMULTISIG};
bool require_standard{true}; bool require_standard{true};
bool persist_v1_dat{DEFAULT_PERSIST_V1_DAT}; bool persist_v1_dat{DEFAULT_PERSIST_V1_DAT};

View File

@ -87,6 +87,8 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP
mempool_opts.max_datacarrier_bytes = std::nullopt; mempool_opts.max_datacarrier_bytes = std::nullopt;
} }
mempool_opts.max_dummy_script_bytes = argsman.GetIntArg("-limitdummyscriptdatasize", MAX_DUMMY_SCRIPT_RELAY);
mempool_opts.require_standard = !argsman.GetBoolArg("-acceptnonstdtxn", DEFAULT_ACCEPT_NON_STD_TXN); mempool_opts.require_standard = !argsman.GetBoolArg("-acceptnonstdtxn", DEFAULT_ACCEPT_NON_STD_TXN);
if (!chainparams.IsTestChain() && !mempool_opts.require_standard) { if (!chainparams.IsTestChain() && !mempool_opts.require_standard) {
return util::Error{Untranslated(strprintf("acceptnonstdtxn is not currently supported for %s chain", chainparams.GetChainTypeString()))}; return util::Error{Untranslated(strprintf("acceptnonstdtxn is not currently supported for %s chain", chainparams.GetChainTypeString()))};

View File

@ -368,3 +368,19 @@ std::pair<CScript, unsigned int> GetScriptForTransactionInput(CScript prev_scrip
return std::make_pair(CScript(), 0); return std::make_pair(CScript(), 0);
} }
size_t DummyScriptBytes(const CTransaction& tx, const CCoinsViewCache& view)
{
size_t ret{0};
for (const CTxIn& txin : tx.vin) {
const CTxOut &utxo = view.AccessCoin(txin.prevout).out;
auto[script, consensus_weight_per_byte] = GetScriptForTransactionInput(utxo.scriptPubKey, txin);
ret += script.DummyScriptBytes();
}
for (const CTxOut& txout : tx.vout) {
ret += txout.scriptPubKey.DummyScriptBytes();
}
return ret;
}

View File

@ -73,6 +73,8 @@ static constexpr unsigned int DEFAULT_DESCENDANT_LIMIT{25};
static constexpr unsigned int DEFAULT_DESCENDANT_SIZE_LIMIT_KVB{101}; static constexpr unsigned int DEFAULT_DESCENDANT_SIZE_LIMIT_KVB{101};
/** Default for -datacarrier */ /** Default for -datacarrier */
static const bool DEFAULT_ACCEPT_DATACARRIER = true; static const bool DEFAULT_ACCEPT_DATACARRIER = true;
/** Default setting for -limitdummyscriptdatasize */
static const unsigned int MAX_DUMMY_SCRIPT_RELAY{0};
/** /**
* Default setting for -datacarriersize. 80 bytes of data, +1 for OP_RETURN, * Default setting for -datacarriersize. 80 bytes of data, +1 for OP_RETURN,
* +2 for the pushdata opcodes. * +2 for the pushdata opcodes.
@ -184,4 +186,6 @@ static inline int64_t GetVirtualTransactionInputSize(const CTxIn& tx)
std::pair<CScript, unsigned int> GetScriptForTransactionInput(CScript prev_script, const CTxIn&); std::pair<CScript, unsigned int> GetScriptForTransactionInput(CScript prev_script, const CTxIn&);
size_t DummyScriptBytes(const CTransaction& tx, const CCoinsViewCache& view);
#endif // BITCOIN_POLICY_POLICY_H #endif // BITCOIN_POLICY_POLICY_H

View File

@ -882,6 +882,12 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "bad-txns-nonstandard-inputs"); return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "bad-txns-nonstandard-inputs");
} }
if (tx.GetTotalSize() > m_pool.m_opts.max_dummy_script_bytes) {
if (DummyScriptBytes(tx, m_view) > m_pool.m_opts.max_dummy_script_bytes) {
return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "txn-dummyscript-exceeded");
}
}
// Check for non-standard witnesses. // Check for non-standard witnesses.
if (tx.HasWitness() && m_pool.m_opts.require_standard && !IsWitnessStandard(tx, m_view)) { if (tx.HasWitness() && m_pool.m_opts.require_standard && !IsWitnessStandard(tx, m_view)) {
return state.Invalid(TxValidationResult::TX_WITNESS_MUTATED, "bad-witness-nonstandard"); return state.Invalid(TxValidationResult::TX_WITNESS_MUTATED, "bad-witness-nonstandard");