diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 110125aeef..7751a5471e 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -255,6 +255,12 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet) limitdescendantsize->setMaximum(std::numeric_limits::max()); CreateOptionUI(verticalLayout_Spamfiltering, limitdescendantsize, tr("Ignore transactions if any ancestor would have more than %s kilobytes of unconfirmed descendants.")); + rejectbaremultisig = new QCheckBox(groupBox_Spamfiltering); + rejectbaremultisig->setText(tr("Ignore bare/exposed \"multisig\" scripts")); + rejectbaremultisig->setToolTip(tr("Spam is sometimes disguised to appear as if it is an old-style N-of-M multi-party transaction, where most of the keys are really bogus. At the same time, legitimate multi-party transactions typically have always used P2SH format (which is not filtered by this option), which is more secure.")); + verticalLayout_Spamfiltering->addWidget(rejectbaremultisig); + FixTabOrder(rejectbaremultisig); + verticalLayout_Mempool->addWidget(groupBox_Spamfiltering); verticalLayout_Mempool->addItem(new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding)); @@ -504,6 +510,7 @@ void OptionsDialog::setMapper() mapper->addMapping(limitancestorsize, OptionsModel::limitancestorsize); mapper->addMapping(limitdescendantcount, OptionsModel::limitdescendantcount); mapper->addMapping(limitdescendantsize, OptionsModel::limitdescendantsize); + mapper->addMapping(rejectbaremultisig, OptionsModel::rejectbaremultisig); /* Window */ #ifndef Q_OS_MACOS diff --git a/src/qt/optionsdialog.h b/src/qt/optionsdialog.h index 5137334c66..cf5b63c3cb 100644 --- a/src/qt/optionsdialog.h +++ b/src/qt/optionsdialog.h @@ -100,6 +100,7 @@ private: QSpinBox *limitancestorsize; QSpinBox *limitdescendantcount; QSpinBox *limitdescendantsize; + QCheckBox *rejectbaremultisig; }; #endif // BITCOIN_QT_OPTIONSDIALOG_H diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 169f1a764e..9b174cea44 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -633,6 +633,8 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con return qlonglong(node().mempool().m_limits.descendant_count); case limitdescendantsize: return qlonglong(node().mempool().m_limits.descendant_size_vbytes / 1'000); + case rejectbaremultisig: + return !node().mempool().m_permit_bare_multisig; default: return QVariant(); } @@ -1061,6 +1063,14 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value, const std:: gArgs.ModifyRWConfigFile("limitdescendantsize", strNv); } break; + case rejectbaremultisig: + if (changed()) { + // The config and internal option is inverted + const bool fNewValue = ! value.toBool(); + node().mempool().m_permit_bare_multisig = fNewValue; + gArgs.ModifyRWConfigFile("permitbaremultisig", strprintf("%d", fNewValue)); + } + break; default: break; } diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index cd974bf06a..8e362fd2db 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -91,6 +91,7 @@ public: limitancestorsize, limitdescendantcount, limitdescendantsize, + rejectbaremultisig, // bool OptionIDRowCount, }; diff --git a/src/txmempool.h b/src/txmempool.h index a69038e4a7..a71246bda8 100644 --- a/src/txmempool.h +++ b/src/txmempool.h @@ -467,7 +467,7 @@ public: const CFeeRate m_incremental_relay_feerate; const CFeeRate m_min_relay_feerate; const CFeeRate m_dust_relay_feerate; - const bool m_permit_bare_multisig; + bool m_permit_bare_multisig; const std::optional m_max_datacarrier_bytes; bool m_datacarrier_fullcount; bool m_require_standard;