Skip to content

Commit 48c848e

Browse files
committed
Merge acceptnonstddatacarrier-28+knots
2 parents 42ecf3b + 8f7393a commit 48c848e

File tree

9 files changed

+64
-38
lines changed

9 files changed

+64
-38
lines changed

src/init.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,10 @@ void SetupServerArgs(ArgsManager& argsman)
669669

670670
SetupChainParamsBaseOptions(argsman);
671671

672+
argsman.AddArg("-acceptnonstddatacarrier",
673+
strprintf("Relay and mine non-OP_RETURN datacarrier injection (default: %u)",
674+
DEFAULT_ACCEPT_NON_STD_DATACARRIER),
675+
ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
672676
argsman.AddArg("-acceptnonstdtxn", strprintf("Relay and mine \"non-standard\" transactions (default: %u)", DEFAULT_ACCEPT_NON_STD_TXN), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);
673677
argsman.AddArg("-incrementalrelayfee=<amt>", strprintf("Fee rate (in %s/kvB) used to define cost of relay, used for mempool limiting and replacement policy. (default: %s)", CURRENCY_UNIT, FormatMoney(DEFAULT_INCREMENTAL_RELAY_FEE)), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::NODE_RELAY);
674678
argsman.AddArg("-dustrelayfee=<amt>", strprintf("Fee rate (in %s/kvB) used to define dust, the value of an output such that it will cost more than its value in fees at this fee rate to spend it. (default: %s)", CURRENCY_UNIT, FormatMoney(DUST_RELAY_TX_FEE)), ArgsManager::ALLOW_ANY, OptionsCategory::NODE_RELAY);

src/kernel/mempool_options.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ static constexpr RBFPolicy DEFAULT_MEMPOOL_RBF_POLICY{RBFPolicy::Always};
3232
static constexpr TRUCPolicy DEFAULT_MEMPOOL_TRUC_POLICY{TRUCPolicy::Enforce};
3333
/** Whether to fall back to legacy V1 serialization when writing mempool.dat */
3434
static constexpr bool DEFAULT_PERSIST_V1_DAT{false};
35+
/** Default for -acceptnonstddatacarrier */
36+
static constexpr bool DEFAULT_ACCEPT_NON_STD_DATACARRIER{true};
3537
/** Default for -acceptnonstdtxn */
3638
static constexpr bool DEFAULT_ACCEPT_NON_STD_TXN{false};
3739

@@ -71,6 +73,7 @@ struct MemPoolOptions {
7173
bool datacarrier_fullcount{DEFAULT_DATACARRIER_FULLCOUNT};
7274
bool permit_bare_pubkey{DEFAULT_PERMIT_BAREPUBKEY};
7375
bool permit_bare_multisig{DEFAULT_PERMIT_BAREMULTISIG};
76+
bool accept_non_std_datacarrier{DEFAULT_ACCEPT_NON_STD_DATACARRIER};
7477
bool require_standard{true};
7578
RBFPolicy rbf_policy{DEFAULT_MEMPOOL_RBF_POLICY};
7679
TRUCPolicy truc_policy{DEFAULT_MEMPOOL_TRUC_POLICY};

src/node/mempool_args.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ util::Result<void> ApplyArgsManOptions(const ArgsManager& argsman, const CChainP
152152
mempool_opts.max_datacarrier_bytes = std::nullopt;
153153
}
154154
mempool_opts.datacarrier_fullcount = argsman.GetBoolArg("-datacarrierfullcount", DEFAULT_DATACARRIER_FULLCOUNT);
155+
mempool_opts.accept_non_std_datacarrier = argsman.GetBoolArg("-acceptnonstddatacarrier", DEFAULT_ACCEPT_NON_STD_DATACARRIER);
155156

156157
mempool_opts.require_standard = !argsman.GetBoolArg("-acceptnonstdtxn", DEFAULT_ACCEPT_NON_STD_TXN);
157158

src/policy/policy.cpp

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <algorithm>
2424
#include <cstddef>
25+
#include <utility>
2526
#include <vector>
2627

2728
CAmount GetDustThreshold(const CTxOut& txout, const CFeeRate& dustRelayFeeIn)
@@ -420,17 +421,21 @@ std::pair<CScript, unsigned int> GetScriptForTransactionInput(CScript prevScript
420421
return std::make_pair(CScript(), 0);
421422
}
422423

423-
size_t DatacarrierBytes(const CTransaction& tx, const CCoinsViewCache& view)
424+
std::pair<size_t, size_t> DatacarrierBytes(const CTransaction& tx, const CCoinsViewCache& view)
424425
{
425-
size_t ret{0};
426+
std::pair<size_t, size_t> ret{0, 0};
426427

427428
for (const CTxIn& txin : tx.vin) {
428429
const CTxOut &utxo = view.AccessCoin(txin.prevout).out;
429430
auto[script, consensus_weight_per_byte] = GetScriptForTransactionInput(utxo.scriptPubKey, txin);
430-
ret += script.DatacarrierBytes();
431+
const auto dcb = script.DatacarrierBytes();
432+
ret.first += dcb.first;
433+
ret.second += dcb.second;
431434
}
432435
for (const CTxOut& txout : tx.vout) {
433-
ret += txout.scriptPubKey.DatacarrierBytes();
436+
const auto dcb = txout.scriptPubKey.DatacarrierBytes();
437+
ret.first += dcb.first;
438+
ret.second += dcb.second;
434439
}
435440

436441
return ret;
@@ -446,12 +451,14 @@ int32_t CalculateExtraTxWeight(const CTransaction& tx, const CCoinsViewCache& vi
446451
const CTxOut &utxo = view.AccessCoin(txin.prevout).out;
447452
auto[script, consensus_weight_per_byte] = GetScriptForTransactionInput(utxo.scriptPubKey, txin);
448453
if (weight_per_data_byte > consensus_weight_per_byte) {
449-
mod_weight += script.DatacarrierBytes() * (weight_per_data_byte - consensus_weight_per_byte);
454+
const auto dcb = script.DatacarrierBytes();
455+
mod_weight += (dcb.first + dcb.second) * (weight_per_data_byte - consensus_weight_per_byte);
450456
}
451457
}
452458
if (weight_per_data_byte > WITNESS_SCALE_FACTOR) {
453459
for (const CTxOut& txout : tx.vout) {
454-
mod_weight += txout.scriptPubKey.DatacarrierBytes() * (weight_per_data_byte - WITNESS_SCALE_FACTOR);
460+
const auto dcb = txout.scriptPubKey.DatacarrierBytes();
461+
mod_weight += (dcb.first + dcb.second) * (weight_per_data_byte - WITNESS_SCALE_FACTOR);
455462
}
456463
}
457464
}

src/policy/policy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ static inline int64_t GetVirtualTransactionInputSize(const CTxIn& tx)
201201

202202
std::pair<CScript, unsigned int> GetScriptForTransactionInput(CScript prevScript, const CTxIn&);
203203

204-
size_t DatacarrierBytes(const CTransaction& tx, const CCoinsViewCache& view);
204+
std::pair<size_t, size_t> DatacarrierBytes(const CTransaction& tx, const CCoinsViewCache& view);
205205

206206
int32_t CalculateExtraTxWeight(const CTransaction& tx, const CCoinsViewCache& view, const unsigned int weight_per_data_byte);
207207

src/script/script.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ bool CScript::HasValidOps() const
303303
return true;
304304
}
305305

306-
size_t CScript::DatacarrierBytes() const
306+
std::pair<size_t, size_t> CScript::DatacarrierBytes() const
307307
{
308308
size_t counted{0};
309309
opcodetype opcode, last_opcode{OP_INVALIDOPCODE};
@@ -314,17 +314,17 @@ size_t CScript::DatacarrierBytes() const
314314
opcode_it = it;
315315
if (!GetOp(it, opcode, push_data)) {
316316
// Invalid scripts are necessarily all data
317-
return size();
317+
return {0, size()};
318318
}
319319

320320
if (opcode == OP_IF || opcode == OP_NOTIF) {
321321
++inside_conditional;
322322
} else if (opcode == OP_ENDIF) {
323-
if (!inside_conditional) return size(); // invalid
323+
if (!inside_conditional) return {0, size()}; // invalid
324324
--inside_conditional;
325325
} else if (opcode == OP_RETURN && !inside_conditional) {
326326
// unconditional OP_RETURN is unspendable
327-
return size();
327+
return {size(), 0};
328328
}
329329

330330
// Match OP_FALSE OP_IF
@@ -350,7 +350,7 @@ size_t CScript::DatacarrierBytes() const
350350
counted += it - data_began;
351351
}
352352
}
353-
return counted;
353+
return {0, counted};
354354
}
355355

