Merge #12676: Show "bip125-replaceable" flag, when retrieving mempool entries
870bd4c73d
Update functional RBF test to check replaceable flag (dexX7)820d31f95f
Add "bip125-replaceable" flag to mempool RPCs (dexX7) Pull request description: This pull request adds a flag "bip125-replaceable" to the mempool RPCs getrawmempool, getmempoolentry, getmempoolancestors and getmempooldescendants, which indicates whether an unconfirmed transaction might be replaced. Initially the flag was added to the raw transaction RPCs, but thanks to @conscott, it was moved to the mempool RPCs, which actually have access to the mempool. ~~This pull request adds a flag "bip125-replaceable" to the RPCs "getrawtransaction" and "decoderawtransaction", which indicates, whether a transaction signals BIP 125 replaceability.~~ There was some discussion in #7817, whether showing replaceability in the UI could lead to the false assumption that transactions that don't signal BIP 125 are truely non-replaceable, but given that this PR tackles the raw transaction interface, which is a rather low level tool, I believe having this extra piece of information isn't bad. Tree-SHA512: 1f5511957af2c20a9a6c79d80a335c3be37a2402dbf829c40cceaa01a24868eab81a9c1cdb0b3d77198fa3bb82799e3540a5c0ce7f35bbac80d73f7133ff7cbc
This commit is contained in:
commit
6516b36731
2 changed files with 21 additions and 2 deletions
|
@ -18,6 +18,7 @@
|
|||
#include <key_io.h>
|
||||
#include <policy/feerate.h>
|
||||
#include <policy/policy.h>
|
||||
#include <policy/rbf.h>
|
||||
#include <primitives/transaction.h>
|
||||
#include <rpc/server.h>
|
||||
#include <script/descriptor.h>
|
||||
|
@ -379,7 +380,8 @@ static std::string EntryDescriptionString()
|
|||
" ... ]\n"
|
||||
" \"spentby\" : [ (array) unconfirmed transactions spending outputs from this transaction\n"
|
||||
" \"transactionid\", (string) child transaction id\n"
|
||||
" ... ]\n";
|
||||
" ... ]\n"
|
||||
" \"bip125-replaceable\" : true|false, (boolean) Whether this transaction could be replaced due to BIP125 (replace-by-fee)\n";
|
||||
}
|
||||
|
||||
static void entryToJSON(UniValue &info, const CTxMemPoolEntry &e) EXCLUSIVE_LOCKS_REQUIRED(::mempool.cs)
|
||||
|
@ -429,6 +431,17 @@ static void entryToJSON(UniValue &info, const CTxMemPoolEntry &e) EXCLUSIVE_LOCK
|
|||
}
|
||||
|
||||
info.pushKV("spentby", spent);
|
||||
|
||||
// Add opt-in RBF status
|
||||
bool rbfStatus = false;
|
||||
RBFTransactionState rbfState = IsRBFOptIn(tx, mempool);
|
||||
if (rbfState == RBFTransactionState::UNKNOWN) {
|
||||
throw JSONRPCError(RPC_MISC_ERROR, "Transaction is not in mempool");
|
||||
} else if (rbfState == RBFTransactionState::REPLACEABLE_BIP125) {
|
||||
rbfStatus = true;
|
||||
}
|
||||
|
||||
info.pushKV("bip125-replaceable", rbfStatus);
|
||||
}
|
||||
|
||||
UniValue mempoolToJSON(bool fVerbose)
|
||||
|
|
|
@ -429,6 +429,9 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||
tx1a_hex = txToHex(tx1a)
|
||||
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, True)
|
||||
|
||||
# This transaction isn't shown as replaceable
|
||||
assert_equal(self.nodes[0].getmempoolentry(tx1a_txid)['bip125-replaceable'], False)
|
||||
|
||||
# Shouldn't be able to double-spend
|
||||
tx1b = CTransaction()
|
||||
tx1b.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||
|
@ -469,7 +472,10 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||
tx3a.vout = [CTxOut(int(0.9*COIN), CScript([b'c'])), CTxOut(int(0.9*COIN), CScript([b'd']))]
|
||||
tx3a_hex = txToHex(tx3a)
|
||||
|
||||
self.nodes[0].sendrawtransaction(tx3a_hex, True)
|
||||
tx3a_txid = self.nodes[0].sendrawtransaction(tx3a_hex, True)
|
||||
|
||||
# This transaction is shown as replaceable
|
||||
assert_equal(self.nodes[0].getmempoolentry(tx3a_txid)['bip125-replaceable'], True)
|
||||
|
||||
tx3b = CTransaction()
|
||||
tx3b.vin = [CTxIn(COutPoint(tx1a_txid, 0), nSequence=0)]
|
||||
|
|
Loading…
Reference in a new issue