diff --git a/src/init.cpp b/src/init.cpp index 035725b0908e..d3110f98f77f 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1144,6 +1144,11 @@ bool AppInitParameterInteraction() fAcceptDatacarrier = gArgs.GetBoolArg("-datacarrier", DEFAULT_ACCEPT_DATACARRIER); nMaxDatacarrierBytes = gArgs.GetArg("-datacarriersize", nMaxDatacarrierBytes); + g_package_limits.m_ancestor_limit = gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT); + g_package_limits.m_ancestor_size_limit = gArgs.GetArg("-limitancestorsize", DEFAULT_ANCESTOR_SIZE_LIMIT)*1000; + g_package_limits.m_descendant_limit = gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT); + g_package_limits.m_descendant_size_limit = gArgs.GetArg("-limitdescendantsize", DEFAULT_DESCENDANT_SIZE_LIMIT)*1000; + // Option to startup with mocktime set (used for regression testing): SetMockTime(gArgs.GetArg("-mocktime", 0)); // SetMockTime(0) is a no-op diff --git a/src/interfaces/chain.cpp b/src/interfaces/chain.cpp index b8b9ecded9f6..a818a3a190fb 100644 --- a/src/interfaces/chain.cpp +++ b/src/interfaces/chain.cpp @@ -298,15 +298,19 @@ class ChainImpl : public Chain { ::mempool.GetTransactionAncestry(txid, ancestors, descendants); } + PackageLimits getPackageLimits() override + { + return g_package_limits; + } bool checkChainLimits(const CTransactionRef& tx) override { LockPoints lp; CTxMemPoolEntry entry(tx, 0, 0, 0, false, 0, lp); CTxMemPool::setEntries ancestors; - auto limit_ancestor_count = gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT); - auto limit_ancestor_size = gArgs.GetArg("-limitancestorsize", DEFAULT_ANCESTOR_SIZE_LIMIT) * 1000; - auto limit_descendant_count = gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT); - auto limit_descendant_size = gArgs.GetArg("-limitdescendantsize", DEFAULT_DESCENDANT_SIZE_LIMIT) * 1000; + auto limit_ancestor_count = g_package_limits.m_ancestor_limit; + auto limit_ancestor_size = g_package_limits.m_ancestor_size_limit; + auto limit_descendant_count = g_package_limits.m_descendant_limit; + auto limit_descendant_size = g_package_limits.m_descendant_size_limit; std::string unused_error_string; LOCK(::mempool.cs); return ::mempool.CalculateMemPoolAncestors(entry, ancestors, limit_ancestor_count, limit_ancestor_size, diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h index da670a337064..14ae7a83d252 100644 --- a/src/interfaces/chain.h +++ b/src/interfaces/chain.h @@ -24,6 +24,7 @@ class uint256; enum class RBFTransactionState; struct CBlockLocator; struct FeeCalculation; +struct PackageLimits; namespace interfaces { @@ -163,6 +164,9 @@ class Chain //! Calculate mempool ancestor and descendant counts for the given transaction. virtual void getTransactionAncestry(const uint256& txid, size_t& ancestors, size_t& descendants) = 0; + //! Get the node's mempool transaction package limits. + virtual PackageLimits getPackageLimits() = 0; + //! Check if transaction will pass the mempool's chain limits. virtual bool checkChainLimits(const CTransactionRef& tx) = 0; diff --git a/src/policy/settings.cpp b/src/policy/settings.cpp index e8e1559407a3..5aa4feec7724 100644 --- a/src/policy/settings.cpp +++ b/src/policy/settings.cpp @@ -12,3 +12,10 @@ bool fIsBareMultisigStd = DEFAULT_PERMIT_BAREMULTISIG; CFeeRate incrementalRelayFee = CFeeRate(DEFAULT_INCREMENTAL_RELAY_FEE); CFeeRate dustRelayFee = CFeeRate(DUST_RELAY_TX_FEE); unsigned int nBytesPerSigOp = DEFAULT_BYTES_PER_SIGOP; + +PackageLimits g_package_limits { + DEFAULT_ANCESTOR_LIMIT, + DEFAULT_ANCESTOR_SIZE_LIMIT, + DEFAULT_DESCENDANT_LIMIT, + DEFAULT_DESCENDANT_SIZE_LIMIT +}; diff --git a/src/policy/settings.h b/src/policy/settings.h index 30a7189c93d3..1872fcc6a25b 100644 --- a/src/policy/settings.h +++ b/src/policy/settings.h @@ -8,6 +8,15 @@ #include +/** Default for -limitancestorcount, max number of in-mempool ancestors */ +static const unsigned int DEFAULT_ANCESTOR_LIMIT = 25; +/** Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors */ +static const unsigned int DEFAULT_ANCESTOR_SIZE_LIMIT = 101; +/** Default for -limitdescendantcount, max number of in-mempool descendants */ +static const unsigned int DEFAULT_DESCENDANT_LIMIT = 25; +/** Default for -limitdescendantsize, maximum kilobytes of in-mempool descendants */ +static const unsigned int DEFAULT_DESCENDANT_SIZE_LIMIT = 101; + class CFeeRate; class CTransaction; @@ -17,6 +26,15 @@ extern CFeeRate dustRelayFee; extern unsigned int nBytesPerSigOp; extern bool fIsBareMultisigStd; +struct PackageLimits { + unsigned int m_ancestor_limit; + unsigned int m_ancestor_size_limit; + unsigned int m_descendant_limit; + unsigned int m_descendant_size_limit; +}; + +extern PackageLimits g_package_limits; + static inline bool IsStandardTx(const CTransaction& tx, std::string& reason) { return IsStandardTx(tx, ::fIsBareMultisigStd, ::dustRelayFee, reason); diff --git a/src/validation.cpp b/src/validation.cpp index 726f251c5aad..8518c0d7e81a 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -434,10 +434,10 @@ class MemPoolAccept { public: MemPoolAccept(CTxMemPool& mempool) : m_pool(mempool), m_view(&m_dummy), m_viewmempool(&::ChainstateActive().CoinsTip(), m_pool), - m_limit_ancestors(gArgs.GetArg("-limitancestorcount", DEFAULT_ANCESTOR_LIMIT)), - m_limit_ancestor_size(gArgs.GetArg("-limitancestorsize", DEFAULT_ANCESTOR_SIZE_LIMIT)*1000), - m_limit_descendants(gArgs.GetArg("-limitdescendantcount", DEFAULT_DESCENDANT_LIMIT)), - m_limit_descendant_size(gArgs.GetArg("-limitdescendantsize", DEFAULT_DESCENDANT_SIZE_LIMIT)*1000) {} + m_limit_ancestors(g_package_limits.m_ancestor_limit), + m_limit_ancestor_size(g_package_limits.m_ancestor_size_limit), + m_limit_descendants(g_package_limits.m_descendant_limit), + m_limit_descendant_size(g_package_limits.m_descendant_size_limit) {} // We put the arguments we're handed into a struct, so we can pass them // around easier. diff --git a/src/validation.h b/src/validation.h index fbbe3757e0db..701a601f7514 100644 --- a/src/validation.h +++ b/src/validation.h @@ -52,14 +52,6 @@ struct LockPoints; /** Default for -minrelaytxfee, minimum relay fee for transactions */ static const unsigned int DEFAULT_MIN_RELAY_TX_FEE = 1000; -/** Default for -limitancestorcount, max number of in-mempool ancestors */ -static const unsigned int DEFAULT_ANCESTOR_LIMIT = 25; -/** Default for -limitancestorsize, maximum kilobytes of tx + all in-mempool ancestors */ -static const unsigned int DEFAULT_ANCESTOR_SIZE_LIMIT = 101; -/** Default for -limitdescendantcount, max number of in-mempool descendants */ -static const unsigned int DEFAULT_DESCENDANT_LIMIT = 25; -/** Default for -limitdescendantsize, maximum kilobytes of in-mempool descendants */ -static const unsigned int DEFAULT_DESCENDANT_SIZE_LIMIT = 101; /** * An extra transaction can be added to a package, as long as it only has one * ancestor and is no larger than this. Not really any reason to make this diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp index 09f08220dbd1..42a3ccd75278 100644 --- a/src/wallet/wallet.cpp +++ b/src/wallet/wallet.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include