mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-04 15:18:05 +01:00
assumeutxo test: Add RPC test for fake nTx and nChainTx values
The fake values will be removed in an upcoming commit, so it is useful to have test coverage confirming the change in behavior.
This commit is contained in:
parent
9a459e3ab9
commit
f252e687ec
1 changed files with 41 additions and 1 deletions
|
@ -34,6 +34,7 @@ Interesting starting states could be loading a snapshot when the current chain t
|
||||||
"""
|
"""
|
||||||
from shutil import rmtree
|
from shutil import rmtree
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
from test_framework.messages import tx_from_hex
|
from test_framework.messages import tx_from_hex
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
|
@ -174,10 +175,18 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Generate a series of blocks that `n0` will have in the snapshot,
|
# Generate a series of blocks that `n0` will have in the snapshot,
|
||||||
# but that n1 and n2 don't yet see.
|
# but that n1 and n2 don't yet see.
|
||||||
|
assert n0.getblockcount() == START_HEIGHT
|
||||||
|
blocks = {START_HEIGHT: Block(n0.getbestblockhash(), 1, START_HEIGHT + 1)}
|
||||||
for i in range(100):
|
for i in range(100):
|
||||||
|
block_tx = 1
|
||||||
if i % 3 == 0:
|
if i % 3 == 0:
|
||||||
self.mini_wallet.send_self_transfer(from_node=n0)
|
self.mini_wallet.send_self_transfer(from_node=n0)
|
||||||
|
block_tx += 1
|
||||||
self.generate(n0, nblocks=1, sync_fun=self.no_op)
|
self.generate(n0, nblocks=1, sync_fun=self.no_op)
|
||||||
|
height = n0.getblockcount()
|
||||||
|
hash = n0.getbestblockhash()
|
||||||
|
blocks[height] = Block(hash, block_tx, blocks[height-1].chain_tx + block_tx)
|
||||||
|
|
||||||
|
|
||||||
self.log.info("-- Testing assumeutxo + some indexes + pruning")
|
self.log.info("-- Testing assumeutxo + some indexes + pruning")
|
||||||
|
|
||||||
|
@ -207,7 +216,7 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||||
assert_equal(
|
assert_equal(
|
||||||
dump_output['txoutset_hash'],
|
dump_output['txoutset_hash'],
|
||||||
"a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")
|
"a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")
|
||||||
assert_equal(dump_output["nchaintx"], 334)
|
assert_equal(dump_output["nchaintx"], blocks[SNAPSHOT_BASE_HEIGHT].chain_tx)
|
||||||
assert_equal(n0.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
|
assert_equal(n0.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
|
||||||
|
|
||||||
# Mine more blocks on top of the snapshot that n1 hasn't yet seen. This
|
# Mine more blocks on top of the snapshot that n1 hasn't yet seen. This
|
||||||
|
@ -228,6 +237,30 @@ 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)
|
||||||
|
|
||||||
|
def check_tx_counts(final: bool) -> None:
|
||||||
|
"""Check nTx and nChainTx intermediate values right after loading
|
||||||
|
the snapshot, and final values after the snapshot is validated."""
|
||||||
|
for height, block in blocks.items():
|
||||||
|
tx = n1.getblockheader(block.hash)["nTx"]
|
||||||
|
chain_tx = n1.getchaintxstats(nblocks=1, blockhash=block.hash)["txcount"]
|
||||||
|
|
||||||
|
# Intermediate nTx of the starting block should be real, but nTx of
|
||||||
|
# later blocks should be fake 1 values set by snapshot loading code.
|
||||||
|
if final or height == START_HEIGHT:
|
||||||
|
assert_equal(tx, block.tx)
|
||||||
|
else:
|
||||||
|
assert_equal(tx, 1)
|
||||||
|
|
||||||
|
# Intermediate nChainTx of the starting block and snapshot block
|
||||||
|
# should be real, but others will be fake values set by snapshot
|
||||||
|
# loading code.
|
||||||
|
if final or height in (START_HEIGHT, SNAPSHOT_BASE_HEIGHT):
|
||||||
|
assert_equal(chain_tx, block.chain_tx)
|
||||||
|
else:
|
||||||
|
assert_equal(chain_tx, height + 1)
|
||||||
|
|
||||||
|
check_tx_counts(final=False)
|
||||||
|
|
||||||
normal, snapshot = n1.getchainstates()["chainstates"]
|
normal, snapshot = n1.getchainstates()["chainstates"]
|
||||||
assert_equal(normal['blocks'], START_HEIGHT)
|
assert_equal(normal['blocks'], START_HEIGHT)
|
||||||
assert_equal(normal.get('snapshot_blockhash'), None)
|
assert_equal(normal.get('snapshot_blockhash'), None)
|
||||||
|
@ -291,6 +324,8 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||||
}
|
}
|
||||||
self.wait_until(lambda: n1.getindexinfo() == completed_idx_state)
|
self.wait_until(lambda: n1.getindexinfo() == completed_idx_state)
|
||||||
|
|
||||||
|
self.log.info("Re-check nTx and nChainTx values")
|
||||||
|
check_tx_counts(final=True)
|
||||||
|
|
||||||
for i in (0, 1):
|
for i in (0, 1):
|
||||||
n = self.nodes[i]
|
n = self.nodes[i]
|
||||||
|
@ -365,6 +400,11 @@ class AssumeutxoTest(BitcoinTestFramework):
|
||||||
self.connect_nodes(0, 2)
|
self.connect_nodes(0, 2)
|
||||||
self.wait_until(lambda: n2.getblockcount() == FINAL_HEIGHT)
|
self.wait_until(lambda: n2.getblockcount() == FINAL_HEIGHT)
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Block:
|
||||||
|
hash: str
|
||||||
|
tx: int
|
||||||
|
chain_tx: int
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
AssumeutxoTest().main()
|
AssumeutxoTest().main()
|
||||||
|
|
Loading…
Add table
Reference in a new issue