356356
bool GetScriptOp(CScriptBase::const_iterator& pc, CScriptBase::const_iterator end, opcodetype& opcodeRet, std::vector<unsigned char>* pvchRet)

src/script/script.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ class CScript : public CScriptBase
562562
return (size() > 0 && *begin() == OP_RETURN) || (size() > MAX_SCRIPT_SIZE);
563563
}
564564

565-
size_t DatacarrierBytes() const;
565+
std::pair<size_t, size_t> DatacarrierBytes() const;
566566

567567
void clear()
568568
{

src/test/script_tests.cpp

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,28 +1505,33 @@ BOOST_AUTO_TEST_CASE(script_HasValidOps)
15051505
BOOST_CHECK(!script.HasValidOps());
15061506
}
15071507

1508+
static std::string DatacarrierBytesStr(const CScript &script) {
1509+
auto dcb = script.DatacarrierBytes();
1510+
return strprintf("%s+%s", dcb.first, dcb.second);
1511+
}
1512+
15081513
BOOST_AUTO_TEST_CASE(script_DataCarrierBytes)
15091514
{
15101515
using zeros = std::vector<unsigned char>;
15111516

15121517
// empty script
1513-
BOOST_CHECK_EQUAL(0, (CScript()).DatacarrierBytes());
1518+
BOOST_CHECK_EQUAL("0+0", DatacarrierBytesStr(CScript()));
15141519
// series of pushes are not data
1515-
BOOST_CHECK_EQUAL(0, (CScript() << OP_0 << OP_0 << OP_0).DatacarrierBytes());
1520+
BOOST_CHECK_EQUAL("0+0", DatacarrierBytesStr(CScript() << OP_0 << OP_0 << OP_0));
15161521
// unspendable if first op is OP_RETURN, then length(1), zeros(11)
1517-
BOOST_CHECK_EQUAL(13, (CScript() << OP_RETURN << zeros(11)).DatacarrierBytes());
1522+
BOOST_CHECK_EQUAL("13+0", DatacarrierBytesStr(CScript() << OP_RETURN << zeros(11)));
15181523
// invalid script (no data following PUSHDATA) makes it all data
1519-
BOOST_CHECK_EQUAL(2, (CScript() << OP_0 << OP_PUSHDATA4).DatacarrierBytes());
1524+
BOOST_CHECK_EQUAL("0+2", DatacarrierBytesStr(CScript() << OP_0 << OP_PUSHDATA4));
15201525
// no data here
1521-
BOOST_CHECK_EQUAL(0, (CScript() << OP_TRUE << OP_IF << OP_ENDIF).DatacarrierBytes());
1526+
BOOST_CHECK_EQUAL("0+0", DatacarrierBytesStr(CScript() << OP_TRUE << OP_IF << OP_ENDIF));
15221527
// specific data pattern, entire script is data
1523-
BOOST_CHECK_EQUAL(4, (CScript() << OP_FALSE << OP_IF << OP_7 << OP_ENDIF).DatacarrierBytes());
1528+
BOOST_CHECK_EQUAL("0+4", DatacarrierBytesStr(CScript() << OP_FALSE << OP_IF << OP_7 << OP_ENDIF));
15241529
// consecutive data
1525-
BOOST_CHECK_EQUAL(6, (CScript() << OP_FALSE << OP_IF << OP_ENDIF << OP_FALSE << OP_IF << OP_ENDIF).DatacarrierBytes());
1530+
BOOST_CHECK_EQUAL("0+6", DatacarrierBytesStr(CScript() << OP_FALSE << OP_IF << OP_ENDIF << OP_FALSE << OP_IF << OP_ENDIF));
15261531
// nested data (all is data)
1527-
BOOST_CHECK_EQUAL(6, (CScript() << OP_FALSE << OP_IF << OP_TRUE << OP_IF << OP_ENDIF << OP_ENDIF).DatacarrierBytes());
1532+
BOOST_CHECK_EQUAL("0+6", DatacarrierBytesStr(CScript() << OP_FALSE << OP_IF << OP_TRUE << OP_IF << OP_ENDIF << OP_ENDIF));
15281533
// pushing then immediately dropping is data: length(1), zero(11), OP_DROP
1529-
BOOST_CHECK_EQUAL(13, (CScript() << zeros(11) << OP_DROP).DatacarrierBytes());
1534+
BOOST_CHECK_EQUAL("0+13", DatacarrierBytesStr(CScript() << zeros(11) << OP_DROP));
15301535
}
15311536

