nit: no strong view, and not important, but my preference would be to just remove the std::optional
altogether. Simplifies fn signature and defines what zero means in a single location.
0diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h
1index d57dbb393f..4786aca67d 100644
2--- a/src/kernel/mempool_options.h
3+++ b/src/kernel/mempool_options.h
4@@ -48,9 +48,9 @@ struct MemPoolOptions {
5 * type is designated as TxoutType::NULL_DATA.
6 *
7 * Maximum size of TxoutType::NULL_DATA scripts that this node considers standard.
8- * If nullopt, any size is nonstandard.
9+ * If zero, any size is nonstandard.
10 */
11- std::optional<unsigned> max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? std::optional{MAX_OP_RETURN_RELAY} : std::nullopt};
12+ unsigned int max_datacarrier_bytes{DEFAULT_ACCEPT_DATACARRIER ? MAX_OP_RETURN_RELAY : 0};
13 bool permit_bare_multisig{DEFAULT_PERMIT_BAREMULTISIG};
14 bool require_standard{true};
15 bool persist_v1_dat{DEFAULT_PERSIST_V1_DAT};
16diff --git a/src/node/mempool_args.cpp b/src/node/mempool_args.cpp
17index 6dbba78381..c2bf1749a9 100644
18--- a/src/node/mempool_args.cpp
19+++ b/src/node/mempool_args.cpp
20@@ -84,7 +84,7 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP
21 if (argsman.GetBoolArg("-datacarrier", DEFAULT_ACCEPT_DATACARRIER)) {
22 mempool_opts.max_datacarrier_bytes = argsman.GetIntArg("-datacarriersize", MAX_OP_RETURN_RELAY);
23 } else {
24- mempool_opts.max_datacarrier_bytes = std::nullopt;
25+ mempool_opts.max_datacarrier_bytes = 0;
26 }
27
28 mempool_opts.require_standard = !argsman.GetBoolArg("-acceptnonstdtxn", DEFAULT_ACCEPT_NON_STD_TXN);
29diff --git a/src/policy/policy.cpp b/src/policy/policy.cpp
30index fdc2fdb9cd..51f5ae972e 100644
31--- a/src/policy/policy.cpp
32+++ b/src/policy/policy.cpp
33@@ -96,7 +96,7 @@ bool IsStandard(const CScript& scriptPubKey, TxoutType& whichType)
34 return true;
35 }
36
37-bool IsStandardTx(const CTransaction& tx, const std::optional<unsigned>& max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason)
38+bool IsStandardTx(const CTransaction& tx, unsigned int max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason)
39 {
40 if (tx.version > TX_MAX_STANDARD_VERSION || tx.version < 1) {
41 reason = "version";
42@@ -133,7 +133,7 @@ bool IsStandardTx(const CTransaction& tx, const std::optional<unsigned>& max_dat
43 }
44 }
45
46- unsigned int datacarrier_bytes_left = max_datacarrier_bytes.value_or(0);
47+ unsigned int datacarrier_bytes_left{max_datacarrier_bytes};
48 TxoutType whichType;
49 for (const CTxOut& txout : tx.vout) {
50 if (!::IsStandard(txout.scriptPubKey, whichType)) {
51diff --git a/src/policy/policy.h b/src/policy/policy.h
52index e62efa02e3..82cb13d1e6 100644
53--- a/src/policy/policy.h
54+++ b/src/policy/policy.h
55@@ -149,7 +149,7 @@ static constexpr decltype(CTransaction::version) TX_MAX_STANDARD_VERSION{3};
56 * Check for standard transaction types
57 * [@return](/bitcoin-bitcoin/contributor/return/) True if all outputs (scriptPubKeys) use only standard transaction forms
58 */
59-bool IsStandardTx(const CTransaction& tx, const std::optional<unsigned>& max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason);
60+bool IsStandardTx(const CTransaction& tx, unsigned int max_datacarrier_bytes, bool permit_bare_multisig, const CFeeRate& dust_relay_fee, std::string& reason);
61 /**
62 * Check for standard transaction types
63 * [@param](/bitcoin-bitcoin/contributor/param/)[in] mapInputs Map of previous transactions that have outputs we're spending
64diff --git a/src/test/fuzz/transaction.cpp b/src/test/fuzz/transaction.cpp
65index c9eb11222f..f5cbacfb78 100644
66--- a/src/test/fuzz/transaction.cpp
67+++ b/src/test/fuzz/transaction.cpp
68@@ -61,8 +61,8 @@ FUZZ_TARGET(transaction, .init = initialize_transaction)
69
70 const CFeeRate dust_relay_fee{DUST_RELAY_TX_FEE};
71 std::string reason;
72- const bool is_standard_with_permit_bare_multisig = IsStandardTx(tx, std::nullopt, /* permit_bare_multisig= */ true, dust_relay_fee, reason);
73- const bool is_standard_without_permit_bare_multisig = IsStandardTx(tx, std::nullopt, /* permit_bare_multisig= */ false, dust_relay_fee, reason);
74+ const bool is_standard_with_permit_bare_multisig = IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /* permit_bare_multisig= */ true, dust_relay_fee, reason);
75+ const bool is_standard_without_permit_bare_multisig = IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /* permit_bare_multisig= */ false, dust_relay_fee, reason);
76 if (is_standard_without_permit_bare_multisig) {
77 assert(is_standard_with_permit_bare_multisig);
78 }
79diff --git a/src/test/script_p2sh_tests.cpp b/src/test/script_p2sh_tests.cpp
80index bb408b7b0f..68909dbb8a 100644
81--- a/src/test/script_p2sh_tests.cpp
82+++ b/src/test/script_p2sh_tests.cpp
83@@ -21,13 +21,13 @@
84 // Helpers:
85 static bool IsStandardTx(const CTransaction& tx, bool permit_bare_multisig, std::string& reason)
86 {
87- return IsStandardTx(tx, std::nullopt, permit_bare_multisig, CFeeRate{DUST_RELAY_TX_FEE}, reason);
88+ return IsStandardTx(tx, /*max_datacarrier_bytes=*/0, permit_bare_multisig, CFeeRate{DUST_RELAY_TX_FEE}, reason);
89 }
90
91 static bool IsStandardTx(const CTransaction& tx, std::string& reason)
92 {
93- return IsStandardTx(tx, std::nullopt, /*permit_bare_multisig=*/true, CFeeRate{DUST_RELAY_TX_FEE}, reason) &&
94- IsStandardTx(tx, std::nullopt, /*permit_bare_multisig=*/false, CFeeRate{DUST_RELAY_TX_FEE}, reason);
95+ return IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /*permit_bare_multisig=*/true, CFeeRate{DUST_RELAY_TX_FEE}, reason) &&
96+ IsStandardTx(tx, /*max_datacarrier_bytes=*/0, /*permit_bare_multisig=*/false, CFeeRate{DUST_RELAY_TX_FEE}, reason);
97 }
98
99 static std::vector<unsigned char> Serialize(const CScript& s)