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)