15321537
BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
@@ -1541,7 +1546,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
15411546
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
15421547
BOOST_CHECK(ret_script == tx_in.scriptSig);
15431548
BOOST_CHECK_EQUAL(scale, WITNESS_SCALE_FACTOR);
1544-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1549+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
15451550
}
15461551
{ // P2PKH - no datacarrier bytes
15471552
CScript prev_script; // scriptPubKey
@@ -1552,7 +1557,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
15521557
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
15531558
BOOST_CHECK(ret_script == tx_in.scriptSig);
15541559
BOOST_CHECK_EQUAL(scale, WITNESS_SCALE_FACTOR);
1555-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1560+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
15561561
}
15571562
{ // P2SH - no datacarrier bytes
15581563
CScript prev_script; // scriptPubKey
@@ -1565,7 +1570,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
15651570
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
15661571
BOOST_CHECK(ret_script == redeem_script);
15671572
BOOST_CHECK_EQUAL(scale, WITNESS_SCALE_FACTOR);
1568-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1573+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
15691574
}
15701575
{ // P2SH - with datacarrier bytes
15711576
CScript prev_script; // scriptPubKey
@@ -1580,7 +1585,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
15801585
BOOST_CHECK(ret_script == redeem_script);
15811586
BOOST_CHECK_EQUAL(scale, WITNESS_SCALE_FACTOR);
15821587
// OP_RETURN(1), length(1), zeros(27) = 29
1583-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 29);
1588+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "29+0");
15841589
}
15851590
{ // P2WPKH - no datacarrier bytes
15861591
CScript prev_script; // scriptPubKey
@@ -1596,7 +1601,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
15961601
// should have no script at all since it's wrapped P2WPKH
15971602
BOOST_CHECK(ret_script == CScript());
15981603
BOOST_CHECK_EQUAL(scale, 0);
1599-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1604+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
16001605
}
16011606
{ // P2WSH - no datacarrier bytes
16021607
CScript prev_script; // scriptPubKey
@@ -1612,7 +1617,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
16121617
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
16131618
BOOST_CHECK(ret_script == redeem_script);
16141619
BOOST_CHECK_EQUAL(scale, 1);
1615-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1620+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
16161621
}
16171622
{ // P2WSH - some datacarrier bytes
16181623
CScript prev_script; // scriptPubKey
@@ -1629,7 +1634,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
16291634
BOOST_CHECK(ret_script == redeem_script);
16301635
BOOST_CHECK_EQUAL(scale, 1);
16311636
// OP_FALSE(1), OP_IF(1), length(1), zeros(10), OP_ENDIF(1)
1632-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 14);
1637+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+14");
16331638
}
16341639
{ // P2SH-P2WPKH - no datacarrier bytes
16351640
CScript prev_script; // scriptPubKey
@@ -1644,7 +1649,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
16441649
BOOST_CHECK(ret_script == CScript());
16451650
// data bytes in the witness get discounted (*1 instead of *4)
16461651
BOOST_CHECK_EQUAL(scale, 0);
1647-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1652+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
16481653
}
16491654
{ // P2SH-P2WSH - no datacarrier bytes
16501655
CScript prev_script; // scriptPubKey
@@ -1668,7 +1673,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
16681673
BOOST_CHECK(ret_script == witness_redeem_script);
16691674
// data bytes in the witness get discounted (*1 instead of *4)
16701675
BOOST_CHECK_EQUAL(scale, 1);
1671-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1676+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
16721677
}
16731678
{ // P2SH-P2WSH - some datacarrier bytes
16741679
CScript prev_script; // scriptPubKey
@@ -1693,7 +1698,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
16931698
// data bytes in the witness get discounted (*1 instead of *4)
16941699
BOOST_CHECK_EQUAL(scale, 1);
16951700
// OP_FALSE(1), OP_IF(1), length(1), zeros(10), OP_ENDIF(1) = 14
1696-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 14);
1701+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+14");
16971702
}
16981703
{ // P2TR keypath - no datacarrier bytes
16991704
CScript prev_script; // scriptPubKey
@@ -1705,7 +1710,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
17051710
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
17061711
BOOST_CHECK(ret_script == CScript());
17071712
BOOST_CHECK_EQUAL(scale, 0);
1708-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1713+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
17091714
}
17101715
{ // P2TR keypath - annex but no script - no datacarrier bytes
17111716
CScript prev_script; // scriptPubKey
@@ -1719,7 +1724,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
17191724
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
17201725
BOOST_CHECK(ret_script == CScript());
17211726
BOOST_CHECK_EQUAL(scale, 0);
1722-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1727+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
17231728
}
17241729
{ // P2TR scriptpath - no datacarrier bytes
17251730
CScript prev_script; // scriptPubKey
@@ -1738,7 +1743,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
17381743
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
17391744
BOOST_CHECK(ret_script == script);
17401745
BOOST_CHECK_EQUAL(scale, 1);
1741-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 0);
1746+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "0+0");
17421747
}
17431748
{ // P2TR scriptpath - some datacarrier bytes
17441749
CScript prev_script; // scriptPubKey
@@ -1756,7 +1761,7 @@ BOOST_AUTO_TEST_CASE(script_GetScriptForTransactionInput)
17561761
auto [ret_script, scale] = GetScriptForTransactionInput(prev_script, tx_in);
17571762
BOOST_CHECK(ret_script == script);
17581763
BOOST_CHECK_EQUAL(scale, 1);
1759-
BOOST_CHECK_EQUAL(ret_script.DatacarrierBytes(), 3);
1764+
BOOST_CHECK_EQUAL(DatacarrierBytesStr(ret_script), "3+0");
17601765
}
17611766
}
17621767

src/validation.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,8 +1014,14 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
10141014
return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, reason);
10151015
}
10161016

1017-
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)) {
1018-
return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "txn-datacarrier-exceeded");
1017+
if (m_pool.m_opts.datacarrier_fullcount || !m_pool.m_opts.accept_non_std_datacarrier) {
1018+
const auto dcb = DatacarrierBytes(tx, m_view);
1019+
if (dcb.second > 0 && !(m_pool.m_opts.accept_non_std_datacarrier || ignore_rejects.count("txn-datacarrier-nonstandard"))) {
1020+
return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "txn-datacarrier-nonstandard");
1021+
}
1022+
if (m_pool.m_opts.datacarrier_fullcount && (!ignore_rejects.count("txn-datacarrier-exceeded")) && dcb.first + dcb.second > m_pool.m_opts.max_datacarrier_bytes.value_or(0)) {
1023+
return state.Invalid(TxValidationResult::TX_INPUTS_NOT_STANDARD, "txn-datacarrier-exceeded");
1024+
}
10191025
}
10201026

10211027
// Check for non-standard witnesses.

0 commit comments

Comments
 (0)