Remove use of AcceptToMemoryPool in wallet code
This commit does not change behavior.
This commit is contained in:
parent
e2c8ba9f6e
commit
d02b34c8a8
4 changed files with 26 additions and 10 deletions
|
@ -11,6 +11,7 @@
|
||||||
#include <policy/policy.h>
|
#include <policy/policy.h>
|
||||||
#include <policy/rbf.h>
|
#include <policy/rbf.h>
|
||||||
#include <primitives/block.h>
|
#include <primitives/block.h>
|
||||||
|
#include <primitives/transaction.h>
|
||||||
#include <protocol.h>
|
#include <protocol.h>
|
||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <threadsafety.h>
|
#include <threadsafety.h>
|
||||||
|
@ -146,6 +147,12 @@ class LockImpl : public Chain::Lock
|
||||||
LockAnnotation lock(::cs_main);
|
LockAnnotation lock(::cs_main);
|
||||||
return CheckFinalTx(tx);
|
return CheckFinalTx(tx);
|
||||||
}
|
}
|
||||||
|
bool submitToMemoryPool(CTransactionRef tx, CAmount absurd_fee, CValidationState& state) override
|
||||||
|
{
|
||||||
|
LockAnnotation lock(::cs_main);
|
||||||
|
return AcceptToMemoryPool(::mempool, state, tx, nullptr /* missing inputs */, nullptr /* txn replaced */,
|
||||||
|
false /* bypass limits */, absurd_fee);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class LockingStateImpl : public LockImpl, public UniqueLock<CCriticalSection>
|
class LockingStateImpl : public LockImpl, public UniqueLock<CCriticalSection>
|
||||||
|
@ -237,6 +244,7 @@ public:
|
||||||
{
|
{
|
||||||
return ::mempool.GetMinFee(gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
|
return ::mempool.GetMinFee(gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
|
||||||
}
|
}
|
||||||
|
CAmount maxTxFee() override { return ::maxTxFee; }
|
||||||
bool getPruneMode() override { return ::fPruneMode; }
|
bool getPruneMode() override { return ::fPruneMode; }
|
||||||
bool p2pEnabled() override { return g_connman != nullptr; }
|
bool p2pEnabled() override { return g_connman != nullptr; }
|
||||||
int64_t getAdjustedTime() override { return GetAdjustedTime(); }
|
int64_t getAdjustedTime() override { return GetAdjustedTime(); }
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include <optional.h> // For Optional and nullopt
|
#include <optional.h> // For Optional and nullopt
|
||||||
#include <policy/rbf.h> // For RBFTransactionState
|
#include <policy/rbf.h> // For RBFTransactionState
|
||||||
|
#include <primitives/transaction.h> // For CTransactionRef
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
@ -16,7 +17,7 @@
|
||||||
|
|
||||||
class CBlock;
|
class CBlock;
|
||||||
class CScheduler;
|
class CScheduler;
|
||||||
class CTransaction;
|
class CValidationState;
|
||||||
class uint256;
|
class uint256;
|
||||||
struct CBlockLocator;
|
struct CBlockLocator;
|
||||||
struct FeeCalculation;
|
struct FeeCalculation;
|
||||||
|
@ -109,6 +110,10 @@ public:
|
||||||
|
|
||||||
//! Check if transaction will be final given chain height current time.
|
//! Check if transaction will be final given chain height current time.
|
||||||
virtual bool checkFinalTx(const CTransaction& tx) = 0;
|
virtual bool checkFinalTx(const CTransaction& tx) = 0;
|
||||||
|
|
||||||
|
//! Add transaction to memory pool if the transaction fee is below the
|
||||||
|
//! amount specified by absurd_fee (as a safeguard). */
|
||||||
|
virtual bool submitToMemoryPool(CTransactionRef tx, CAmount absurd_fee, CValidationState& state) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Return Lock interface. Chain is locked when this is called, and
|
//! Return Lock interface. Chain is locked when this is called, and
|
||||||
|
@ -159,6 +164,12 @@ public:
|
||||||
//! Pool min fee.
|
//! Pool min fee.
|
||||||
virtual CFeeRate mempoolMinFee() = 0;
|
virtual CFeeRate mempoolMinFee() = 0;
|
||||||
|
|
||||||
|
//! Get node max tx fee setting (-maxtxfee).
|
||||||
|
//! This could be replaced by a per-wallet max fee, as proposed at
|
||||||
|
//! https://github.com/bitcoin/bitcoin/issues/15355
|
||||||
|
//! But for the time being, wallets call this to access the node setting.
|
||||||
|
virtual CAmount maxTxFee() = 0;
|
||||||
|
|
||||||
//! Check if pruning is enabled.
|
//! Check if pruning is enabled.
|
||||||
virtual bool getPruneMode() = 0;
|
virtual bool getPruneMode() = 0;
|
||||||
|
|
||||||
|
|
|
@ -1886,7 +1886,7 @@ void CWallet::ReacceptWalletTransactions()
|
||||||
for (const std::pair<const int64_t, CWalletTx*>& item : mapSorted) {
|
for (const std::pair<const int64_t, CWalletTx*>& item : mapSorted) {
|
||||||
CWalletTx& wtx = *(item.second);
|
CWalletTx& wtx = *(item.second);
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
wtx.AcceptToMemoryPool(*locked_chain, maxTxFee, state);
|
wtx.AcceptToMemoryPool(*locked_chain, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1897,7 +1897,7 @@ bool CWalletTx::RelayWalletTransaction(interfaces::Chain::Lock& locked_chain)
|
||||||
{
|
{
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
/* GetDepthInMainChain already catches known conflicts. */
|
/* GetDepthInMainChain already catches known conflicts. */
|
||||||
if (InMempool() || AcceptToMemoryPool(locked_chain, maxTxFee, state)) {
|
if (InMempool() || AcceptToMemoryPool(locked_chain, state)) {
|
||||||
pwallet->WalletLogPrintf("Relaying wtx %s\n", GetHash().ToString());
|
pwallet->WalletLogPrintf("Relaying wtx %s\n", GetHash().ToString());
|
||||||
if (pwallet->chain().p2pEnabled()) {
|
if (pwallet->chain().p2pEnabled()) {
|
||||||
pwallet->chain().relayTransaction(GetHash());
|
pwallet->chain().relayTransaction(GetHash());
|
||||||
|
@ -3180,7 +3180,7 @@ bool CWallet::CommitTransaction(CTransactionRef tx, mapValue_t mapValue, std::ve
|
||||||
if (fBroadcastTransactions)
|
if (fBroadcastTransactions)
|
||||||
{
|
{
|
||||||
// Broadcast
|
// Broadcast
|
||||||
if (!wtx.AcceptToMemoryPool(*locked_chain, maxTxFee, state)) {
|
if (!wtx.AcceptToMemoryPool(*locked_chain, state)) {
|
||||||
WalletLogPrintf("CommitTransaction(): Transaction cannot be broadcast immediately, %s\n", FormatStateMessage(state));
|
WalletLogPrintf("CommitTransaction(): Transaction cannot be broadcast immediately, %s\n", FormatStateMessage(state));
|
||||||
// TODO: if we expect the failure to be long term or permanent, instead delete wtx from the wallet and return failure.
|
// TODO: if we expect the failure to be long term or permanent, instead delete wtx from the wallet and return failure.
|
||||||
} else {
|
} else {
|
||||||
|
@ -4474,17 +4474,14 @@ bool CMerkleTx::IsImmatureCoinBase(interfaces::Chain::Lock& locked_chain) const
|
||||||
return GetBlocksToMaturity(locked_chain) > 0;
|
return GetBlocksToMaturity(locked_chain) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CWalletTx::AcceptToMemoryPool(interfaces::Chain::Lock& locked_chain, const CAmount& nAbsurdFee, CValidationState& state)
|
bool CWalletTx::AcceptToMemoryPool(interfaces::Chain::Lock& locked_chain, CValidationState& state)
|
||||||
{
|
{
|
||||||
LockAnnotation lock(::cs_main); // Temporary, for AcceptToMemoryPool below. Removed in upcoming commit.
|
|
||||||
|
|
||||||
// We must set fInMempool here - while it will be re-set to true by the
|
// We must set fInMempool here - while it will be re-set to true by the
|
||||||
// entered-mempool callback, if we did not there would be a race where a
|
// entered-mempool callback, if we did not there would be a race where a
|
||||||
// user could call sendmoney in a loop and hit spurious out of funds errors
|
// user could call sendmoney in a loop and hit spurious out of funds errors
|
||||||
// because we think that this newly generated transaction's change is
|
// because we think that this newly generated transaction's change is
|
||||||
// unavailable as we're not yet aware that it is in the mempool.
|
// unavailable as we're not yet aware that it is in the mempool.
|
||||||
bool ret = ::AcceptToMemoryPool(mempool, state, tx, nullptr /* pfMissingInputs */,
|
bool ret = locked_chain.submitToMemoryPool(tx, pwallet->chain().maxTxFee(), state);
|
||||||
nullptr /* plTxnReplaced */, false /* bypass_limits */, nAbsurdFee);
|
|
||||||
fInMempool |= ret;
|
fInMempool |= ret;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -538,7 +538,7 @@ public:
|
||||||
bool RelayWalletTransaction(interfaces::Chain::Lock& locked_chain);
|
bool RelayWalletTransaction(interfaces::Chain::Lock& locked_chain);
|
||||||
|
|
||||||
/** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */
|
/** Pass this transaction to the mempool. Fails if absolute fee exceeds absurd fee. */
|
||||||
bool AcceptToMemoryPool(interfaces::Chain::Lock& locked_chain, const CAmount& nAbsurdFee, CValidationState& state);
|
bool AcceptToMemoryPool(interfaces::Chain::Lock& locked_chain, CValidationState& state);
|
||||||
|
|
||||||
// TODO: Remove "NO_THREAD_SAFETY_ANALYSIS" and replace it with the correct
|
// TODO: Remove "NO_THREAD_SAFETY_ANALYSIS" and replace it with the correct
|
||||||
// annotation "EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)". The annotation
|
// annotation "EXCLUSIVE_LOCKS_REQUIRED(pwallet->cs_wallet)". The annotation
|
||||||
|
|
Loading…
Reference in a new issue