diff --git a/lbry/wallet/header.py b/lbry/wallet/header.py index 0daf49cc1..2fa066cdf 100644 --- a/lbry/wallet/header.py +++ b/lbry/wallet/header.py @@ -311,12 +311,15 @@ class Headers: headers = headers[:(len(headers) // self.header_size) * self.header_size] for header_hash, header in self._iterate_headers(height, headers): height = header['block_height'] - if height: + if previous_header_hash: if header['prev_block_hash'] != previous_header_hash: fail = True - else: + elif height == 0: if header_hash != self.genesis_hash: fail = True + else: + # for sanity and clarity, since it is the only way we can end up here + assert start_height > 0 and height == start_height if fail: log.warning("Header file corrupted at height %s, truncating it.", height - 1) def __truncate(at_height): diff --git a/tests/unit/wallet/test_headers.py b/tests/unit/wallet/test_headers.py index 425d825e3..5ebb333c3 100644 --- a/tests/unit/wallet/test_headers.py +++ b/tests/unit/wallet/test_headers.py @@ -143,6 +143,9 @@ class TestHeaders(AsyncioTestCase): self.assertEqual(7, headers.height) await headers.connect(len(headers), HEADERS[block_bytes(8):]) self.assertEqual(19, headers.height) + # verify from middle + await headers.repair(start_height=10) + self.assertEqual(19, headers.height) async def test_misalignment_triggers_repair_on_open(self): headers = Headers(':memory:')