Skip to content

Commit 7f07359

Browse files
committed
Test src/node/transaction::GetTransaction() without -txindex
1 parent db94d74 commit 7f07359

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

test/functional/rpc_rawtransaction.py

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,12 @@ def items(self):
5050
class RawTransactionsTest(BitcoinTestFramework):
5151
def set_test_params(self):
5252
self.setup_clean_chain = True
53-
self.num_nodes = 3
53+
self.num_nodes = 4
5454
self.extra_args = [
5555
["-txindex"],
5656
["-txindex"],
5757
["-txindex"],
58+
[],
5859
]
5960
# whitelist all peers to speed up tx relay / mempool sync
6061
for args in self.extra_args:
@@ -226,28 +227,40 @@ def run_test(self):
226227
tx = self.nodes[2].sendtoaddress(self.nodes[1].getnewaddress(), 1)
227228
block1, block2 = self.nodes[2].generate(2)
228229
self.sync_all()
229-
# We should be able to get the raw transaction by providing the correct block
230-
gottx = self.nodes[0].getrawtransaction(tx, True, block1)
231-
assert_equal(gottx['txid'], tx)
232-
assert_equal(gottx['in_active_chain'], True)
233-
# We should not have the 'in_active_chain' flag when we don't provide a block
234-
gottx = self.nodes[0].getrawtransaction(tx, True)
235-
assert_equal(gottx['txid'], tx)
236-
assert 'in_active_chain' not in gottx
237-
# We should not get the tx if we provide an unrelated block
238-
assert_raises_rpc_error(-5, "No such transaction found", self.nodes[0].getrawtransaction, tx, True, block2)
239-
# An invalid block hash should raise the correct errors
240-
assert_raises_rpc_error(-1, "JSON value is not a string as expected", self.nodes[0].getrawtransaction, tx, True, True)
241-
assert_raises_rpc_error(-8, "parameter 3 must be of length 64 (not 6, for 'foobar')", self.nodes[0].getrawtransaction, tx, True, "foobar")
242-
assert_raises_rpc_error(-8, "parameter 3 must be of length 64 (not 8, for 'abcd1234')", self.nodes[0].getrawtransaction, tx, True, "abcd1234")
243-
assert_raises_rpc_error(-8, "parameter 3 must be hexadecimal string (not 'ZZZ0000000000000000000000000000000000000000000000000000000000000')", self.nodes[0].getrawtransaction, tx, True, "ZZZ0000000000000000000000000000000000000000000000000000000000000")
244-
assert_raises_rpc_error(-5, "Block hash not found", self.nodes[0].getrawtransaction, tx, True, "0000000000000000000000000000000000000000000000000000000000000000")
245-
# Undo the blocks and check in_active_chain
246-
self.nodes[0].invalidateblock(block1)
247-
gottx = self.nodes[0].getrawtransaction(txid=tx, verbose=True, blockhash=block1)
248-
assert_equal(gottx['in_active_chain'], False)
249-
self.nodes[0].reconsiderblock(block1)
250-
assert_equal(self.nodes[0].getbestblockhash(), block2)
230+
for n in [0, 3]:
231+
self.log.info(f"Test getrawtransaction {'with' if n == 0 else 'without'} -txindex, with blockhash")
232+
# We should be able to get the raw transaction by providing the correct block
233+
gottx = self.nodes[n].getrawtransaction(txid=tx, verbose=True, blockhash=block1)
234+
assert_equal(gottx['txid'], tx)
235+
assert_equal(gottx['in_active_chain'], True)
236+
if n == 0:
237+
self.log.info("Test getrawtransaction with -txindex, without blockhash: 'in_active_chain' should be absent")
238+
gottx = self.nodes[n].getrawtransaction(txid=tx, verbose=True)
239+
assert_equal(gottx['txid'], tx)
240+
assert 'in_active_chain' not in gottx
241+
else:
242+
self.log.info("Test getrawtransaction without -txindex, without blockhash: expect the call to raise")
243+
err_msg = (
244+
"No such mempool transaction. Use -txindex or provide a block hash to enable"
245+
" blockchain transaction queries. Use gettransaction for wallet transactions."
246+
)
247+
assert_raises_rpc_error(-5, err_msg, self.nodes[n].getrawtransaction, txid=tx, verbose=True)
248+
# We should not get the tx if we provide an unrelated block
249+
assert_raises_rpc_error(-5, "No such transaction found", self.nodes[n].getrawtransaction, txid=tx, blockhash=block2)
250+
# An invalid block hash should raise the correct errors
251+
assert_raises_rpc_error(-1, "JSON value is not a string as expected", self.nodes[n].getrawtransaction, txid=tx, blockhash=True)
252+
assert_raises_rpc_error(-8, "parameter 3 must be of length 64 (not 6, for 'foobar')", self.nodes[n].getrawtransaction, txid=tx, blockhash="foobar")
253+
assert_raises_rpc_error(-8, "parameter 3 must be of length 64 (not 8, for 'abcd1234')", self.nodes[n].getrawtransaction, txid=tx, blockhash="abcd1234")
254+
foo = "ZZZ0000000000000000000000000000000000000000000000000000000000000"
255+
assert_raises_rpc_error(-8, f"parameter 3 must be hexadecimal string (not '{foo}')", self.nodes[n].getrawtransaction, txid=tx, blockhash=foo)
256+
bar = "0000000000000000000000000000000000000000000000000000000000000000"
257+
assert_raises_rpc_error(-5, "Block hash not found", self.nodes[n].getrawtransaction, txid=tx, blockhash=bar)
258+
# Undo the blocks and verify that "in_active_chain" is false.
259+
self.nodes[n].invalidateblock(block1)
260+
gottx = self.nodes[n].getrawtransaction(txid=tx, verbose=True, blockhash=block1)
261+
assert_equal(gottx['in_active_chain'], False)
262+
self.nodes[n].reconsiderblock(block1)
263+
assert_equal(self.nodes[n].getbestblockhash(), block2)
251264

252265
if not self.options.descriptors:
253266
# The traditional multisig workflow does not work with descriptor wallets so these are legacy only.

0 commit comments

Comments
 (0)