|
|
|
@ -7,7 +7,7 @@ a serialized version of the UTXO set at a certain height, which corresponds
|
|
|
|
|
to a hash that has been compiled into bitcoind.
|
|
|
|
|
|
|
|
|
|
The assumeutxo value generated and used here is committed to in
|
|
|
|
|
`CRegTestParams::m_assumeutxo_data` in `src/chainparams.cpp`.
|
|
|
|
|
`CRegTestParams::m_assumeutxo_data` in `src/kernel/chainparams.cpp`.
|
|
|
|
|
|
|
|
|
|
## Possible test improvements
|
|
|
|
|
|
|
|
|
@ -40,8 +40,10 @@ from test_framework.util import (
|
|
|
|
|
assert_equal,
|
|
|
|
|
assert_raises_rpc_error,
|
|
|
|
|
)
|
|
|
|
|
from test_framework.wallet import getnewdestination
|
|
|
|
|
|
|
|
|
|
from test_framework.wallet import (
|
|
|
|
|
getnewdestination,
|
|
|
|
|
MiniWallet,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
START_HEIGHT = 199
|
|
|
|
|
SNAPSHOT_BASE_HEIGHT = 299
|
|
|
|
@ -98,10 +100,10 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|
|
|
|
|
|
|
|
|
self.log.info(" - snapshot file with alternated UTXO data")
|
|
|
|
|
cases = [
|
|
|
|
|
[b"\xff" * 32, 0, "05030e506678f2eca8d624ffed97090ab3beadad1b51ee6e5985ba91c5720e37"], # wrong outpoint hash
|
|
|
|
|
[(1).to_bytes(4, "little"), 32, "7d29cfe2c1e242bc6f103878bb70cfffa8b4dac20dbd001ff6ce24b7de2d2399"], # wrong outpoint index
|
|
|
|
|
[b"\x81", 36, "f03939a195531f96d5dff983e294a1af62af86049fa7a19a7627246f237c03f1"], # wrong coin code VARINT((coinbase ? 1 : 0) | (height << 1))
|
|
|
|
|
[b"\x83", 36, "e4577da84590fb288c0f7967e89575e1b0aa46624669640f6f5dfef028d39930"], # another wrong coin code
|
|
|
|
|
[b"\xff" * 32, 0, "7d52155c9a9fdc4525b637ef6170568e5dad6fabd0b1fdbb9432010b8453095b"], # wrong outpoint hash
|
|
|
|
|
[(1).to_bytes(4, "little"), 32, "9f4d897031ab8547665b4153317ae2fdbf0130c7840b66427ebc48b881cb80ad"], # wrong outpoint index
|
|
|
|
|
[b"\x81", 36, "3da966ba9826fb6d2604260e01607b55ba44e1a5de298606b08704bc62570ea8"], # wrong coin code VARINT((coinbase ? 1 : 0) | (height << 1))
|
|
|
|
|
[b"\x80", 36, "091e893b3ccb4334378709578025356c8bcb0a623f37c7c4e493133c988648e5"], # another wrong coin code
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
for content, offset, wrong_hash in cases:
|
|
|
|
@ -109,7 +111,7 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|
|
|
|
f.write(valid_snapshot_contents[:(32 + 8 + offset)])
|
|
|
|
|
f.write(content)
|
|
|
|
|
f.write(valid_snapshot_contents[(32 + 8 + offset + len(content)):])
|
|
|
|
|
expected_error(log_msg=f"[snapshot] bad snapshot content hash: expected 61d9c2b29a2571a5fe285fe2d8554f91f93309666fc9b8223ee96338de25ff53, got {wrong_hash}")
|
|
|
|
|
expected_error(log_msg=f"[snapshot] bad snapshot content hash: expected a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27, got {wrong_hash}")
|
|
|
|
|
|
|
|
|
|
def test_invalid_chainstate_scenarios(self):
|
|
|
|
|
self.log.info("Test different scenarios of invalid snapshot chainstate in datadir")
|
|
|
|
@ -145,6 +147,8 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|
|
|
|
n1 = self.nodes[1]
|
|
|
|
|
n2 = self.nodes[2]
|
|
|
|
|
|
|
|
|
|
self.mini_wallet = MiniWallet(n0)
|
|
|
|
|
|
|
|
|
|
# Mock time for a deterministic chain
|
|
|
|
|
for n in self.nodes:
|
|
|
|
|
n.setmocktime(n.getblockheader(n.getbestblockhash())['time'])
|
|
|
|
@ -157,6 +161,8 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|
|
|
|
# isn't waiting forever to see the header of the snapshot's base block
|
|
|
|
|
# while disconnected from n0.
|
|
|
|
|
for i in range(100):
|
|
|
|
|
if i % 3 == 0:
|
|
|
|
|
self.mini_wallet.send_self_transfer(from_node=n0)
|
|
|
|
|
self.generate(n0, nblocks=1, sync_fun=self.no_op)
|
|
|
|
|
newblock = n0.getblock(n0.getbestblockhash(), 0)
|
|
|
|
|
|
|
|
|
@ -178,8 +184,8 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|
|
|
|
|
|
|
|
|
assert_equal(
|
|
|
|
|
dump_output['txoutset_hash'],
|
|
|
|
|
'61d9c2b29a2571a5fe285fe2d8554f91f93309666fc9b8223ee96338de25ff53')
|
|
|
|
|
assert_equal(dump_output['nchaintx'], 300)
|
|
|
|
|
"a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")
|
|
|
|
|
assert_equal(dump_output["nchaintx"], 334)
|
|
|
|
|
assert_equal(n0.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
|
|
|
|
|
|
|
|
|
|
# Mine more blocks on top of the snapshot that n1 hasn't yet seen. This
|
|
|
|
|