mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-15 04:11:02 +01:00
call SignalsOptInRBF instead of checking all inputs
This commit is contained in:
parent
e0df41d7d5
commit
badb9b11a6
2 changed files with 10 additions and 20 deletions
|
@ -11,8 +11,15 @@ class CTransaction;
|
||||||
|
|
||||||
static const uint32_t MAX_BIP125_RBF_SEQUENCE = 0xfffffffd;
|
static const uint32_t MAX_BIP125_RBF_SEQUENCE = 0xfffffffd;
|
||||||
|
|
||||||
// Check whether the sequence numbers on this transaction are signaling
|
/** Check whether the sequence numbers on this transaction are signaling
|
||||||
// opt-in to replace-by-fee, according to BIP 125
|
* opt-in to replace-by-fee, according to BIP 125.
|
||||||
|
* Allow opt-out of transaction replacement by setting
|
||||||
|
* nSequence > MAX_BIP125_RBF_SEQUENCE (SEQUENCE_FINAL-2) on all inputs.
|
||||||
|
*
|
||||||
|
* SEQUENCE_FINAL-1 is picked to still allow use of nLockTime by
|
||||||
|
* non-replaceable transactions. All inputs rather than just one
|
||||||
|
* is for the sake of multi-party protocols, where we don't
|
||||||
|
* want a single party to be able to disable replacement. */
|
||||||
bool SignalsOptInRBF(const CTransaction &tx);
|
bool SignalsOptInRBF(const CTransaction &tx);
|
||||||
|
|
||||||
#endif // BITCOIN_UTIL_RBF_H
|
#endif // BITCOIN_UTIL_RBF_H
|
||||||
|
|
|
@ -605,14 +605,6 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
|
||||||
}
|
}
|
||||||
if (!setConflicts.count(ptxConflicting->GetHash()))
|
if (!setConflicts.count(ptxConflicting->GetHash()))
|
||||||
{
|
{
|
||||||
// Allow opt-out of transaction replacement by setting
|
|
||||||
// nSequence > MAX_BIP125_RBF_SEQUENCE (SEQUENCE_FINAL-2) on all inputs.
|
|
||||||
//
|
|
||||||
// SEQUENCE_FINAL-1 is picked to still allow use of nLockTime by
|
|
||||||
// non-replaceable transactions. All inputs rather than just one
|
|
||||||
// is for the sake of multi-party protocols, where we don't
|
|
||||||
// want a single party to be able to disable replacement.
|
|
||||||
//
|
|
||||||
// Transactions that don't explicitly signal replaceability are
|
// Transactions that don't explicitly signal replaceability are
|
||||||
// *not* replaceable with the current logic, even if one of their
|
// *not* replaceable with the current logic, even if one of their
|
||||||
// unconfirmed ancestors signals replaceability. This diverges
|
// unconfirmed ancestors signals replaceability. This diverges
|
||||||
|
@ -620,16 +612,7 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
|
||||||
// Applications relying on first-seen mempool behavior should
|
// Applications relying on first-seen mempool behavior should
|
||||||
// check all unconfirmed ancestors; otherwise an opt-in ancestor
|
// check all unconfirmed ancestors; otherwise an opt-in ancestor
|
||||||
// might be replaced, causing removal of this descendant.
|
// might be replaced, causing removal of this descendant.
|
||||||
bool fReplacementOptOut = true;
|
if (!SignalsOptInRBF(*ptxConflicting)) {
|
||||||
for (const CTxIn &_txin : ptxConflicting->vin)
|
|
||||||
{
|
|
||||||
if (_txin.nSequence <= MAX_BIP125_RBF_SEQUENCE)
|
|
||||||
{
|
|
||||||
fReplacementOptOut = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (fReplacementOptOut) {
|
|
||||||
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "txn-mempool-conflict");
|
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "txn-mempool-conflict");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue