Merge bitcoin/bitcoin#30636: test: assumeutxo: check that UTXO-querying RPCs operate on snapshot chainstate
Some checks are pending
CI / test each commit (push) Waiting to run
CI / macOS 13 native, x86_64, no depends, sqlite only, gui (push) Waiting to run
CI / Win64 native, VS 2022 (push) Waiting to run
CI / ASan + LSan + UBSan + integer, no depends, USDT (push) Waiting to run

917e70a620 test: assumeutxo: check that UTXO-querying RPCs operate on snapshot chainstate (Sebastian Falbesoner)

Pull request description:

  Inspired by some manual testing I did for #28553, this PR checks that RPCs which explicitly query the UTXO set database (i.e. `gettxoutsetinfo`, `scantxoutset` and `gettxout`) operate on the snapshot chainstate as expected.

ACKs for top commit:
  fjahr:
    utACK 917e70a620
  achow101:
    ACK 917e70a620
  tdb3:
    ACK 917e70a620

Tree-SHA512: 40ecd1c5dd879234df1667fa5444a1fbbee9b7c456f597dc982d1a2bce46fe9107711b005ab829e570ef919a4914792f72f342d71d92bad2ae9434b5e68d5bd3
This commit is contained in:
Ava Chow 2024-08-21 13:30:00 -04:00
commit bc87ad9854
No known key found for this signature in database
GPG key ID: 17565732E08E5E41

View file

@ -350,6 +350,31 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT) assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT)
assert_equal(loaded['base_height'], SNAPSHOT_BASE_HEIGHT) assert_equal(loaded['base_height'], SNAPSHOT_BASE_HEIGHT)
self.log.info("Check that UTXO-querying RPCs operate on snapshot chainstate")
snapshot_hash = loaded['tip_hash']
snapshot_num_coins = loaded['coins_loaded']
# coinstatsindex might be not caught up yet and is not relevant for this test, so don't use it
utxo_info = n1.gettxoutsetinfo(use_index=False)
assert_equal(utxo_info['txouts'], snapshot_num_coins)
assert_equal(utxo_info['height'], SNAPSHOT_BASE_HEIGHT)
assert_equal(utxo_info['bestblock'], snapshot_hash)
# find coinbase output at snapshot height on node0 and scan for it on node1,
# where the block is not available, but the snapshot was loaded successfully
coinbase_tx = n0.getblock(snapshot_hash, verbosity=2)['tx'][0]
assert_raises_rpc_error(-1, "Block not found on disk", n1.getblock, snapshot_hash)
coinbase_output_descriptor = coinbase_tx['vout'][0]['scriptPubKey']['desc']
scan_result = n1.scantxoutset('start', [coinbase_output_descriptor])
assert_equal(scan_result['success'], True)
assert_equal(scan_result['txouts'], snapshot_num_coins)
assert_equal(scan_result['height'], SNAPSHOT_BASE_HEIGHT)
assert_equal(scan_result['bestblock'], snapshot_hash)
scan_utxos = [(coin['txid'], coin['vout']) for coin in scan_result['unspents']]
assert (coinbase_tx['txid'], 0) in scan_utxos
txout_result = n1.gettxout(coinbase_tx['txid'], 0)
assert_equal(txout_result['scriptPubKey']['desc'], coinbase_output_descriptor)
def check_tx_counts(final: bool) -> None: def check_tx_counts(final: bool) -> None:
"""Check nTx and nChainTx intermediate values right after loading """Check nTx and nChainTx intermediate values right after loading
the snapshot, and final values after the snapshot is validated.""" the snapshot, and final values after the snapshot is validated."""