Fix issue with conflicted mempool tx in listsinceblock
listsinceblock now checks that returned transactions are not conflicting with any transactions that are filtered out by the given blockhash Co-Authored-By: Michael Chrostowski <michael.chrostowski@gmail.com>
This commit is contained in:
parent
693e40090a
commit
436ad43643
2 changed files with 50 additions and 1 deletions
|
@ -1591,7 +1591,7 @@ static UniValue listsinceblock(const JSONRPCRequest& request)
|
|||
for (const std::pair<const uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
||||
CWalletTx tx = pairWtx.second;
|
||||
|
||||
if (depth == -1 || tx.GetDepthInMainChain(*locked_chain) < depth) {
|
||||
if (depth == -1 || abs(tx.GetDepthInMainChain(*locked_chain)) < depth) {
|
||||
ListTransactions(*locked_chain, pwallet, tx, 0, true, transactions, filter, nullptr /* filter_label */);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
"""Test the listsincelast RPC."""
|
||||
|
||||
from test_framework.test_framework import BitcoinTestFramework
|
||||
from test_framework.messages import BIP125_SEQUENCE_NUMBER
|
||||
from test_framework.util import (
|
||||
assert_array_result,
|
||||
assert_equal,
|
||||
|
@ -12,6 +13,7 @@ from test_framework.util import (
|
|||
connect_nodes,
|
||||
)
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
class ListSinceBlockTest(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
|
@ -33,6 +35,7 @@ class ListSinceBlockTest(BitcoinTestFramework):
|
|||
self.test_reorg()
|
||||
self.test_double_spend()
|
||||
self.test_double_send()
|
||||
self.double_spends_filtered()
|
||||
|
||||
def test_no_blockhash(self):
|
||||
txid = self.nodes[2].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||
|
@ -291,5 +294,51 @@ class ListSinceBlockTest(BitcoinTestFramework):
|
|||
if tx['txid'] == txid1:
|
||||
assert_equal(tx['confirmations'], 2)
|
||||
|
||||
def double_spends_filtered(self):
|
||||
'''
|
||||
`listsinceblock` was returning conflicted transactions even if they
|
||||
occurred before the specified cutoff blockhash
|
||||
'''
|
||||
spending_node = self.nodes[2]
|
||||
dest_address = spending_node.getnewaddress()
|
||||
|
||||
tx_input = dict(
|
||||
sequence=BIP125_SEQUENCE_NUMBER, **next(u for u in spending_node.listunspent()))
|
||||
rawtx = spending_node.createrawtransaction(
|
||||
[tx_input], {dest_address: tx_input["amount"] - Decimal("0.00051000"),
|
||||
spending_node.getrawchangeaddress(): Decimal("0.00050000")})
|
||||
signedtx = spending_node.signrawtransactionwithwallet(rawtx)
|
||||
orig_tx_id = spending_node.sendrawtransaction(signedtx["hex"])
|
||||
original_tx = spending_node.gettransaction(orig_tx_id)
|
||||
|
||||
double_tx = spending_node.bumpfee(orig_tx_id)
|
||||
|
||||
# check that both transactions exist
|
||||
block_hash = spending_node.listsinceblock(
|
||||
spending_node.getblockhash(spending_node.getblockcount()))
|
||||
original_found = False
|
||||
double_found = False
|
||||
for tx in block_hash['transactions']:
|
||||
if tx['txid'] == original_tx['txid']:
|
||||
original_found = True
|
||||
if tx['txid'] == double_tx['txid']:
|
||||
double_found = True
|
||||
assert_equal(original_found, True)
|
||||
assert_equal(double_found, True)
|
||||
|
||||
lastblockhash = spending_node.generate(1)[0]
|
||||
|
||||
# check that neither transaction exists
|
||||
block_hash = spending_node.listsinceblock(lastblockhash)
|
||||
original_found = False
|
||||
double_found = False
|
||||
for tx in block_hash['transactions']:
|
||||
if tx['txid'] == original_tx['txid']:
|
||||
original_found = True
|
||||
if tx['txid'] == double_tx['txid']:
|
||||
double_found = True
|
||||
assert_equal(original_found, False)
|
||||
assert_equal(double_found, False)
|
||||
|
||||
if __name__ == '__main__':
|
||||
ListSinceBlockTest().main()
|
||||
|
|
Loading…
Reference in a new issue