improve reorgs
This commit is contained in:
parent
cdbb34e976
commit
b0bc06ae00
3 changed files with 26 additions and 6 deletions
|
@ -1,17 +1,36 @@
|
|||
from orchstr8.testcase import IntegrationTestCase
|
||||
from asyncio import sleep
|
||||
|
||||
|
||||
class BlockchainReorganizationTests(IntegrationTestCase):
|
||||
|
||||
VERBOSE = True
|
||||
|
||||
async def test(self):
|
||||
async def test_reorg(self):
|
||||
self.assertEqual(self.ledger.headers.height, 200)
|
||||
|
||||
await self.blockchain.generate(1)
|
||||
await self.on_header(201)
|
||||
self.assertEqual(self.ledger.headers.height, 201)
|
||||
height = 201
|
||||
|
||||
await self.blockchain.invalidateblock(self.ledger.headers.hash(201).decode())
|
||||
await self.blockchain.generate(2)
|
||||
await self.on_header(203)
|
||||
#simple fork (rewind+advance to immediate best)
|
||||
height = await self._simulate_reorg(height, 1, 1, 2)
|
||||
height = await self._simulate_reorg(height, 2, 1, 10)
|
||||
height = await self._simulate_reorg(height, 4, 1, 3)
|
||||
#lagged fork (rewind+batch catch up with immediate best)
|
||||
height = await self._simulate_reorg(height, 4, 2, 3)
|
||||
await self._simulate_reorg(height, 4, 4, 3)
|
||||
|
||||
async def _simulate_reorg(self, height, rewind, winners, progress):
|
||||
for i in range(rewind):
|
||||
await self.blockchain.invalidateblock(self.ledger.headers.hash(height - i).decode())
|
||||
await self.blockchain.generate(rewind + winners)
|
||||
height = height + winners
|
||||
await self.on_header(height)
|
||||
for i in range(progress):
|
||||
await self.blockchain.generate(1)
|
||||
height += 1
|
||||
await self.on_header(height)
|
||||
self.assertEquals(height, self.ledger.headers.height)
|
||||
return height
|
||||
|
|
|
@ -107,7 +107,7 @@ class BaseHeaders:
|
|||
yield threads.deferToThread(self.validate_chunk, height, chunk)
|
||||
except InvalidHeader as e:
|
||||
bail = True
|
||||
chunk = chunk[:(height-e.height)*self.header_size]
|
||||
chunk = chunk[:(height-e.height+1)*self.header_size]
|
||||
written = 0
|
||||
if chunk:
|
||||
self.io.seek(height * self.header_size, os.SEEK_SET)
|
||||
|
|
3
tox.ini
3
tox.ini
|
@ -20,4 +20,5 @@ commands =
|
|||
unit: coverage run -p --source={envsitepackagesdir}/torba -m twisted.trial unit
|
||||
integration: orchstr8 download
|
||||
integration: coverage run -p --source={envsitepackagesdir}/torba -m twisted.trial --reactor=asyncio integration.test_transactions
|
||||
integration: coverage run -p --source={envsitepackagesdir}/torba -m twisted.trial --reactor=asyncio integration.test_blockchain_reorganization
|
||||
# Too slow on Travis
|
||||
# integration: coverage run -p --source={envsitepackagesdir}/torba -m twisted.trial --reactor=asyncio integration.test_blockchain_reorganization
|
||||
|
|
Loading…
Reference in a new issue