lbry-sdk/tests/integration/blockchain/test_blockchain_reorganization.py

86 lines
3.7 KiB
Python
Raw Normal View History

2018-11-04 06:55:50 +01:00
import logging
2020-04-01 19:52:14 +02:00
import asyncio
2020-03-31 16:30:36 +02:00
from lbry.testcase import CommandTestCase
from lbry.wallet.server.prometheus import REORG_COUNT
2020-03-31 16:30:36 +02:00
class BlockchainReorganizationTests(CommandTestCase):
2018-11-04 06:55:50 +01:00
VERBOSITY = logging.WARN
async def assertBlockHash(self, height):
self.assertEqual(
2020-03-21 08:32:03 +01:00
(await self.ledger.headers.hash(height)).decode(),
await self.blockchain.get_block_hash(height)
)
2018-09-26 03:06:22 +02:00
async def test_reorg(self):
2020-03-31 16:30:36 +02:00
REORG_COUNT.set(0)
2019-06-18 23:50:41 +02:00
# invalidate current block, move forward 2
2020-03-31 16:30:36 +02:00
self.assertEqual(self.ledger.headers.height, 206)
await self.assertBlockHash(206)
await self.blockchain.invalidate_block((await self.ledger.headers.hash(206)).decode())
2019-06-18 23:50:41 +02:00
await self.blockchain.generate(2)
2020-03-31 16:30:36 +02:00
await self.ledger.on_header.where(lambda e: e.height == 207)
self.assertEqual(self.ledger.headers.height, 207)
await self.assertBlockHash(206)
await self.assertBlockHash(207)
self.assertEqual(1, REORG_COUNT._samples()[0][2])
2018-09-26 03:06:22 +02:00
2019-06-18 23:50:41 +02:00
# invalidate current block, move forward 3
2020-03-31 16:30:36 +02:00
await self.blockchain.invalidate_block((await self.ledger.headers.hash(206)).decode())
2019-06-18 23:50:41 +02:00
await self.blockchain.generate(3)
2020-03-31 16:30:36 +02:00
await self.ledger.on_header.where(lambda e: e.height == 208)
self.assertEqual(self.ledger.headers.height, 208)
await self.assertBlockHash(206)
await self.assertBlockHash(207)
await self.assertBlockHash(208)
self.assertEqual(2, REORG_COUNT._samples()[0][2])
2020-04-01 19:52:14 +02:00
async def test_reorg_dropping_claim(self):
# sanity check
2020-04-01 21:11:45 +02:00
txos, _, _, _ = await self.ledger.claim_search([], name='hovercraft')
self.assertListEqual(txos, [])
2020-04-01 19:52:14 +02:00
2020-04-01 21:11:45 +02:00
# create a claim and verify it's returned by claim_search
2020-04-01 19:52:14 +02:00
self.assertEqual(self.ledger.headers.height, 206)
2020-04-01 21:11:45 +02:00
broadcast_tx = await self.daemon.jsonrpc_stream_create(
'hovercraft', '1.0', file_path=self.create_upload_file(data=b'hi!')
)
await self.ledger.wait(broadcast_tx)
await self.generate(1)
await self.ledger.wait(broadcast_tx, self.blockchain.block_expected)
2020-04-01 19:52:14 +02:00
self.assertEqual(self.ledger.headers.height, 207)
2020-04-01 21:11:45 +02:00
txos, _, _, _ = await self.ledger.claim_search([], name='hovercraft')
self.assertEqual(1, len(txos))
txo = txos[0]
self.assertEqual(txo.tx_ref.id, broadcast_tx.id)
2020-04-01 19:52:14 +02:00
# check that our tx is in block 207 as returned by lbrycrdd
invalidated_block_hash = (await self.ledger.headers.hash(207)).decode()
block_207 = await self.blockchain.get_block(invalidated_block_hash)
2020-04-01 21:11:45 +02:00
self.assertIn(txo.tx_ref.id, block_207['tx'])
2020-04-01 19:52:14 +02:00
# reorg the last block dropping our claim tx
await self.blockchain.invalidate_block(invalidated_block_hash)
await self.blockchain.clear_mempool()
await self.blockchain.generate(2)
# verify the claim was dropped from block 207 as returned by lbrycrdd
reorg_block_hash = await self.blockchain.get_block_hash(207)
self.assertNotEqual(invalidated_block_hash, reorg_block_hash)
block_207 = await self.blockchain.get_block(reorg_block_hash)
2020-04-01 21:11:45 +02:00
self.assertNotIn(txo.tx_ref.id, block_207['tx'])
2020-04-01 19:52:14 +02:00
# wait for the client to catch up and verify the reorg
await asyncio.wait_for(self.on_header(208), 3.0)
await self.assertBlockHash(206)
await self.assertBlockHash(207)
await self.assertBlockHash(208)
client_reorg_block_hash = (await self.ledger.headers.hash(207)).decode()
self.assertEqual(client_reorg_block_hash, reorg_block_hash)
2020-04-01 21:11:45 +02:00
# verify the dropped claim is no longer returned by claim search
txos, _, _, _ = await self.ledger.claim_search([], name='hovercraft')
self.assertListEqual(txos, [])